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

问题描述 投票:0回答:2

我是 Spark on YARN 的新手,不了解 YARN

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

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

  • 1 主节点:
    • CPU:2 个 CPU,每个 6 个内核 = 12 个内核
    • 内存:64GB
    • 固态硬盘:2 个 512 GB
  • 5 个从节点:
    • CPU:2 个 CPU,每个 6 个内核 = 12 个内核
    • 内存:64GB
    • 硬盘: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 中的硬件信息(我设置的显示内存较少(通过乘以工作节点数量计算总内存时))
  • 了解YARN中
    vcores
    的概念,这里我找不到任何有用的例子

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

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

apache-spark containers hadoop-yarn hortonworks-data-platform executor
2个回答
38
投票

我会一步步在这里汇报我的感悟:

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

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

  • 这意味着容器的数量将始终与 Spark 应用程序创建的执行程序相同,例如通过火花提交中的

    --num-executors
    参数。

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

  • 相反,如果参数

    --executor-memory
    设置为高于
    yarn.scheduler.minimum-allocation-mb
    值的值,例如
    12g
    ,容器将动态分配更多内存,但如果请求的内存量小于或等于
    yarn.scheduler.maximum-allocation-mb
    值。

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

=> 所以设置

yarn.scheduler.minimum-allocation-mb
允许你运行更小的容器,例如对于较小的执行者(否则会浪费内存)。

=>

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


0
投票

在 YARN 上运行 Spark 时,每个 Spark 执行器都作为一个 YARN 容器运行。 MapReduce 调度一个容器并为每个任务启动一个 JVM,而 Spark 在同一个容器中托管多个任务。这种方法可以使任务启动时间加快几个数量级。

在 YARN 中,每个应用程序实例都有一个 ApplicationMaster 进程,这是为该应用程序启动的第一个容器。 enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.