hadoop流提供了一个api,允许用户保用任何脚本语言写Map函数或Reduce函数。Hadoop流的关键是,它使用UNIX标准作为程序与Hadoop之间的接口。因此,任何程序只要可以从标准流中读取数据并且可以写入数据到标准输出流,那么就可以通过Hadoop流使用其它语言编写MapReduce程序的Map函数或Reduce函数。
如下面的示例
bin/hadoop jar contrib/streaming/hadoop-streaming-1.0.4.jar -input input -output wcoutput4 -mapper /bin/cat -reducer /usr/bin/wc
输入文件如下
file01
Hello World Bye World
file02
Hello Hadoop Goodbye Hadoop
运行成功之后,输出文件如下
2 8 52
wc命令用来统计文件中行数、单词数和字节数,可以看到,上面的统计结果是正确的。
当一个可执行文件作为Mapper时,每一个Map任务会以一个独立的进程启动这个可执行文件,然后在Map任务运行时,会把输入切分成行提供给可执行文件,并作为它的标准输入内容。当可执行文件运行出结果时,Map从标准输出中收集数据,并将其转化为<key, value>对,作为Map的输出。
Reduce与Map相同,如果可执行文件作为Reduce时,Reduce任务会启动这个可执行文件,并且将<key, value>对转化为行作为这个可执行文件的标准输入。然后,Reduce会收集这个可执行文件的标准输出内容。并把每一行转化为<key,value>对,作为Reduce的输出。
Map与Reduce将输出转化为<key,value>对的默认方法是:将每行的第一个tab符号之前的内容作为key,之后的内容作为value。如果没有tab符号,那么这一行的所有内容会作为key,而value值为null。当然这是可以更改的。