Yarn:如何利用完整的集群资源?
Yarn: How to utilize full cluster resources?
所以我有一个带有 7 个工作节点的 cloudera 集群。
- 30GB 内存
- 4 个 vCPU
以下是我发现的一些配置(来自 Google)在调整集群性能方面很重要。我是 运行:
yarn.nodemanager.resource.cpu-vcores
=> 4
yarn.nodemanager.resource.memory-mb
=> 17GB(为 OS 和其他进程预留)
mapreduce.map.memory.mb
=> 2GB
mapreduce.reduce.memory.mb
=> 2GB
- 运行
nproc
=> 4(可用处理单元数)
现在我担心的是,当我查看 ResourceManager
时,我看到可用内存为 119 GB
,这很好。但是,当我 运行 一项繁重的 sqoop
工作并且我的集群处于峰值时,它仅使用 ~59 GB
内存,而未使用 ~60 GB
内存。
我看到可以解决此未使用内存问题的一种方法是将 map|reduce.memory
增加到 4 GB,这样我们每个节点最多可以使用 16 GB。
其他方法是增加容器的数量,我不确定如何。
- 4 个核心 x 7 个节点 = 28 个可能的容器。 3 个正在被其他进程使用,目前只有 5 个可用于 sqoop 作业。
在这种情况下,提高集群性能的正确配置应该是什么。我可以增加容器的数量,比如每个核心 2 个容器吗?是否推荐?
如果您对集群配置有任何帮助或建议,我们将不胜感激。谢谢。
如果您的输入数据分为 26 个拆分,YARN 将创建 26 个映射器来并行处理这些拆分。
如果您有 7 个节点和 2GB 映射器用于 26 个拆分,则重新分区应该类似于:
- 节点 1:4 个映射器 => 8 GB
- 节点 2:4 个映射器 => 8 GB
- 节点 3:4 个映射器 => 8 GB
- 节点 4:4 个映射器 => 8 GB
- 节点 5:4 个映射器 => 8 GB
- 节点 6:3 个映射器 => 6 GB
- 节点 7:3 个映射器 => 6 GB
- 总计:26 个映射器 => 52 GB
因此,如果所有映射器同时 运行ning,则 map reduce 作业中使用的总内存将为 26x2=52 GB。也许如果你通过 reducer(s) 和 ApplicationMaster 容器添加内存用户,你可以在某个时候达到你的 59 GB,正如你所说的..
如果这是您所看到的行为,并且在这 26 个映射器之后完成了作业,那么就没有错。您只需要大约 60 GB 就可以通过将任务分散到所有节点来完成您的工作,而无需等待容器槽释放自己。其他免费的 60 GB 只是等待,因为您不需要它们。增加堆大小只是为了使用所有内存不一定会提高性能。
已编辑:
但是,如果您仍然有很多映射器等待安排,那么可能是因为您的安装配置为也使用 vcores 计算容器分配。这不是 Apache Hadoop 中的默认设置,但可以配置:
yarn.scheduler.capacity.resource-calculator
:
The ResourceCalculator implementation to be used to compare Resources in the scheduler. The default i.e. org.apache.hadoop.yarn.util.resource.DefaultResourseCalculator only uses Memory while DominantResourceCalculator uses Dominant-resource to compare multi-dimensional resources such as Memory, CPU etc. A Java ResourceCalculator class name is expected.
由于您将 yarn.nodemanager.resource.cpu-vcores
定义为 4,并且每个映射器默认使用 1 个 vcore,因此每个节点一次只能 运行 4 个映射器。
在那种情况下,您可以将 yarn.nodemanager.resource.cpu-vcores
的值加倍到 8。它只是一个任意值,它应该使映射器的数量加倍。
所以我有一个带有 7 个工作节点的 cloudera 集群。
- 30GB 内存
- 4 个 vCPU
以下是我发现的一些配置(来自 Google)在调整集群性能方面很重要。我是 运行:
yarn.nodemanager.resource.cpu-vcores
=> 4yarn.nodemanager.resource.memory-mb
=> 17GB(为 OS 和其他进程预留)mapreduce.map.memory.mb
=> 2GBmapreduce.reduce.memory.mb
=> 2GB- 运行
nproc
=> 4(可用处理单元数)
现在我担心的是,当我查看 ResourceManager
时,我看到可用内存为 119 GB
,这很好。但是,当我 运行 一项繁重的 sqoop
工作并且我的集群处于峰值时,它仅使用 ~59 GB
内存,而未使用 ~60 GB
内存。
我看到可以解决此未使用内存问题的一种方法是将 map|reduce.memory
增加到 4 GB,这样我们每个节点最多可以使用 16 GB。
其他方法是增加容器的数量,我不确定如何。
- 4 个核心 x 7 个节点 = 28 个可能的容器。 3 个正在被其他进程使用,目前只有 5 个可用于 sqoop 作业。
在这种情况下,提高集群性能的正确配置应该是什么。我可以增加容器的数量,比如每个核心 2 个容器吗?是否推荐?
如果您对集群配置有任何帮助或建议,我们将不胜感激。谢谢。
如果您的输入数据分为 26 个拆分,YARN 将创建 26 个映射器来并行处理这些拆分。
如果您有 7 个节点和 2GB 映射器用于 26 个拆分,则重新分区应该类似于:
- 节点 1:4 个映射器 => 8 GB
- 节点 2:4 个映射器 => 8 GB
- 节点 3:4 个映射器 => 8 GB
- 节点 4:4 个映射器 => 8 GB
- 节点 5:4 个映射器 => 8 GB
- 节点 6:3 个映射器 => 6 GB
- 节点 7:3 个映射器 => 6 GB
- 总计:26 个映射器 => 52 GB
因此,如果所有映射器同时 运行ning,则 map reduce 作业中使用的总内存将为 26x2=52 GB。也许如果你通过 reducer(s) 和 ApplicationMaster 容器添加内存用户,你可以在某个时候达到你的 59 GB,正如你所说的..
如果这是您所看到的行为,并且在这 26 个映射器之后完成了作业,那么就没有错。您只需要大约 60 GB 就可以通过将任务分散到所有节点来完成您的工作,而无需等待容器槽释放自己。其他免费的 60 GB 只是等待,因为您不需要它们。增加堆大小只是为了使用所有内存不一定会提高性能。
已编辑:
但是,如果您仍然有很多映射器等待安排,那么可能是因为您的安装配置为也使用 vcores 计算容器分配。这不是 Apache Hadoop 中的默认设置,但可以配置:
yarn.scheduler.capacity.resource-calculator
: The ResourceCalculator implementation to be used to compare Resources in the scheduler. The default i.e. org.apache.hadoop.yarn.util.resource.DefaultResourseCalculator only uses Memory while DominantResourceCalculator uses Dominant-resource to compare multi-dimensional resources such as Memory, CPU etc. A Java ResourceCalculator class name is expected.
由于您将 yarn.nodemanager.resource.cpu-vcores
定义为 4,并且每个映射器默认使用 1 个 vcore,因此每个节点一次只能 运行 4 个映射器。
在那种情况下,您可以将 yarn.nodemanager.resource.cpu-vcores
的值加倍到 8。它只是一个任意值,它应该使映射器的数量加倍。