我想提出一个关于Spark的非常愚蠢的问题,因为我想清除我的困惑。我在Spark中非常新,并且仍然试图理解它是如何在内部工作的。
说,如果我有一个输入文件列表(假设为1000)我想要处理或写入某处,我想使用coalesce将我的分区号减少到100.
现在我使用12个执行程序运行此作业,每个执行程序有5个核心,这意味着运行时有60个任务。这是否意味着,每个任务将独立地在一个单独的分区上工作?
回合:1 12个执行者,每个执行者有5个核心=> 60个任务流程60 分区
回合:2 8个执行者,每个执行者有5个核心=> 40个任务处理剩余的40个分区,4个执行器永远不会放置 第二次工作
或者来自同一执行程序的所有任务都可以在同一个分区上运行?
回合:1:12执行者=>进程12分区
回合:2:12 executors =>进程12分区
回合:3:12执行者=> 进程12分区
....
....
....
回合:9(96个分区 已处理):4位执行者=>处理剩下的4个 分区
答案 0 :(得分:4)
说,如果我有一个输入文件列表(假设为1000)我想要处理或写入某处,我想使用coalesce将我的分区号减少到100.
默认情况下,在number of partitions
= hdfs blocks
的情况下,指定为coalesce(100)
时,Spark会将输入数据划分为100个分区。
现在我使用12个执行程序运行此作业,每个执行程序有5个核心,这意味着运行时有60个任务。这是否意味着,每个任务将独立地在一个单独的分区上工作?
当你通过时可能会被传递
--num-executors 12
:在应用程序中启动的执行程序数。
--executor-cores 5
:每个执行者的核心数。 1核心= 1个任务一次
所以分区的执行就像这样
<强> 注:的强> 通常,某些执行程序可能会快速完成分配的工作(各种参数,如data locality,网络I / O,CPU等)。因此,它将通过等待配置的调度时间来选择要处理的下一个分区。