Memory 为什么不';EMR实例有和映射器一样多的还原器?

Memory 为什么不';EMR实例有和映射器一样多的还原器?,memory,hadoop,amazon-web-services,elastic-map-reduce,reducers,Memory,Hadoop,Amazon Web Services,Elastic Map Reduce,Reducers,默认情况下,在EMR作业期间,实例配置为具有比映射器更少的还原器。但是减速机没有任何额外的内存,所以看起来它们应该能够拥有相同的内存量。(例如,超大高cpu实例有7个映射器,但只有2个还原器,但映射器和还原器都配置了512 MB的可用内存) 有人知道这是为什么吗?我有没有办法指定使用尽可能多的还原器作为映射器 编辑:我的数量错了,它是512MB,地图绘制者从他们的输入流中提取数据(地图绘制者的STDIN),他们发出的数据更紧凑。该出站流(映射器的STDOUT)随后也按键进行排序。因此,还原器在其

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

有人知道这是为什么吗?我有没有办法指定使用尽可能多的还原器作为映射器


编辑:我的数量错了,它是512MB,地图绘制者从他们的输入流中提取数据(地图绘制者的STDIN),他们发出的数据更紧凑。该出站流(映射器的STDOUT)随后也按键进行排序。因此,还原器在其传入数据中具有更小的已排序数据

这就是为什么Hadoop MapReduce集群(不仅仅是EMR)的默认配置是拥有比Reducer更多的映射器的原因,与jobtracker可用的内核数量成比例


您可以通过jobconf参数控制映射器和还原器的数量。配置变量是mapred.map.tasks和mapred.reduce.tasks。

我想我现在明白了,但我不确定。中列出的内存量跨所有映射器或所有还原器,不是每个还原器,因为它们都在同一JVM中运行,但在这种情况下,为什么JVM分配的内存相同(512 MB),这也适用于所有还原器还是每个还原器?更重要的是,我能安全地给减速机更多的内存吗?这是默认配置。如果回顾不同的版本,您会发现其中一些公式只是最佳实践的结果(特别是映射器与还原器的比率)。请参阅:。在那个文档的下面,有一个关于内存管理的讨论,包括堆大小。这些都是可配置的,因此,如果您的reducer具有不同的行为配置文件,您可以修改Hadoop作业的行为方式(包括EMR)。我的问题是,所有其他内存用于什么?c1.xlarge实例应该有7GB,但它只为每个任务分配512MB。是否还有其他东西占用了剩余的内存。如果我将其更改为4GB,实例是否会耗尽内存?其他的东西会因此受到影响吗?它是保守的,这给你留下了调整的空间。tasktracker使用了一定数量的内存,如果您使用的是本地HDFS,则该实例上的datanode也会耗尽内存。其余部分交给映射器和还原器,EMR假设这些映射器和还原器可能会同时运行一段时间。它试图避免交换。但是,对您来说,调优和测试非常简单。找到一个测试,并使用相同的实例和集群大小运行几次,但为映射程序声明的堆大小不同。顺便说一下,我认为您还应该使用不同类型的实例进行测试。对于大多数任务来说,拥有更多的内核(这意味着更多的并发性)比拥有更多的内存要好。那么m1.large集群呢,或者如果需要是m1.xlarge集群呢?