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

如何调整火花执行器数量,核心和执行器内存?

易研
2023-03-14

您从哪里开始调优上面提到的params。我们是从执行器内存开始,得到执行器的数目,还是从核心开始,得到执行器的数目。我跟踪了链接。然而得到了一个高水平的想法,但仍然不确定如何或从哪里开始并得出最终结论。

共有1个答案

姜松
2023-03-14

下面的答案涵盖了标题中提到的3个主要方面--执行器的数量、执行器内存和核心的数量。可能还有其他参数,如驱动程序内存和其他我没有解决这个答案,但希望在不久的将来添加。

情况1硬件-6个节点,每个节点16个核心,64 GB RAM

每个执行器都是一个JVM实例。所以我们可以在一个节点中有多个执行器

Number of cores = Concurrent tasks as executor can run 

So we might think, more concurrent tasks for each executor will give better performance. But research shows that
any application with more than 5 concurrent tasks, would lead to bad show. So stick this to 5.

This number came from the ability of executor and not from how many cores a system has. So the number 5 stays same
even if you have double(32) cores in the CPU.
Coming back to next step, with 5 as cores per executor, and 15 as total available cores in one Node(CPU) - we come to 
3 executors per node.

So with 6 nodes, and 3 executors per node - we get 18 executors. Out of 18 we need 1 executor (java process) for AM in YARN we get 17 executors

This 17 is the number we give to spark using --num-executors while running from spark-submit shell command
From above step, we have 3 executors  per node. And available RAM is 63 GB

So memory for each executor is 63/3 = 21GB. 

However small overhead memory is also needed to determine the full memory request to YARN for each executor.
Formula for that over head is max(384, .07 * spark.executor.memory)

Calculating that overhead - .07 * 21 (Here 21 is calculated as above 63/3)
                            = 1.47

Since 1.47 GB > 384 MB, the over head is 1.47.
Take the above from each 21 above => 21 - 1.47 ~ 19 GB

So executor memory - 19 GB

硬件:相同的6个节点,32个核心,64 GB

5同样适用于良好的并发性

每个节点的执行器数=32/5~6

每个节点的执行器的核心数为5#=3

在这个阶段,这将导致21,然后根据我们的第一次计算19。但是由于我们认为10个就可以了(假设开销很小),所以我们不能将每个节点的执行器数切换到6个(比如63/10)。在每个节点6个执行器和5个核心的情况下,当我们只有16个核心时,它可以减少到每个节点30个核心。因此,我们还需要改变每个执行器的核心数。

所以再计算一下,

注意:如果启用了动态分配,则执行器数量的上限。也就是说,如果需要的话,spark应用程序可以消耗掉所有的资源。因此,在有其他应用程序正在运行的集群中,它们也需要内核来运行任务,请确保在集群级别执行。我的意思是你可以根据用户的访问权限为纱线分配特定数量的芯。因此,您可以创建spark_user maybe,然后为该用户指定核心(最小/最大)。这些限制是为了在spark和其他运行在纱线上的应用程序之间共享。

enabled-当它被设置为true时-我们不需要提到执行器。原因如下:

我们在spark-submit中给出的静态params数是整个作业持续时间的。然而,如果动态分配进入画面,将会有不同的阶段,如

然后根据负载(任务挂起)请求多少。这最终将是我们在Spark上给出的数字--以静态方式提交。因此,一旦设置了初始的执行器编号,我们将转到min(spark.dynamicallocation.minexecutors)和max(spark.dynamicallocation.maxexecutors)编号。

何时要求或给予:

我们什么时候请求新的执行器(spark.dynamicallocation.SchedulerBacklogTimeout)--在这么长的时间内有挂起的任务。所以请求。每一轮请求的执行者数量与上一轮相比呈指数增长。例如,一个应用程序将在第一轮中添加1个执行人,然后在随后的几轮中添加2、4、8个执行人。在一个特定的点上,上面的max出现了

  • http://site.clairvoyantsoft.com/reditablement-resource-allocation-configurations-spark-application/
  • http://spark.apache.org/docs/latest/configuration.html#dynamic-allocation
  • http://spark.apache.org/docs/latest/job-scheduling.html#resource-allocation-policy
 类似资料:
  • 我提出了一个关于Spark的非常愚蠢的问题,因为我想澄清我的困惑。我对Spark非常陌生,仍在努力理解它在内部是如何工作的。 比方说,如果我有一个输入文件列表(假设1000),我想在某个地方处理或写入,并且我想使用coalesce将我的分区数减少到100。 现在我用12个执行器运行这个作业,每个执行器有5个内核,这意味着它运行时有60个任务。这是否意味着,每个任务将在一个单独的分区上独立工作? 回

  • 需要进行一些运行时澄清。 在我读到的其他地方的一个线程中,有人说Spark Executor应该只分配一个核心。然而,我想知道这是否真的永远是真的。阅读各种so问题和诸如此类的问题,以及Karau、Wendell等人的著作,可以清楚地看到,有相同或相反的专家指出,在某些情况下,每个执行者应该指定更多的内核,但讨论往往更多的是技术性的,而不是功能性的。也就是说,缺少功能性的例子。 > 我的理解是RD

  • 我不明白的是,当我提交作业并指定: 应该只占用4个核心。然而,当提交作业时,它将使用所有16个内核,并跳过参数而旋转8个执行器。但是,如果我将参数更改为,它将相应地调整,4个executors将向上旋转。

  • 我有一个Spark集群运行在hdfs之上的纱线模式。我启动了一个带有2个内核和2G内存的worker。然后我提交了一个具有3个核心的1个执行器动态配置的作业。不过,我的工作还能运转。有人能解释启动worker的内核数量和为执行者请求的内核数量之间的差异吗。我的理解是,由于执行者在工人内部运行,他们无法获得比工人可用的资源更多的资源。

  • 我是Spark的初学者,我正在运行我的应用程序,从文本文件中读取14KB的数据,执行一些转换和操作(收集、收集AsMap),并将数据保存到数据库 我在我的macbook上本地运行它,内存为16G,有8个逻辑核。 Java最大堆设置为12G。 这是我用来运行应用程序的命令。 bin/spark-submit-class com . myapp . application-master local[*

  • Apache Spark:核心数与执行器数 由于每个案例都不一样,我又问了一个类似的问题。 我正在运行一个cpu密集型的应用程序,具有相同数量的核心和不同的执行器。以下是观察结果。 更新 案例3:执行器-12个,每个执行器的核心数-1个,执行器内存-3个,数据处理量-10 GB,分区-36个,作业持续时间:81分钟