所以我有一个带有7个工作节点的cloudera集群。
以下是我在调整群集性能时发现的一些重要配置(来自Google)。我正在运行:
yarn.nodemanager.resource.cpu-vcores
=> 4 yarn.nodemanager.resource.memory-mb
=> 17GB(其余为操作系统和其他进程保留)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。
其他方式是增加容器的数量,我不知道如何。
在这种情况下,什么是正确的配置以提高群集性能。我可以增加容器的数量,比如说每个核心2个容器。是推荐吗?
对群集配置的任何帮助或建议都将受到高度赞赏。感谢。
答案 0 :(得分:2)
如果您的输入数据是26个分割,YARN将创建26个映射器以并行处理这些分割。
如果有7个节点,2个映射器用于26个分割,则重新分区应该是这样的:
因此,如果所有映射器同时运行,则映射中使用的总内存将减少作业将为26x2 = 52 GB。也许如果您通过reducer和ApplicationMaster容器添加内存用户,您可以在某个时刻达到59 GB,如您所说..
如果这是您正在目睹的行为,并且在这26个映射器之后完成了作业,则没有任何错误。您只需要大约60 GB就可以通过在所有节点上分布任务来完成工作,而无需等待容器插槽自行释放。另一个免费的60 GB只是等待,因为你不需要它们。增加堆大小只是为了使用所有内存不一定会提高性能。
<强>编辑:强>
但是,如果您仍然有很多映射器等待安排,那么可能是因为您的安装配置为使用vcores计算容器分配。这不是Apache Hadoop中的默认设置,但可以进行配置:
yarn.scheduler.capacity.resource-calculator
: ResourceCalculator实现,用于比较调度程序中的资源。默认情况下,org.apache.hadoop.yarn.util.resource.DefaultResourseCalculator仅使用Memory,而DominantResourceCalculator使用Dominant-resource来比较多维资源,如内存,CPU等。需要Java ResourceCalculator类名。
由于您将yarn.nodemanager.resource.cpu-vcores
定义为4,并且由于每个映射器默认使用1个vcore,因此每个节点一次只能运行4个映射器。
在这种情况下,您可以将yarn.nodemanager.resource.cpu-vcores
的值加倍到8.它只是一个任意值,它应该使映射器的数量加倍。