你会如何建议使用Hadoop流媒体进行“加入”?
我有两个文件,在下面的格式:你会如何建议使用Hadoop流媒体进行“加入”?
field1, field2, field3
field4, field1, field5
一个不同领域的数字表示不同的含义。
我想加入使用Hadoop流基础上的相互场(field1
在上面的例子)两个文件,以便输出将是field1, field2, field3, field4, field5
(其它排序都ok沿,因为他们拥有所有的字段)。
的Hadoop有一个名为KeyFieldBasedPartitioner库http://hadoop.apache.org/mapreduce/docs/r0.21.0/api/org/apache/hadoop/mapred/lib/KeyFieldBasedPartitioner.html
使用本作中,你的工作推出的分区为您的数据流作业的选项,您可以将映射器输出打入键/值对,并有钥匙得到散列起来一起去同减速器和排序包括值http://hadoop.apache.org/mapreduce/docs/r0.21.0/streaming.html#More+Usage+Examples
$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 mapreduce.map.output.key.field.separator=. \
-D mapreduce.partition.keypartitioner.options=-k1,2 \
-D mapreduce.job.reduces=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在这里解释http://hadoop.apache.org/mapreduce/docs/r0.21.0/streaming.html#Customizing+How+Lines+are+Split+into+Key%2FValue+Pairs基本上他们是你如何输出你的映射器字段来定义键/值对。
上述MapReduce作业的地图输出键通常有四个以“。”分隔的字段。但是,MapReduce框架将使用-D mapreduce.partition.keypartitioner.options = -k1,2选项将键输出的前两个字段分区。这里,-D mapreduce.map.output.key.field.separator =。指定分区的分隔符。这保证了键中所有具有相同前两个字段的键/值对将被分区到相同的缩减器中。
这实际上等同于将前两个字段指定为主键,将后两个字段指定为次要字段。主键用于分区,主键和辅助键的组合用于排序。
为了做一个连接,它就像输出你的映射器中的字段一样简单,并且在配置启动时为作为键的字段设置选项,并且reducer将通过键正确地连接所有的值。如果你想从多个来源获取数据,只需要在命令行上添加更多的输入......如果它们的输入长度不同,那么在你的映射器中,你可以识别并从映射器创建标准格式输出。