何时在hadoop mapreduce作业上以交互方式增加/减少节点数是个好主意?

时间:2012-10-09 16:26:24

标签: hadoop mapreduce emr

我有一种直觉,即增加/减少 在正在运行的作业上交互式节点的数量可以加速地图的重量 工作,但无助于减少大部分工作完成的繁重工作 通过减少。

有一个常见问题,但它并没有真正解释

http://aws.amazon.com/elasticmapreduce/faqs/#cluster-18

1 个答案:

答案 0 :(得分:1)

克里斯托弗史密斯回答了这个问题,他允许我在这里发帖。


一如既往......"它取决于"。有一件事你几乎总是可以计算 on:稍后添加节点不会像你那样帮助你 来自get go的节点。

创建Hadoop作业时,它会分成任务。这些 任务是有效的"工作原子"。 Hadoop让你调整#of 在创建作业期间映射器和#reducer任务,但是一旦完成作业 创建,它是静态的。任务分配到"插槽"。传统上, 每个节点配置为具有一定数量的映射槽 任务,以及减少任务的一定数量的插槽,但你可以 调整一下。一些较新版本的Hadoop不需要您 将插槽指定为用于映射或减少任务。无论如何, JobTracker定期将任务分配给插槽。因为这样做了 动态地,新的节点上线可以加快a的处理速度 通过提供更多的插槽来执行任务。

这为理解添加新节点的现实奠定了基础。 显然,阿姆达尔的法律问题是有更多的插槽而不是 待完成的任务很少(如果你有推测执行 启用后,它确实有所帮助,因为Hadoop将安排相同的任务 在许多不同的节点上运行,以便慢节点的任务可以 如果有备用资源,则由更快的节点完成)。所以,如果你 没有使用许多map或reduce任务定义你的工作,增加更多 节点并没有多大帮助。当然,每项任务都要强加一些 开销,所以你也不想疯狂。这就是我的原因 建议任务规模的准则应该是"需要的东西 〜2-5分钟执行"。

当然,当您动态添加节点时,它们会有另一个节点 缺点:他们没有任何本地数据。显然,如果你在 EMR管道的开始,没有一个节点有数据,所以 无所谓,但如果你有一个由许多工作组成的EMR管道, 随着早期工作将结果持续到HDFS,你会得到巨大的成功 性能提升,因为JobTracker将有利于塑造和 分配任务,以便节点具有可爱的数据位置(这是一个 整个MapReduce设计的核心技巧,以最大限度地提高性能)。上 减速器方面,数据来自其他地图任务,因此动态 与其他节点相比,添加的节点确实没有任何劣势。

因此,原则上,动态添加新节点实际上不太可能 帮助处理从HDFS读取的IO绑定映射任务。

...除

Hadoop有各种各样的秘籍可供优化 性能。一旦它开始传输地图输出数据 地图任务完成之前的reducer / reducer启动。这个 显然是对于映射器的工作的关键优化 生成大量数据。你可以在Hadoop开始时进行调整 转移。无论如何,这意味着新的节点可能是 处于劣势,因为现有节点可能已经具有此类节点 巨大的数据优势。显然,映射器的输出越多 传播后,缺点就越大。

这是怎么回事。但在实践中,很多Hadoop 作业让映射器以CPU密集的方式处理大量数据, 但是输出相对较少的数据给减速器(或者它们 可能会向减速器发送大量数据,但减速器仍然存在 非常简单,所以不受CPU约束。工作通常很少 (有时甚至是0)reducer任务,所以即使是额外的节点也可以提供帮助 你已经有一个减少插槽可用于每个未完成的减少 任务,新节点无法提供帮助。新节点也不成比例地帮助了 由于显而易见的原因,CPU绑定工作,因为趋于 地图任务不仅仅是减少任务,而是人们通常会看到的任务 胜利。如果您的映射器受I / O限制并从中提取数据 在网络中,添加新节点显然会增加聚合带宽 集群,所以它有帮助,但如果您的地图任务是I / O绑定 阅读HDFS,最好的事情就是拥有更多的初始节点和数据 已经遍布HDFS。看到减速器获得I / O并不罕见 因为结构不合理的工作而受约束,在这种情况下增加更多 节点可以提供很多帮助,因为它会再次分割带宽。

当然还有一个警告:一个非常小的集群, Reducer可以从运行的映射器中读取大量数据 本地节点,并添加更多节点将更多的数据转移到 拉过慢得多的网络。你也可以有案例 Reducer花费大部分时间来复用数据处理 从所有映射器发送数据(虽然它是可调的 孔)。

如果您提出这样的问题,我强烈建议您进行性能分析 使用亚马逊提供的KarmaSphere等工作。它 将为您提供更好的图片,说明您的瓶颈在哪里以及在哪里 是提高绩效的最佳策略。