YARN资源管理器上的Spark:YARN容器和Spark执行器之间的关系

D. *_*ler 14 containers executor hadoop-yarn hortonworks-data-platform apache-spark

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

Hadoop集群(HDP 2.4)我正在研究:

  • 1主节点:
    • CPU:2个CPU,每个6个核心= 12个核心
    • RAM:64 GB
    • SSD:2 x 512 GB
  • 5个从节点:
    • CPU:2个CPU,每个6个核心= 12个核心
    • RAM:64 GB
    • HDD:4 x 3 TB = 12 TB
  • 安装了HBase(这是下面脚本的参数之一)

所以我跑了python yarn-utils.py -c 12 -m 64 -d 4 -k True(c =核心,m =内存,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
Run Code Online (Sandbox Code Playgroud)

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

我现在有问题

  • 找到我的spark-submit脚本 的最佳设置
    • 参数--num-executors,--executor-cores&--executor-memory.
  • 获取YARN容器和Spark执行程序之间的关系
  • 了解我的Spark历史UI中的硬件信息(我设置的内存更少(通过乘以工作节点数量计算到总内存))
  • 为了理解vcoresYARN中的概念,我在这里找不到任何有用的例子

但是,我发现这篇文章什么是YARN中的容器?,但这并没有真正帮助,因为它没有描述与执行者的关系.

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

D. *_*ler 24

我会一步一步地报告我的见解:

  • 首要的是这个事实(来源:这个Cloudera文档):

    在YARN上运行Spark时,每个Spark执行程序都作为YARN容器运行.[...]

  • 这意味着容器的数量将始终与Spark应用程序创建的执行程序相同,例如通过--num-executorsspark-submit中的参数.

  • 由yarn.scheduler.minimum-allocation-mb每个容器设置总是分配至少这个内存量.这意味着如果参数--executor-memory仅设置为例如1g但是yarn.scheduler.minimum-allocation-mb例如6g,容器比Spark应用程序所需的大得多.

  • 反过来说,如果参数--executor-memory设置为高于yarn.scheduler.minimum-allocation-mb值的somthing ,例如12g,Container将动态分配更多内存,但仅限于请求的内存量小于或等于yarn.scheduler.maximum-allocation-mbvalue.

  • yarn.nodemanager.resource.memory-mb确定的值,一个主机的所有容器可以分配多少内存!

=>因此,设置yarn.scheduler.minimum-allocation-mb允许您运行较小的容器,例如较小的执行程序(否则会浪费内存).

=>设置yarn.scheduler.maximum-allocation-mb为最大值(例如等于yarn.nodemanager.resource.memory-mb)允许您定义更大的执行程序(如果需要,可以分配更多内存,例如通过--executor-memory参数).

  • 我们是否必须在每个集群节点上设置/更改 `yarn.nodemanager.resource.memory-mb`? (2认同)