我试图了解在 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 开始。

  • hadoop - Apache Spark : The number of cores vs. 执行器数量-LMLPHP
  • (3) 的 Ganglia 数据节点摘要 - 作业于 19:47 开始。请忽略在那之前的图表。

  • hadoop - Apache Spark : The number of cores vs. 执行器数量-LMLPHP

    该图大致分为 2 个部分:
  • 第一:从开始到reduceByKey:CPU密集型,无网络事件
  • 第二次:reduceByKey后:CPU降低,网络I/O完成。

  • 如图所示,(1) 可以使用尽可能多的 CPU 功率。所以,这可能不是线程数量的问题。

    如何解释这个结果?

    最佳答案


    Cloudera 的博客 How-to: Tune Your Apache Spark Jobs (Part 2) 中的一篇文章给出了解释。

    关于hadoop - Apache Spark : The number of cores vs. 执行器数量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24622108/

    10-16 01:43