我试图了解在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 - > filter - > map - > filter - > mapToPair - > reduceByKey - > map - > 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),但核心数量不是关键因素,因为2)确实表现良好.
(在pwilmot回答之后添加了以下内容.)
有关信息,性能监视器屏幕截图如下:
(1)的Ganglia数据节点摘要 - 作业于04:37开始.
(3)的Ganglia数据节点摘要 - 工作于19:47开始.请在此之前忽略图表.
该图大致分为两部分:
第一:从开始到reduceByKey:CPU密集型,没有网络活动
第二:在reduceByKey之后:CPU降低,网络I/O完成.
如图所示,(1)可以使用尽可能多的CPU功率.因此,它可能不是线程数量的问题.
如何解释这个结果?