基于Keys分发Hadoop Streaming输出文件

时间:2016-06-13 09:08:08

标签: python hadoop mapreduce hadoop-streaming hadoop-partitioning

我编写了一个mapper函数,它解析XML并将结果输出为" \ t"如下图所示

Name Age
ABC   23
XYZ   24
ERT   25

使用如下所述的Hadoop流代码,我试图在密钥的基础上对数据进行分区。我想为不同的密钥创建不同的输出文件夹,即

而不是将part-00000,part-00001和part-00003作为输出文件夹中的输出文件" out_parse_part16", 我希望像这样创建文件夹 / out_parse_part16 / ABC,

/ out_parse_part16 / XYZ,

/ out_parse_part16 / ERT

我希望将数据分区到由键定义的不同文件夹。有没有办法通过基于键在我的reducer代码中创建输出文件夹来做到这一点?

/opt/cloudera/parcels/CDH-5.5.2-1.cdh5.5.2.p0.4/bin/hadoop jar /opt/cloudera/parcels/CDH-5.5.2-1.cdh5.5.2.p0.4/jars/hadoop-streaming-2.6.0-cdh5.5.2.jar \
-Dstream.recordreader.begin="<START_REC>" \
-Dstream.recordreader.end="</START_REC>" \
-D mapred.job.name="parse_with_partition"  \
-D stream.num.map.output.key.fields=1 \
-D map.output.key.field.separator=\t \
-D mapred.text.key.partitioner.options="-k1nr" \
-inputreader "org.apache.hadoop.streaming.StreamXmlRecordReader,begin =<START_REC>,end=</START_REC>" \
-file csv_parser_part.py \
-mapper csv_parser_part.py \
-file csv_part_reducer.py \
-reducer /csv_part_reducer.py \
-input TEST_XML2.xml \
-output out_parse_part16 \
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner \
-verbose

1 个答案:

答案 0 :(得分:0)

我想你需要一个这样的罐子。

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.lib.MultipleTextOutputFormat;

public class TestMultipleOutputFormat extends MultipleTextOutputFormat<Text, Text> {  

    protected String generateFileNameForKeyValue(Text key, Text value, String name)   
    {  
        String strValue = value.toString();  
        String outputName = name;  
        return outputName ; 
    }  

}