Hadoop 亚马逊电子病历分类

Hadoop 亚马逊电子病历分类,hadoop,mapreduce,elastic-map-reduce,amazon-emr,Hadoop,Mapreduce,Elastic Map Reduce,Amazon Emr,我是Amazon EMR的新手,我正在尝试了解映射后的排序阶段(在reduce阶段之前)是如何工作的,以及我是否可以操作它(通过提供我自己的比较函数) 如果您知道映射阶段的输出需要是什么样子,那么它将非常有用 目前,我有一个简单的地图阶段,以这种格式打印: "keyA|keyB|valueA1|valueA2" 我的reducer函数接收这些行并将它们合并到: "keyA|keyB|sum_valueA1|sum_valueA2" 问题是,在减速器阶段,我只得到完全相同的行。这意味着,键是相

我是Amazon EMR的新手,我正在尝试了解映射后的排序阶段(在reduce阶段之前)是如何工作的,以及我是否可以操作它(通过提供我自己的比较函数)

如果您知道映射阶段的输出需要是什么样子,那么它将非常有用

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

"keyA|keyB|valueA1|valueA2"
我的reducer函数接收这些行并将它们合并到:

"keyA|keyB|sum_valueA1|sum_valueA2"
问题是,在减速器阶段,我只得到完全相同的行。这意味着,键是相同的,并且没有值。 这是一个问题,不允许我充分利用map reduce的功能

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

“LongValueSum:key\t1”

我是否必须使用单词“LongValueSum”和选项卡才能将其标识为键而不是按值排序? 使用该选项卡有点问题,因为“键”中可能有“\t”

请帮助。

找到了答案
它深深地埋藏在hadoop手册中,这个基本的东西应该放在“入门”一节中

放在这里,希望能为未来的开发者节省时间:

发件人:

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输出键通常有四个以“.”分隔的字段。但是,map/Reduce框架将使用-D mapred.text.key.partitioner.options=-k1,2选项按键的前两个字段对map输出进行分区。
这里,-D map.output.key.field.separator=。指定分区的分隔符。
这保证了键中具有相同前两个字段的所有键/值对将被划分到相同的缩减器中。
这实际上相当于将前两个字段指定为主键,将后两个字段指定为辅助键。
主键用于分区,主键和辅助键的组合用于排序