【发布时间】:2014-08-28 14:45:59
【问题描述】:
我试图了解在 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) 的神经节数据节点摘要 - 作业于 04:37 开始。
- (3) 的神经节数据节点摘要 - 作业于 19:47 开始。请忽略该时间之前的图表。
该图大致分为两部分:
- 首先:从开始到 reduceByKey:CPU 密集型,无网络活动
- 第二次:reduceByKey:CPU降低后,网络I/O完成。
如图所示,(1) 可以使用尽可能多的 CPU 功率。所以,可能不是线程数的问题。
如何解释这个结果?
【问题讨论】:
-
现在我怀疑 GC...事实上,在 Spark UI 上,GC 花费的总时间在 1) 上比 2) 上更长。
-
你为什么不试试 3) 19G?是否将工人限制在 4G 上会降低某些人的 NUMA 效应?即您的 4G 位于分配给您的工作流程的 2 个核心之一上,因此 i/o 减速更少,从而带来更好的整体性能。否则我认为一个主要问题是:有多少核心/线程可以在一个工作人员上使用一个执行器? (只能指定一个worker的总核数,不能指定executor的粒度)
-
顺便说一句,我刚刚检查了 core/src/main/scala/org/apache/spark/deploy/worker/ExecutorRunner.scala 中的代码,似乎 1 executor = 1 worker 线程。
-
有点晚了,但这里有一篇关于 cloudera 关于这个主题的帖子:blog.cloudera.com/blog/2015/03/…
-
顺便说一句,我在 cloudera slide deck slideshare.net/cloudera/… 中找到了这个信息,它解释了一些关于执行器、内核和内存的决策
标签: hadoop apache-spark hadoop-yarn