hadoop streaming

Hadoop Streaming

Hadoop提供的一种可是使用其他语言实现mapreduce程序的API。

执行逻辑

输入输出基于系统标准输入、标准输出。map阶段的输入是按照行读入的,所以比较适合文本处理,如果是SequenceFile这种二进制文件,会有问题。map阶段的输出是将key和value用tab间隔,写到标准输出。
reduce阶段会对key进行排序,但是不会形成传统的输出形式:key->value_list。reduce阶段的输入也是key和value对,只是框架保证相同的key一定是连续在一起,所以不同key的边界需要自己判断,通常reduce阶段会有一个lask_key变量。

map阶段

import sys

for line in sys.stdin:
    # map do something
    ...
    # map output
    print '%s\t%s' % (key, val)

reduce阶段

import sys

lask_key = None

for line in sys.stdin:
    (key, val) = line.strip().split("\t")
    # reduce do something
    ...
    # reduce output
    print '%s\t%s' % (key,val)

本地测试

cat input/sample.txt | map.py | sort | reduce.py

hadoop运行

hadoop jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-*.jar -input input -output output -map map.py -reducer reduce.py -files map.py,reduce.py

二进制文件

SequenceFile

hdfs上大量文件是以SequenceFile形式存储的。这种情况下需要将key和value转化为字符串形式,并以tab间隔。在执行时,添加-inputformat SequenceFileAsTextInputFormat参数。

参数
inputformat SequenceFileAsTextInputFormat

相关资料

https://hadoop.apache.org/docs/r2.7.2/hadoop-streaming/HadoopStreaming.html
《Hadoop.The.Definitive.Guide.4th.Edition》Chapter2,Hadoop Streaming

你可能感兴趣的:(hadoop streaming)