我是Amazon EMR的新手,我正在尝试了解地图之后(在减少阶段之前)的排序阶段是如何工作的,以及我是否可以操纵它(通过一些人如何提供我自己的比较功能。
如果您知道地图阶段的输出需要如何显示,那将是最有帮助的。
目前我有这个简单的地图阶段,以这种格式打印出来:
"keyA|keyB|valueA1|valueA2"
我的reducer函数接收这些行并将它们合并到:
"keyA|keyB|sum_valueA1|sum_valueA2"
问题是在减速器阶段我只得到完全相同的线。意思是,键是相同的,也有值。 这是一个问题,并且不允许我充分利用map-reduce的功能。
我看到他们在wordcount示例中使用了这种格式:
" LongValueSum:密钥\ T1"
我是否必须使用" LongValueSum"这个词,并将其标签识别为键而不按值排序? 使用选项卡有点问题,因为"键"可能与" \ t"在它。
请帮忙。
答案 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 =。指定分区的分隔符
这可以保证键中前两个字段相同的所有键/值对都被划分为相同的缩减器
这实际上等同于将前两个字段指定为主键,将后两个字段指定为次要字段
主键用于分区,主键和辅助键的组合用于排序。