2016-06-13 61 views
3

所以我有一个拥有7个工作节点的cloudera集群。纱线:如何利用完整的集群资源?

  • 30GB RAM
  • 4个vCPU

下面是我的一些配置,我在我的集​​群的优化性能的重要发现(从谷歌)。我正在与运行:

  • yarn.nodemanager.resource.cpu-vcores => 4
  • yarn.nodemanager.resource.memory-mb => 17GB(REST保留用于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个核心×7个节点= 28个可能的容器。 3正在被其他进程使用,目前只有5个可用于sqoop作业。

什么应该是正确的配置,以提高群集性能在这种情况下。我可以增加容器的数量,比如说每个核心有两个容器。这是建议?

有关群集配置的任何帮助或建议将不胜感激。谢谢。

+0

你使用DefaultResourceCalculator吗?还是您配置使用DominantResourceCalculator? – Nicomak

+0

你可以发布你的'yarn-site.xml'和'mapred-site.xml'配置吗? – Nicomak

+0

我正在使用cloudera安装。找不到'yarn.nodemanager.container-monitor.resource-calculator.class'属性。如果可以的话,使用FairScheduler作为scheduler.class。我应该从'yarn-site.xml'和'mapred-site.xml'给出任何特定的配置吗? – PratPor

回答

1

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

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

  • 节点1:4名映射器=> 8 GB
  • 节点2:4名映射器=> 8 GB
  • 节点3:4映射器=> 8 GB
  • 节点4:4名映射器=> 8 GB
  • 节点5:4名映射器=> 8 GB
  • Node6:3名映射器=> 6 GB
  • Node7:3名映射器=> 6 GB
  • 共有26名映射器=> 52 GB

因此,在你的地图中使用减少的工作,如果所有的映射器在同一时间运行的总内存会是26x2 = 52 GB。也许如果你通过Reducer(s)和ApplicationMaster容器添加内存用户,你可以在某些时候达到你的59 GB,如你所说的。

如果这是你正在见证的行为,而工作是完成了这26个映射器之后,那么没有什么不对。您只需要大约60 GB就可以通过将任务分散到所有节点上来完成工作,而无需等待容器插槽释放自己。其他免费的60 GB只是在等待,因为你不需要它们。为了使用所有内存而增加堆大小不一定会提高性能。

编辑:

但是,如果你仍然有很多映射器等待调度的,那么也许它因为你安装insconfigured使用vcores以及计算容器分配。这是不是在Apache的Hadoop的默认值,但可以配置:

yarn.scheduler.capacity.resource-calculator: 的ResourceCalculator实现了将使用的调度比较资源。缺省情况下,即org.apache.hadoop.yarn.util.resource.DefaultResourseCalculator仅使用内存,而DominantResourceCalculator使用Dominant资源来比较内存,CPU等多维资源。预期会有Java ResourceCalculator类名称。

由于您已将yarn.nodemanager.resource.cpu-vcores定义为4,并且由于每个映射器默认使用1个vcore,因此每次只能为每个节点运行4个映射器。

在这种情况下,您可以将yarn.nodemanager.resource.cpu-vcores的值增加8倍。它只是一个任意值,它将使映射器数量增加一倍。

+0

嘿。谢谢回复。实际上,我正在为大约1.7TB的数据运行sqoop作业。这很多,我为这项工作提供了大约2000个mappers(' - m 2000')。使用当前配置完成任务需要1.5到2小时,但在整个作业中仍有60 GB内存未被使用,因为一次只能运行26个映射器(使用2 GB)。这显然给我一个印象,即它受到可用核心数量的限制。如果我找到比将任务内存增加到4GB更好的解决方案,我会检查更多并在此更新。 – PratPor

+0

然后将yarn.nodemanager.resource.cpu-vcores增加到8.它只是一个任意值,你可以将它加倍,如果你的计算器因为cpu而真的受到限制,它应该使映射器数量增加一倍 – Nicomak

+0

是的,我试过了,它实际上可以使mappers的数量增加一倍。运行一个测试工作(pi),发现它降低了工作性能,因为现在2个映射器将按每个核心共享资源运行,并且pi作业比基于内存的计算基础更多。所以我所理解的是,它实际上是在这里交易。对于不需要太多内存的作业,我们可以增加映射器计数(vcores),否则只需将映射任务内存增加到4GB就更安全。感谢所有的帮助。 – PratPor