【问题标题】:Why don't EMR instances have as many reducers as mappers?为什么 EMR 实例没有映射器那么多的 reducer?
【发布时间】:2012-04-28 00:22:50
【问题描述】:

默认情况下,在 EMR 作业期间,实例配置为具有比映射器更少的 reducer。但是减速器没有得到任何额外的内存,所以看起来它们应该能够拥有相同的数量。 (比如超大的高cpu实例有7个mapper,但只有2个reducer,但是mapper和reducer都配置了512MB可用内存)。

有谁知道这是为什么,有什么方法可以指定使用与映射器一样多的减速器吗?

编辑:我的数量有误,它是 512 MB

【问题讨论】:

标签: memory hadoop amazon-web-services elastic-map-reduce reducers


【解决方案1】:

映射器从其输入流(映射器的 STDIN)中提取数据,并且它们发出的内容更加紧凑。然后,该出站流(映射器的 STDOUT)也按键排序。因此,reducer 在其传入的数据中具有较小的排序数据。

这就是为什么任何 Hadoop MapReduce 集群(不仅仅是 EMR)的默认配置是映射器多于化简器的原因,这与作业跟踪器可用的核心数量成正比。

你可以通过jobconf参数控制mapper和reducer的数量。配置变量为 mapred.map.tasks 和 mapred.reduce.tasks。

【讨论】:

  • 但是在这种情况下,为什么 JVM 分配的内存相同(512 MB),这也适用于所有减速器还是每个减速器?更重要的是,我可以安全地为减速器提供更多内存吗?
  • 这是默认配置。如果您回顾不同的版本,您会发现其中一些公式只是最佳实践的结果(特别是映射器与缩减器的比率)。请参阅:hadoop.apache.org/common/docs/r0.20.0/…。在该文档的下方有一个关于内存管理的讨论,包括堆大小。这些都是可配置的,因此如果您的 reducer 具有不同的行为配置文件,您可以修改 Hadoop 作业的行为方式(包括 EMR)。
  • 我的问题是所有其他内存都用来做什么? c1.xlarge 实例应该有 7 GB,但它只为每个任务分配 512 MB。是否还有其他东西占用了剩余的内存。如果我将其更改为 4 GB,实例会内存不足吗?其他东西会因此受到影响吗?
  • 它是保守的,这给你留下了调整的空间。 tasktracker 使用了一定数量的内存,如果您使用的是本地 HDFS,那么该实例上的数据节点也会耗尽内存。其余的交给映射器和缩减器,EMR 假设它们可能会同时运行一段时间。它试图避免交换。但是,调整和测试非常简单。找到一个测试并使用相同的实例和集群大小运行多次,但为映射器声明的堆大小不同。
  • 顺便说一句,我认为您还应该使用不同类型的实例进行测试。对于大多数任务来说,拥有更多的内核(这意味着更多的并发性)比拥有更多的内存更好。一个 m1.large 集群怎么样,或者如果需要 m1.xlarge?
猜你喜欢
  • 2011-01-11
  • 2016-02-05
  • 2014-01-11
  • 2020-01-19
  • 2021-08-04
  • 2016-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多