有的时候,使用Hadoop Streaming比写Map、Reduce要轻量一些。但是由一些坑要注意。
例如,使用SequenceFile、指定分隔符等等。
hadoop jar /path/hadoop-xxxx-streaming.jar \ -D mapred.reduce.tasks=100 \ -input path/xxx \ -output path/yyy \ -file ./dna.sh \ -mapper ./map.sh \ -inputformat SequenceFileAsTextInputFormat
一般情况下,建议把脚本放到sh中,因为awk等经常有单、双引号转意的问题。同时注意加到-file选项,使得其自动分发。
--inputformat,要注意选择SequenceFileAsTextInputFormat而不是SequenceFile,否则默认时不解压缩的。
关于Map输入的控制:
关于Reduce输出的控制:
- 告诉OutputWriter,key和value不是用\t分割,可以-D stream.reduce.output.field.seperator="\x01"
- 最终输出中,key和value之间的分割符,选择非\t,可以-D mapred.textoutputformat.separator="|"