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
网友评论