Hadoop Streaming编程
一、概述Hadoop Streaming是Hadoop提供的一个编程工具,它允许用户使用任何可执行文件或者脚本作为Mapper和Reducer,例如:
采用shell脚本语言中的一些命令作为mapper和reducer(cat作为mapper,wc作为reduce)
-
$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/contrib/streaming/hadoop-*-streaming.jar\
-
-input myInputDir\
-
-output myOutputDir\
-
-mapper cat\
- -reducer wc
二、Hadoop Streaming原理
mapper和reducer会从标准输入中读取用户数据,一行一行处理后发送给标准输出。Streaming工具会创建MapReduce作业,发送给各个tasktracker,同时监控整个作业的执行过程。
如果一个文件(可执行或者脚本)作为mapper,mapper初始化时,每一个mapper任务会把该文件作为一个单独进程启动,mapper任务运行时,它把输入切分成行,并把每一行提供给可执行文件进程的标准输入。同时,mapper收集可执行文件进程标准输出的内容,并把收到的每一行内容转化为key/value对,作为mapper的输出。默认情况下,一行中第一个tab之前的部分作为key,之后的(不包括tab)作为value。如果没有tab,整行作为key值,value值为null。
对于reducer,类似。
以上是Map/Reduce框架和Streaming Mapper/Reduce之间的基本通信协议。
三、Hadoop Streaming用法
四、Mapper和Reducer实现
本节试图用尽可能多的语言编写Mapper和Reducer,包括java、C、C++、shell脚本、python等。
由于hadoop会自动解析数据文件到Mapper或者Reducer的标准输入中,以供它们读取使用,所以应先了解各个语言获取标准输入的方法。
(1)java语言
见Hadoop自带的例子。
(2)C++语言
(3)C语言
(4)shell脚本
管道
(5)Python
为了说明各种语言编写Hadoop Streaming程序的方法,下面以WordCount为例,WordCount作业的主要的功能是对用户输入的数据中的所有字符串进行计数。
(1)C语言实现
(2)C++语言实现
(3)shell脚本语言实现
简约版,每行一个单词:
详细版,每行可能有多个单词(由史江明编写):mapper.sh
reducer.sh
(4) Python脚本语言实现
五、常见问题及解决方案
(1)作业总是允许失败
提示找不到可执行程序,比如”Caused by: java.io.IOException: Cannot run program “/user/hadoop/Mapper”: error=2, No such file or directory”:
可在提交作业时,采用-file选型指定这些文件,比如上面的例子中,可以使用”-file Mapper -file Reducer“或者"-file Mapper.py -file Reducer.py",这样,Hadoop会将这两个文件自动分发到各个节点上,比如:
(2)用脚本编写时,第一行需要注明脚本解释器,默认是shell
(3)如何对Hadoop Streaming程序进行测试?
Hadoop Streaming程序的一个优点是易于测试,比如在WordCount例子中,可以运行以下命令在本地进行测试:
六、参考资料
【1】C++&Python实现Hadoop Streaming的paritioner和模块化
【3】
致谢:
感谢原作者解决了我这个小白的问题,让我一个对Hadoop Streaming一无所知的小白,写出了第一个程序,完成了任务。
引自: