我是 YARN 上的 Spark 新手,不了解 YARN 之间的关系 Containers
和 Spark Executors
.我根据yarn-utils.py
的结果尝试了以下配置脚本,可用于查找最佳集群配置。
我正在处理的 Hadoop 集群 (HDP 2.4):
所以我跑了
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
. vcores
的概念在 YARN 中,我在这里还找不到任何有用的示例 然而,我发现了这篇文章What is a container in YARN? ,但这并没有真正帮助,因为它没有描述与执行者的关系。
有人可以帮助解决一个或多个问题吗?
最佳答案
我将在这里一步一步地报告我的见解:
When running Spark on YARN, each Spark executor runs as a YARN container. [...]
--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/