如何建议在Hadoop集群中更均衡地分配容器



如何更改/建议在Hadoop中为任务分配不同的容器?关于AWS上的本地Hadoop(2.9.1)集群。

我正在AWS上运行一个本地Hadoop集群(2.9.1)(带有EC2,而不是EMR),我希望容器(Mappers/Reducers)的调度/分配比目前更平衡。RM似乎是以Bin-Backing的方式(数据所在的位置)分配映射器,而对于减速器来说,它似乎更平衡。我的设置包括三台复制率为三的机器(所有数据都在每台机器上),我用mapreduce.jobreduce.slowstart.completedmaps=0运行我的作业,以便尽可能快地开始混洗(对我来说,所有容器同时进行很重要,这是必须的条件)。此外,根据我选择的EC2实例和我对YARN集群的设置,我最多可以运行93个容器(每个容器31个)。

例如,如果我想要9个减速器,那么(93-9-1=83)83个容器可以留给映射器,一个用于AM。我已经使用了拆分输入的大小(mapreduce.input.fileinputformat.split.minsize,mapreduce.ninput.fileinputform.split.maxsize),以便找到正确的平衡,即所有机器在映射阶段都有相同的"工作"。但似乎前31个映射器将被分配在一台机器中,下一个31个分配给第二个,最后31个分配到最后一台机器。因此,我可以尝试使用87个映射器,其中31个映射器在机器#1中,另31个在机器#2中,另25个在机器#3中,其余的留给减速器,当机器#1和机器#2被完全占用时,减速器将不得不放置在机器#3。通过这种方式,我以不平衡的减速器分配为代价,获得了映射器的几乎平衡的分配。这不是我想要的。。。

# of mappers = size_input / split size [Bytes],

split size= max(mapreduce.input.fileinputformat.split.minsize, min(mapreduce.input.fileinputformat.split.maxsize, dfs.blocksize))

我使用默认的调度器(Capacity),默认情况下yarn.scheduler.capacity.per-node-heartbeat.maximum-container-assignments设置为-1(无穷大),这解释了为什么每个首先响应RM(带有心跳)的节点都是";包装";容器尽可能多。总之,在hadoop/etc/hadoop/caccepty-scheduler.xml中插入上述参数(使用三分之一的映射器数量将导致映射器的平衡调度),并在重新启动RM后遵循yarn rmadmin -refreshQueues,将授予您在YARN中平衡容器分配的选项。

有关更多详细信息,请在此处搜索我的讨论。

最新更新