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

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

Hadoop入门教程:Pipes接口实现

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

在线老师点击咨询:

最新学讯:近期OCP认证正在报名中,因考试人员较多请尽快报名获取最近考试时间,报名费用请联系在线老师,甲骨文官方认证,报名从速!

我要咨询

Hadoop入门教程:Pipes接口实现,Hadoop管道与流不同,流使用标准输入和输出让用户的Map和Reduce节点之间相互交流。而管道使用socket作为tasktracker与用户MapReduce进程之间的通道。下面我们同样使用Hadoop发行版中自带单词统计的例子,这个Map和Reduce函数是使用C/C++编写的,然后使用管道机制在Hadoop集群中运行用户的作业,在使用Hadoop Pipes时需要在头文件中包含Hadoop/Pipes.hh、Hadoop/TemplateFactory.hh、Hadoop/StringUtils.hh这3个头文件。

需要注意的是Hadoop版本自带的Pipes例子中有三个实现,对应的源码文件分别为:wordcount-simple.cc、wordcount-part.cc及wordcount-nopipe.cc。下面对这三个文件进行说明。

wordcount-simple.cc,是最基本的Pipes编程,Mapper和Reducer使用C++编写,

RecordReader、Partitioner和RecordWriter均采用Hadoop内置的Java实现,其中,RecordReader为LineRecordReader(位于InputTextInputFormat中,按行读取数据,行所在的偏移量为key,行中的字符串为value),Partitioner为PipesPartitioner,RecordWriter为LineRecordWriter(位于InputTextOutputFormat中,输出格式为“key\tvalue\n”)。

wordcount-part.cc,Mapper、Partitioner和Reducer组件采用C++语言编写,其他组件采用Hadoop的Java内置实现。

wordcount-nopipe.cc,RecordReader、Mapper、Reducer和RecordWriter均采用C++编写实现。

接下来介绍最简单的wordcount-simple.cc的Pipes的C++实现。

(1)Map实现

要实现WordCountMap就需要继承HadoopPipes::Mapper类,并实现Map函数,其代码如下:

class WordCountMap: public HadoopPipes: :Mapper {

public:

HadoopPipes: :TaskContext: :Counter* inputWords;

void map(HadoopPipes: :MapContext& context) {

std: :vector words =

HadoopUtils: :splitString(context.getInputValue(), " ");

for(unsigned int i=0; i < words.size(); ++i) {

context.emit(words[i], "1");

}

context.incrementCounter(inputWords, words.size());

}

};

从上述代码中很容易可以看出,Pipes接口是比较类似Java API接口的,通过MapContext类中的方法getInputValue( )获取value,就是每一行的值,处理之后通过MapContext类中的emit方法输出,这个输出也就是下一阶段Reduce的输入。

(2)Redcue实现

要实现WordCountReduce类,就需要继承HadoopPipes::Reducer类,并实现Reduce函数,代码如下:

class WordCountReduce: public HadoopPipes: :Reducer {

public:

HadoopPipes: :TaskContext: :Counter* outputWords;

void reduce(HadoopPipes: :ReduceContext& context) {

int sum = 0;

while (context.nextValue()) {

sum += HadoopUtils: :toInt(context.getInputValue());

}

context.emit(context.getInputKey(), HadoopUtils toString(sum));

context.incrementCounter(outputWords, 1);

}

};

从WordCountReduce类的实现中可以看出,Reduce通过ReduceContext类中的方法nextValue( )来获取当前key的下一个值value,然后对其值相加,最后通过emit方法提交键值对作为Redcue的最终输出。

(3)main函数

Map和Reduce实现之后,还需要一个main函数来驱动,需要调用HadoopPipes::runTask函数来驱动,代码如下:

int main(int argc, char *argv[]) {

return HadoopPipes: :runTask(HadoopPipes: :TemplateFactory

WordCountReduce>());

}

从main函数中可以看到,HadoopPipes::runTask函数有两个参数,分别就是Map和Reduce类。

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


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

Oracle培训机构

金牌讲师<>

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

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

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

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

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

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

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

入学

学习

就业

实操

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