apache-spark - Spark on YARN 资源管理器 : Relation between YARN Containers and Spark Executors

标签 apache-spark containers yarn hortonworks-data-platform executor

我是 YARN 上的 Spark 新手,不了解 YARN 之间的关系 Containers和 Spark Executors .我根据yarn-utils.py的结果尝试了以下配置脚本,可用于查找最佳集群配置。

我正在处理的 Hadoop 集群 (HDP 2.4):

  • 1个主节点:
  • CPU:2 个 CPU,每个 6 核 = 12 核
  • 内存:64 GB
  • 固态硬盘:2 x 512 GB
  • 5个从节点:
  • CPU:2 个 CPU,每个 6 核 = 12 核
  • 内存:64 GB
  • 硬盘:4 x 3 TB = 12 TB
  • HBase 已安装(这是下面脚本的参数之一)

  • 所以我跑了python yarn-utils.py -c 12 -m 64 -d 4 -k True (c=cores, m=memory, d=hdds, k=hbase-installed) 得到如下结果:
     Using cores=12 memory=64GB disks=4 hbase=True
     Profile: cores=12 memory=49152MB reserved=16GB usableMem=48GB disks=4
     Num Container=8
     Container Ram=6144MB
     Used Ram=48GB
     Unused Ram=16GB
     yarn.scheduler.minimum-allocation-mb=6144
     yarn.scheduler.maximum-allocation-mb=49152
     yarn.nodemanager.resource.memory-mb=49152
     mapreduce.map.memory.mb=6144
     mapreduce.map.java.opts=-Xmx4915m
     mapreduce.reduce.memory.mb=6144
     mapreduce.reduce.java.opts=-Xmx4915m
     yarn.app.mapreduce.am.resource.mb=6144
     yarn.app.mapreduce.am.command-opts=-Xmx4915m
     mapreduce.task.io.sort.mb=2457
    

    我通过 Ambari 界面进行了这些设置并重新启动了集群。这些值也大致匹配我之前手动计算的值。

    我现在有问题
  • 为我的 spark-submit 找到最佳设置脚本
  • 参数 --num-executors , --executor-cores & --executor-memory .
  • 获取 YARN 容器和 Spark 执行器之间的关系
  • 了解我的 Spark History UI 中的硬件信息(我设置的显示更少的内存(当通过与工作节点数量相乘计算到总内存时))
  • 理解vcores的概念在 YARN 中,我在这里还找不到任何有用的示例

  • 然而,我发现了这篇文章What is a container in YARN? ,但这并没有真正帮助,因为它没有描述与执行者的关系。

    有人可以帮助解决一个或多个问题吗?

    最佳答案

    我将在这里一步一步地报告我的见解:

  • 首先重要的是这个事实(来源:this Cloudera documentation):

    When running Spark on YARN, each Spark executor runs as a YARN container. [...]


  • 这意味着容器的数量将始终与 Spark 应用程序创建的执行程序相同,例如通过 --num-executors spark-submit 中的参数。
  • yarn.scheduler.minimum-allocation-mb 设置每个容器总是至少分配这个数量的内存。这意味着如果参数 --executor-memory设置为例如只有1g但是 yarn.scheduler.minimum-allocation-mb是例如6g ,容器比 Spark 应用程序所需的要大得多。
  • 反过来,如果参数 --executor-memory设置为高于 yarn.scheduler.minimum-allocation-mb值,例如12g , Container 会动态分配更多的内存,但是 只有如果请求的内存量小于或等于 yarn.scheduler.maximum-allocation-mb值(value)。
  • yarn.nodemanager.resource.memory-mb的值确定,可以通过 总共分配多少内存一台主机的所有容器 !

  • => 所以设置yarn.scheduler.minimum-allocation-mb允许您运行较小的容器,例如对于较小的执行程序( 否则会浪费内存 )。
    => 设置 yarn.scheduler.maximum-allocation-mb到最大值(例如等于 yarn.nodemanager.resource.memory-mb )允许您定义更大的执行程序(如果需要,可以分配更多内存,例如通过 --executor-memory 参数)。

    关于apache-spark - Spark on YARN 资源管理器 : Relation between YARN Containers and Spark Executors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38331502/

    相关文章:

    docker - Bluemix 容器状态读取 'Networking'

    hadoop - 为什么我的Yarn的内存(12 GB)比主机(32)GB少

    apache-spark - 从 Titan(在 HBase 上)读取大图到 Spark

    hadoop - 如何更改 pyspark 中的 hdfs block 大小?

    c++ - 我应该使用哪个 STL 容器? C++

    java - 以最少的运行时间存储带递归的斐波那契数列的值

    hadoop - YARN最小用户限制百分比不起作用?

    scala - Spark Job通过运行相同的映射3次而不断失败

    java - Spark 中 HashMap 的 Kryo 反序列化失败

    python - Pyspark java.lang.OutOfMemoryError : Requested array size exceeds VM limit 错误