pyspark 为什么我不能总是在spark中使用动态分配?

xtupzzrd  于 2023-02-03  发布在  Spark
关注(0)|答案(1)|浏览(214)

Spark的动态分配功能可以更有效地利用资源,具体介绍如下:https://spark.apache.org/docs/latest/job-scheduling.html#dynamic-resource-allocation
它不是默认值,必须为每个作业设置。
默认情况下将每个作业设置为使用动态分配有哪些缺点?如果为所有正在运行的作业更改此设置,可能会看到哪些效果?

ccrfmcuu

ccrfmcuu1#

要理解它,让我们看一下文档
在这里你可以找到这个:
Spark。动态分配。启用假(默认)
是否使用动态资源分配,动态资源分配可根据工作负荷增减向此应用程序注册的执行器数。有关详细信息,请参阅此处的说明。
这需要设置spark.shuffle.service.enabled或spark.dynamicAllocation.shuffleTracking.enabled。以下配置也是相关的:Spark.动态分配.最小执行者、Spark.动态分配.最大执行者和Spark.动态分配.初始执行者Spark.动态分配.执行者分配比率
相关参数的默认值为:

spark.dynamicAllocation.initialExecutors = minExecutors
spark.dynamicAllocation.minExecutors = 0
spark.dynamicAllocation.maxExecutors = infinite
spark.dynamicAllocation.executorAllocationRatio = 1

让我们看一下executorAllocationRatio说明:
默认情况下,动态分配将根据要处理的任务数请求足够的执行器以最大化并行度。虽然这可以最大限度地减少作业的延迟,但对于小任务,此设置可能会由于执行器分配开销而浪费大量资源。因为一些执行器可能根本不做任何工作。此设置允许设置一个比率,用于减少执行器的数量。完全并行度。默认值为1.0以给予最大并行度。0.5将执行程序的目标数量除以2。由dynamicAllocation计算的执行程序的目标数量仍可由spark.dynamicAllocation.minExecutors和spark.dynamicAllocation.maxExecutors设置覆盖
那么,当您打开动态分配时会发生什么呢?
假设您有一个作业,在某个阶段正在执行重新分区(2000)。每个执行器可用的内核数被设置为2。Spark将如何处理使用默认参数启用的动态分配?它将尝试获取所需数量的执行器,以获得最大并行性。在本例中,它将是2000/2(给定阶段的任务数/每个执行器的内核数,executorAllocationRatio设置为1,因此我跳过它)= 1000个执行器。
我看到过一真实的场景,其中一些作业仅因为启用了动态分配就占用大量资源来处理非常小的输入
如果你想使用它,你也应该调整其他参数,并确保限制最大执行器,特别是如果你不是一个人在你的集群,你不想浪费时间和资源.有时创建新的exeutor开销是不值得的

相关问题