当前位置: 首页 > 知识库问答 >
问题:

Spark内存/工作线程问题

淳于博文
2023-03-14

5个节点各有4个内核和32GB内存,其中一个节点(节点4)有8个内核和32GB内存。

所以我总共有6个节点-28个核,192GB RAM。(我想使用一半的内存,但要使用所有的内核)

计划在集群上运行5个spark应用程序

我的spark\u默认值。配置如下:

spark.master                     spark://***:7077
spark.eventLog.enabled           false
spark.driver.memory              2g
worker_max_heapsize              2g
spark.kryoserializer.buffer.max.mb      128
spark.shuffle.file.buffer.kb    1024
spark.cores.max                 4
spark.dynamicAllocation.enabled true

我想在每个节点上使用16GB max,并通过设置以下配置在每台机器上运行4个工作实例。所以,我希望(4个实例*6个节点=24个)集群上的工作人员。他们总共将使用多达28个内核(全部)和96GB内存。

我的spark-env.sh如下。

export SPARK_WORKER_MEMORY=16g
export SPARK_WORKER_INSTANCES=4
SPARK_LOCAL_DIRS=/app/spark/spark-1.6.1-bin-hadoop2.6/local
SPARK_WORKER_DIR=/app/spark/spark-1.6.1-bin-hadoop2.6/work

但我的火花束已经启动了

火花UI正在显示运行的工人...

Worker Id ? Address State   Cores   Memory
worker-node4-address    ALIVE   8 (1 Used)  16.0 GB (0.0 GB Used)
worker-node4-address    ALIVE   8 (1 Used)  16.0 GB (0.0 GB Used)
worker-node4-address    ALIVE   8 (1 Used)  16.0 GB (0.0 GB Used)
worker-node4-address    ALIVE   8 (0 Used)  16.0 GB (0.0 B Used)
worker-node4-address    ALIVE   8 (1 Used)  16.0 GB (0.0 GB Used)
worker-node1-address    ALIVE   4 (0 Used)  16.0 GB (0.0 B Used)
worker-node1-address    ALIVE   4 (0 Used)  16.0 GB (0.0 B Used)
worker-node1-address    ALIVE   4 (0 Used)  16.0 GB (0.0 B Used)
worker-node1-address    ALIVE   4 (0 Used)  16.0 GB (0.0 B Used)

worker-node2-address    ALIVE   4 (0 Used)  16.0 GB (0.0 B Used)
worker-node2-address    ALIVE   4 (0 Used)  16.0 GB (0.0 B Used)
worker-node2-address    ALIVE   4 (0 Used)  16.0 GB (0.0 B Used)
worker-node2-address    ALIVE   4 (0 Used)  16.0 GB (0.0 B Used)

worker-node3-address    ALIVE   4 (0 Used)  16.0 GB (0.0 B Used)
worker-node3-address    ALIVE   4 (0 Used)  16.0 GB (0.0 B Used)
worker-node3-address    ALIVE   4 (0 Used)  16.0 GB (0.0 B Used)
worker-node3-address    ALIVE   4 (0 Used)  16.0 GB (0.0 B Used)

worker-node5-address    ALIVE   4 (0 Used)  16.0 GB (0.0 B Used)
worker-node5-address    ALIVE   4 (0 Used)  16.0 GB (0.0 B Used)
worker-node5-address    ALIVE   4 (0 Used)  16.0 GB (0.0 B Used)
worker-node5-address    ALIVE   4 (0 Used)  16.0 GB (0.0 B Used)

worker-node6-address    ALIVE   4 (0 Used)  16.0 GB (0.0 B Used)
worker-node6-address    ALIVE   4 (3 Used)  16.0 GB (0.0 GB Used)
worker-node6-address    ALIVE   4 (0 Used)  16.0 GB (0.0 B Used)
worker-node6-address    ALIVE   4 (0 Used)  16.0 GB (0.0 B Used)

但主UI显示(当没有应用程序运行时)活动的工作线程:使用中的25个内核:总共120个,使用中的0个内存:总共400.0 GB,使用中的0 GB状态:活动

当我期待24个工人(每个节点4个),为什么有25个?-1是额外的节点4有8个核心。

当我为每个节点分配了16GB的最大使用容量时,为什么会显示正在使用的内存:总共400.0 GB?

UI数据显示我有120个核心,而我的集群上有28个核心?

你能告诉我我的系统应该有什么样的spark配置吗。?

当我提交火花作业时,我应该指定多少核心执行器内存?

spark.cores.max参数是什么?是每个节点还是整个集群?

我运行了3个应用程序,其中spart提交配置为--executor memory 2G--total executor cores 4至少我的一个应用程序出现以下错误和失败。

Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
        at java.lang.Thread.start0(Native Method)
        at java.lang.Thread.start(Thread.java:714)
        at scala.concurrent.forkjoin.ForkJoinPool.tryAddWorker(ForkJoinPool.java:1672)
        at scala.concurrent.forkjoin.ForkJoinPool.signalWork(ForkJoinPool.java:1966)
        at scala.concurrent.forkjoin.ForkJoinPool.fullExternalPush(ForkJoinPool.java:1905)
        at scala.concurrent.forkjoin.ForkJoinPool.externalPush(ForkJoinPool.java:1834)
        at scala.concurrent.forkjoin.ForkJoinPool.execute(ForkJoinPool.java:2955)
        at scala.concurrent.impl.ExecutionContextImpl.execute(ExecutionContextImpl.scala:120)
        at scala.concurrent.impl.Future$.apply(Future.scala:31)
        at scala.concurrent.Future$.apply(Future.scala:485)
        at org.apache.spark.deploy.rest.RestSubmissionClient.readResponse(RestSubmissionClient.scala:232)
        at org.apache.spark.deploy.rest.RestSubmissionClient.org$apache$spark$deploy$rest$RestSubmissionClient$$postJson(RestSubmissionClient.scala:222)
        at org.apache.spark.deploy.rest.RestSubmissionClient$$anonfun$createSubmission$3.apply(RestSubmissionClient.scala:87)
        at org.apache.spark.deploy.rest.RestSubmissionClient$$anonfun$createSubmission$3.apply(RestSubmissionClient.scala:83)
        at scala.collection.TraversableLike$WithFilter$$anonfun$foreach$1.apply(TraversableLike.scala:772)
        at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
        at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:108)
        at scala.collection.TraversableLike$WithFilter.foreach(TraversableLike.scala:771)
        at org.apache.spark.deploy.rest.RestSubmissionClient.createSubmission(RestSubmissionClient.scala:83)
        at org.apache.spark.deploy.rest.RestSubmissionClient$.run(RestSubmissionClient.scala:411)
        at org.apache.spark.deploy.rest.RestSubmissionClient$.main(RestSubmissionClient.scala:424)
        at org.apache.spark.deploy.rest.RestSubmissionClient.main(RestSubmissionClient.scala)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:731)
        at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:181)
        at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:195)
        at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:121)
        at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

共有1个答案

苗信鸥
2023-03-14

据我所知,每个节点应该只启动一个Worker:

http://spark.apache.org/docs/latest/hardware-provisioning.html

仅当每个节点的Ram超过200 GB时。但每个节点没有200 GB Ram。你能在spark env中设置这个吗。只有4个核的节点上的sh?

export SPARK_EXECUTOR_CORES=4
export SPARK_EXECUTOR_MEMORY=16GB
export SPARK_MASTER_HOST=<Your Master-Ip here>

在这个有8个核的节点上:

export SPARK_EXECUTOR_CORES=8
export SPARK_EXECUTOR_MEMORY=16GB
export SPARK_MASTER_HOST=<Your Master-Ip here>

这是spark中主节点的默认值。形态:

spark.driver.memory              2g

我想你应该试试这个,并把其他的Konfigurations注释掉,以便测试。这就是你想要的吗?您的群集现在应该总共使用96 GB和28核。然后,您可以启动应用程序,而无需执行器内存2G,执行器内核总数为4。而是java。lang.OutOfMemoryError(lang.OutOfMemoryError)可以在没有错误配置的情况下发生。当你向司机收取太多的费用时,也会发生这种情况。

是的,每个Worker在当前配置中都有16 GB Ram。然后,25个工作线程*16 GB=总共400 GB。

 类似资料:
  • 我正在运行logisticregression管道,并且在这一行上: 我在RDDLossFunction阶段反复得到以下错误: 我正在一个独立的集群上运行,3个工人,加起来有140GB,一个主服务器有15GB。

  • 1)谁能解释一下为什么显示的是31GB而不是60GB。2)还有助于为上述参数设置最佳值。

  • 我知道Spark可以使用Scala、Python和Java来操作。另外,RDDs用于存储数据。 但是请解释一下,Spark的架构是什么,内部是如何工作的。

  • 有人能帮帮我吗。我对Quartz调度器很陌生。

  • 我曾尝试将spark程序作为单步执行Oozie工作流。我使用了jar,它通过spark submit或spark shell(相同的代码)成功执行: 应用程序不应需要大量资源—加载单个csv( 火花版本:1.6.0 Oozie版本:4.1.0 工作流是使用Hue、Oozie工作流编辑器创建的: 运行工作流后,我得到以下日志: 标准输出: 立即调用Spark类 失败的Oozie启动器,Main类[o

  • 主线程通常被用于运行主循环,而主循环负责的都是 UI 相关的工作,所以也可以说主线程是 UI 线程。为了不影响 UI 线程的工作效率,我们会需要创建额外的线程来负责各种各样的工作,而这些线程就是工作线程。 在主循环的章节中,我们已经了解到主循环执行频率影响界面的流畅度,它的每一次循环都会按顺序执行处理定时器、处理事件队列、更新组件、渲染组件等任务,其中最容易影响到主循环的执行频率的任务是处理事件队