YARN 资源管理器上的 Spark:YARN 容器和 Spark 执行器之间的关系
Spark on YARN resource manager: Relation between YARN Containers and Spark Executors
我是 Spark on YARN 的新手,不了解 YARN Containers
和 Spark Executors
之间的关系。我根据 yarn-utils.py
脚本的结果尝试了以下配置,可用于查找最佳集群配置。
我正在研究的 Hadoop 集群 (HDP 2.4):
- 1个主节点:
- CPU:2 CPUs,每个 6 个内核 = 12 个内核
- 内存:64GB
- 固态硬盘:2 x 512 GB
- 5 个从节点:
- CPU:2 CPUs,每个 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 历史记录中的硬件信息 UI(我设置的内存较少(通过乘以工作节点数量计算总内存时))
- 为了理解YARN中
vcores
的概念,这里我还没找到有用的例子
然而,我发现了这个 post What is a container in YARN? ,但这并没有真正帮助,因为它没有描述与执行者的关系。
有人可以帮助解决一个或多个问题吗?
我将在这里一步步报告我的见解:
首先重要的是这个事实(来源:this Cloudera documentation):
When running Spark on YARN, each Spark executor runs as a YARN container. [...]
这意味着容器的数量将始终与 Spark 应用程序创建的执行程序相同,例如通过 spark-submit 中的 --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
,Container 将动态分配更多内存,但 仅当请求的内存量小于或等于 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
参数).
我是 Spark on YARN 的新手,不了解 YARN Containers
和 Spark Executors
之间的关系。我根据 yarn-utils.py
脚本的结果尝试了以下配置,可用于查找最佳集群配置。
我正在研究的 Hadoop 集群 (HDP 2.4):
- 1个主节点:
- CPU:2 CPUs,每个 6 个内核 = 12 个内核
- 内存:64GB
- 固态硬盘:2 x 512 GB
- 5 个从节点:
- CPU:2 CPUs,每个 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 历史记录中的硬件信息 UI(我设置的内存较少(通过乘以工作节点数量计算总内存时))
- 为了理解YARN中
vcores
的概念,这里我还没找到有用的例子
然而,我发现了这个 post What is a container in YARN? ,但这并没有真正帮助,因为它没有描述与执行者的关系。
有人可以帮助解决一个或多个问题吗?
我将在这里一步步报告我的见解:
首先重要的是这个事实(来源:this Cloudera documentation):
When running Spark on YARN, each Spark executor runs as a YARN container. [...]
这意味着容器的数量将始终与 Spark 应用程序创建的执行程序相同,例如通过 spark-submit 中的
--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
,Container 将动态分配更多内存,但 仅当请求的内存量小于或等于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
参数).