纱线:如何利用完整的群集资源?

时间:2016-06-13 13:42:00

标签: hadoop yarn cloudera

所以我有一个带有7个工作节点的cloudera集群。

  • 30GB RAM
  • 4个vCPU

以下是我在调整群集性能时发现的一些重要配置(来自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。

其他方式是增加容器的数量,我不知道如何。

  • 4核x 7个节点= 28个可能的容器。 3正在被其他进程使用,目前只有5个可用于sqoop作业。

在这种情况下,什么是正确的配置以提高群集性能。我可以增加容器的数量,比如说每个核心2个容器。是推荐吗?

对群集配置的任何帮助或建议都将受到高度赞赏。感谢。

1 个答案:

答案 0 :(得分:2)

如果您的输入数据是26个分割,YARN将创建26个映射器以并行处理这些分割。

如果有7个节点,2个映射器用于26个分割,则重新分区应该是这样的:

  • Node1:4 mappers => 8 GB
  • Node2:4 mappers => 8 GB
  • Node3:4 mappers => 8 GB
  • Node4:4 mappers => 8 GB
  • Node5:4 mappers => 8 GB
  • Node6:3 mappers => 6 GB
  • Node7:3 mappers => 6 GB
  • 总计:26位地图=> 52 GB

因此,如果所有映射器同时运行,则映射中使用的总内存将减少作业将为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.它只是一个任意值,它应该使映射器的数量加倍。