我试图了解在YARN上运行Spark作业时内核数与执行程序数之间的关系。
测试环境如下:
- 数据节点数:3
- 数据节点机器规格:
- CPU:Core i7-4790(内核数:4,线程数:8)
- 内存:32GB(8GB x 4)
- 硬盘:8TB(2TB x 4)
网络:1Gb
Spark版本:1.0.0
Hadoop版本:2.4.0(Hortonworks HDP 2.1)
Spark作业流程:sc.textFile->过滤器->映射->过滤器-> mapToPair-> reduceByKey->映射-> saveAsTextFile
输入数据
- 类型:单个文本文件
- 大小:165GB
- 线数:454,568,833
输出量
- 第二个过滤器之后的行数:310,640,717
- 结果文件的行数:99,848,268
- 结果文件的大小:41GB
该作业使用以下配置运行:
--master yarn-client --executor-memory 19G --executor-cores 7 --num-executors 3
(每个数据节点的执行程序,使用的内核数最多)--master yarn-client --executor-memory 19G --executor-cores 4 --num-executors 3
(减少的内核数)--master yarn-client --executor-memory 4G --executor-cores 2 --num-executors 12
(更少的核心,更多的执行者)
经过时间:
50分15秒
55分48秒
31分23秒
令我惊讶的是,(3)快得多。
我认为(1)会更快,因为在改组时执行者之间的交流会更少。
尽管(1)的核心数少于(3),但是#of的核心数不是关键因素,因为2)表现良好。
(在pwilmot的回答之后添加了以下内容。)
有关此信息,性能监视器的屏幕截图如下:
- (1)的Ganglia数据节点摘要-作业始于04:37。
- (3)的Ganglia数据节点摘要-作业始于19:47。在此之前,请忽略该图。
该图大致分为2个部分:
- 第一:从头到尾还原ByKey:CPU密集型,无网络活动
- 第二:reduceByKey:CPU降低之后,网络I / O完成。
如图所示,(1)可以使用给定的CPU能力。因此,这可能不是线程数的问题。
如何解释这个结果?