Hadoop使用Streaming的一些坑

有的时候,使用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="|"

Leave a Reply

Your email address will not be published. Required fields are marked *