Hadoop入门教程:Streaming接口实现
最新学讯:近期OCP认证正在报名中,因考试人员较多请尽快报名获取最近考试时间,报名费用请联系在线老师,甲骨文官方认证,报名从速!
我要咨询Hadoop入门教程:Streaming接口实现,Streaming接口就是使用UNIX标准流作为Hadoop和程序之间的接口,可以使用任何语言,仅需要编写的MapReduce程序能够读取标准输入并写入标准输出,Hadoop Streaming可以帮助用户创建和运行一类特殊的MapReduce作业,这些作业是由一些可执行文件或脚本文件充当Mapper或Reducer。
如果一个可执行文件被用于Mapper,则在Mapper初始化时,每一个Mapper任务会把这个可执行文件作为一个单独的进程启动。Mapper任务在运行时把输入切分成行并把每一行提供给可执行文件进程的标准输入。同时,Mapper收集可执行文件进程标准输出的内容,并把收到的每一行内容转化成key/value对,作为Mapper的输出。在默认情况下,一行中第一个tab之前的部分作为key,之后的(不包括tab)作为value。如果没有tab,整行作为key值,value值为null。
如果一个可执行文件被用于Reducer,每个Reducer任务会把这个可执行文件作为一个单独的进程启动。Reducer任务在运行时把输入切分成行并把每一行提供给可执行文件进程的标准输入。同时,Reducer收集可执行文件进程标准输出的内容,并把每一行内容转化成key/value对,作为Reducer的输出。在默认情况下,一行中第一个tab之前的部分作为key,之后的(不包括tab)作为value。关于Map和Reduce中的key和value的切分方式,用户是可以自定义的。下面介绍在C++语言中使用Steaming接口实现词频统计wordcount的例子。
(1)Map实现
Map需要将输入文本转化为的格式输出,因此Map程序WordcountMap.cpp代码如下:
#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;
int
main(){
string key;
int
value =
1
;
while
(cin>>key){
if
(!key.empty())
cout<<key<<
"\t"
<<value<<endl;
}
return
0
;
}
在代码中我们假定处理的是英文,因此这里不涉及分词,每从标准输入取得一个词就输出为,键值对之间使用tab键分割。
(2)Redcue实现
Reduce的输入就是Map的输出,需要注意的是输入也是来自标准输入,同时输入数据是Map输出后已经根据key排序之后的。Reduce程序WordcountReduce.cpp的代码如下:
#include <iostream>
#include <map>
using namespace std;
int
main() {
map<string,
int
> wordMap;
map<string,
int
>: :iterator it;
string key;
int
value;
while
(cin>>key>>value) {
wordMap[key] +=value;
}
for
(it=wordMap.begin();it != wordMap.end();it++) {
cout<<it->f?irst<<
"\t"
<<it->second<<endl;
}
return
0
;
}
Reduce的处理逻辑也很简单,使用map数据结构来保持接收的键值对,从标准输入读取一行,然后对于key相同的对其值相加。最终输出map的内容。
上述Reduce代码是一种比较简单易懂的写法,由于Reduce的输入就是Map的输出,而Map的输出是已经以key为键排序好的数据,因此使用Streaming接口编写Reduce程序时可以利用这一点来提高Reduce的数据处理效率,而没有必要将数据都全部读入内存进行统计,用户在处理时只需要判断key的分界即可,这种写法参见11.1.1节中的示例。
以上是使用C++来实现的streaming接口,当然任何可执行程序都可以使用Streaming接口编写并行程序。例如,使用Linux shell命令实现词频统计的代码如下:
$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-streaming.jar \
-input yourInputDirs \
-output yourOutputDir \
-mapper /bin/cat \
-reducer /usr/bin/wc
在上述代码中就是直接使用cat命令作为Map,使用wc命令作为Reduce的。