专业只做数据库实训和认证的品牌机构

微信公众号新浪微博
免费咨询电话:400-0909-964
当前位置: 网站首页 > Hadoop > Hadoop课程 > Hadoop入门教程:Streaming接口实现

Hadoop入门教程:Streaming接口实现

文章来源: 更新时间:2016/7/13 17:55:50

在线老师点击咨询:

最新学讯:近期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的。

本文地址:http://www.cuug.com.cn/hadoop/kecheng/12465346140.html 转载请注明!


在线预约 抢先报名 获取课程排期

Oracle培训机构

金牌讲师<>

冉乃纲-老师CUUG金牌讲师
冉老师 CUUG金牌讲师 Oracle及RedHat高级讲师、Unix/Linux 资深专家...[详细了解老师]

免费咨询上课流程 客服在线中

陈卫星-老师CUUG金牌讲师
陈老师 CUUG金牌讲师 精通Oracle管理、备份恢复、性能优化 11年Ora...[详细了解老师]

免费咨询上课流程 客服在线中

选学校如何选择适合自己的学校

CUUG -CHINA UNIX USER GROUP,是国际UNIX组织UNIFORUM的中国代表,是国内悠久的专业UNIX培训机构,被誉为中国UNIX 的摇篮。多年来,以提高教学质量为本,强调素质教育,积极引进、消化国外的新技术,有效的结合中国....[详情]

一站式服务(从入学到就业一帮到底)

入学

学习

就业

实操

食宿
地址:北京市海淀区田村山南路35号院17号楼
课程咨询:010-59426307 010-59426319 400-0909-964
企业服务:137 1818 8639(陈经理)
部分信息来源于网络,如有错误请联系指正!
版权所有@北京神脑资讯技术有限公司 (CUUG,中国UNIX用户协会) Copyright 2016 ALL Rights Reserved 京ICP备11008061号-1