亚马逊EMR排序

时间:2015-01-16 14:59:31

标签: hadoop mapreduce elastic-map-reduce amazon-emr

我是Amazon EMR的新手,我正在尝试了解地图之后(在减少阶段之前)的排序阶段是如何工作的,以及我是否可以操纵它(通过一些人如何提供我自己的比较功能。

如果您知道地图阶段的输出需要如何显示,那将是最有帮助的。

目前我有这个简单的地图阶段,以这种格式打印出来:

"keyA|keyB|valueA1|valueA2"

我的reducer函数接收这些行并将它们合并到:

"keyA|keyB|sum_valueA1|sum_valueA2"

问题是在减速器阶段我只得到完全相同的线。意思是,键是相同的,也有值。 这是一个问题,并且不允许我充分利用map-reduce的功能。

我看到他们在wordcount示例中使用了这种格式:

" LongValueSum:密钥\ T1"

我是否必须使用" LongValueSum"这个词,并将其标签识别为键而不按值排序? 使用选项卡有点问题,因为"键"可能与" \ t"在它。

请帮忙。

1 个答案:

答案 0 :(得分:1)

找到答案
它深埋在hadoop手册中,这个基本应该在“入门”部分......

将它放在这里,希望它能为未来的开发人员节省时间:

来自:http://hadoop.apache.org/docs/r1.2.1/streaming.html

Hadoop分区程序类

Hadoop有一个库类,KeyFieldBasedPartitioner,p>这对许多应用程序都很有用。此类允许Map / Reduce框架根据某些关键字段而不是整个键对地图输出进行分区。例如:

$HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-streaming.jar 
-D stream.map.output.field.separator=. \
-D stream.num.map.output.key.fields=4 \
-D map.output.key.field.separator=. \
-D mapred.text.key.partitioner.options=-k1,2 \
-D mapred.reduce.tasks=12 \
-input myInputDirs \
-output myOutputDir \
-mapper org.apache.hadoop.mapred.lib.IdentityMapper \
-reducer org.apache.hadoop.mapred.lib.IdentityReducer \
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner 

这里,-D stream.map.output.field.separator =。 -D stream.num.map.output.key.fields = 4如前面的例子所述 流式传输使用这两个变量来识别映射器的键/值对 上述Map / Reduce作业的地图输出键通常有四个以“。”分隔的字段。但是,Map / Reduce框架将使用-D mapred.text.key.partitioner.options = -k1,2选项按键的前两个字段对地图输出进行分区。
这里,-D map.output.key.field.separator =。指定分区的分隔符 这可以保证键中前两个字段相同的所有键/值对都被划分为相同的缩减器 这实际上等同于将前两个字段指定为主键,将后两个字段指定为次要字段 主键用于分区,主键和辅助键的组合用于排序。