如果分配更多内核,单个 Spark 任务会在计算上消耗更多时间
Posted
技术标签:
【中文标题】如果分配更多内核,单个 Spark 任务会在计算上消耗更多时间【英文标题】:Individual Spark Task consume more time on computation if more cores are assigned 【发布时间】:2016-03-17 10:45:54 【问题描述】:我正在运行一个输入文件大小为 6.6G (hdfs) 的 spark 作业,master 为本地。当我分配 local[6] 而不是 local[2] 时,我的具有 53 个分区的 Spark 作业很快完成,但是当核心数量更多时,单个任务需要更多的计算时间。假设我分配了 1 个核心(本地 [1]),那么每个任务需要 3 秒,如果我分配 6 个核心(本地 [6]),则相同的时间长达 12 秒。时间浪费在哪里? spark UI 显示在本地 [6] 案例中每个任务的计算时间增加,我无法理解为什么相同的代码在分配更多内核时需要不同的计算时间。
更新:
如果我使用 local[6] 而不是 local[1],我可以在 iostat 输出中看到更多的 %iowait。请让我知道这是唯一的原因或任何可能的原因。我想知道为什么 sparkUI 中没有报告这个 iowait。我看到计算时间比 iowait 时间增加。
【问题讨论】:
您的机器上实际有多少个内核可用? 系统有8个核心。 【参考方案1】:我假设您指的是spark.task.cpus
而不是spark.cores.max
spark.tasks.cpus
为每个任务分配了更多的内核,但不一定非得使用它们。如果你的进程是单线程的,它真的不能使用它们。您最终会产生额外的开销而没有额外的好处,并且这些内核会从其他可以使用它们的单线程任务中移除。
对于spark.cores.max
,同时传输数据是一个简单的开销问题。
【讨论】:
我正在使用带有 --master local[6]/local[1] 的 spark-submit。 Per spark doc local[K] 使用 K 个工作线程在本地运行 Spark(理想情况下,将其设置为您机器上的内核数)。以上是关于如果分配更多内核,单个 Spark 任务会在计算上消耗更多时间的主要内容,如果未能解决你的问题,请参考以下文章