你会如何建议使用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将通过键正确地连接所有的值。如果你想从多个来源获取数据,只需要在命令行上添加更多的输入......如果它们的输入长度不同,那么在你的映射器中,你可以识别并从映射器创建标准格式输出。

Cascading为过滤,加入和字段分组提供了有用的抽象。 https://*.com/questions/4626356指向如何在Cascading中使用Hadoop流的有用示例。