输出数据分割默认情况下Streaming框架将map输出的每一行第一个”\t”之前的部分作为key,之后的部分作为value,key\tvalue又作为reduce的输入。可以用-D stream.map.output.field.separator改变map输出中key和value的分隔符,用-D stream.num.map.output.key.fields设置分隔符的位置,该位置之前的部分作为key,之后的部分作为value。如下所示,其中-D stream.map. output.field.separator=:指定使用冒号”:”将map输出的一行分隔为key/value,-D stream.num.map.output.key.fields=2指定在第二个冒号处进行分隔,也就是第二个冒号之前的作为key,之后的作为value。如果没有冒号或冒号少于两个,则key为整行,value为空。 $HADOOP_HOME/bin/hadoop streaming \ -D stream.map.output.field.separator=: \ -D stream.num.map.output.key.fields=2 \ -input /user/test/input -output /user/test/output \ -mapper mymapper.sh -reducer myreducer.sh \ -file /home/work/mymapper.sh \ -file /home/work/myreducer.sh \ -jobconf mapred.job.name=”output-sep-demo” 与map类似,对于reduce的输出,同样也可以用-D stream.reduce.output.field.separator和-D stream.num.reduce.output.key.fields定制key/value分隔方式。 二次排序转自: 我们知道,一个典型的Map-Reduce过程包 括:Input->Map->Patition->Reduce->Output。Pation负责把Map任务输出的中间结果 按key分发给不同的Reduce任务进行处理。Hadoop 提供了一个非常实用的partitioner类KeyFieldBasedPartitioner,通过配置相应的参数就可以使用。通过 KeyFieldBasedPartitioner可以方便地实现二次排序。 示例:
view plain
mapper.sh: #!/bin/sh cat reducer.sh: #!/bin/sh sort test.txt内容: 1,2,1,1,1 1,2,2,1,1 1,3,1,1,1 1,3,2,1,1 1,3,3,1,1 1,2,3,1,1 1,3,1,1,1 1,3,2,1,1 1,3,3,1,1 2. 测试数据test.txt放入hdfs,运行map-reduce程序
view plain
$ hadoop streaming / -D stream.map.output.field.separator=, / -D stream.num.map.output.key.fields=4 / -D map.output.key.field.separator=, / -D num.key.fields.for.partition=2 / -partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner / -input /app/test/test.txt / -output /app/test/test_result / -reducer ./reducer.sh / -file mapper.sh / -file reducer.sh / -jobconf mapre.job.name="sep_test" $ hadoop fs –cat /app/test/test_result/part-00003 1,2,1,1 1 1,2,2,1 1 1,2,3,1 1 $ hadoop fs –cat /app/test/test_result/part-00004 1,3,1,1 1 1,3,1,1 1 1,3,2,1 1 1,3,2,1 1 1,3,3,1 1 1,3,3,1 1 通过这种方式,就做到前4个字段是key,但是通过前两个字段进行partition的目的
注意:
-D map.output.key.field.separator=, / 这个分隔符使用TAB键貌似不管用 参数对比hadoop中的map-reduce是处理<key,value>这样的键值对,故指定<key,value>的分割符等参数可以分成三类:
|