知识点
相关文章
更多最近更新
更多Hadoop pipes编程
2019-03-28 13:52|来源: 网络
Hadoop pipes编程介绍
更多Hadoop相关信息见Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13
Hadoop pipes允许C++程序员编写mapreduce程序,它允许用户混用C++和Java的RecordReader, Mapper, Partitioner,Rducer和RecordWriter等五个组件。关于Hadoop pipes的设计思想,可参见我这篇文章:Hadoop Pipes设计原理。
本文介绍了Hadoop pipes编程的基本方法,并给出了若干编程示例,最后介绍了Hadoop pipes高级编程方法,包括怎样在MapReduce中加载词典,怎么传递参数,怎样提高效率等。
2. Hadoop pipes编程初体验
Hadoop-0.20.2源代码中自带了三个pipes编程示例,它们位于目录src/examples/pipes/impl中,分别为wordcount-simple.cc,wordcount-part.cc和wordcount-nopipe.cc。下面简要介绍一下这三个程序。
(1) wordcount-simple.cc:Mapper和Reducer组件采用C++语言编写,RecordReader, Partitioner和RecordWriter采用Java语言编写,其中,RecordReader 为LineRecordReader(位于InputTextInputFormat中,按行读取数据,行所在的偏移量为key,行中的字符串为value),Partitioner为PipesPartitioner,RecordWriter为LineRecordWriter(位于InputTextOutputFormat中,输出格式为”key\tvalue\n”)
(2) wordcount-part.cc:Mapper,Partitioner和Reducer组件采用C++语言编写,其他采用Java编写
(3)wordcount-nopipe.cc:RecordReader,Mapper,Rducer和RecordWriter采用C++编写
接下来简单介绍一下wordcount-simple.cc的编译和运行方法。
在Hadoop的安装目录下,执行下面命令:
- ant -Dcompile.c++=yes examples
则wordcount-simple.cc生成的可执行文件wordcount-simple被保存到了目录build/c++-examples/Linux-amd64-64/bin/中,然后将该可执行文件上传到HDFS的某一个目录下,如/user/XXX/ bin下:
bin/hadoop fs -put build/c++-examples/Linux-amd64-64/bin/wordcount-simple C++/
上传一份数据到HDFS的wordcount目录下:
直接使用下面命令提交作业:
- hadoop pipes -D hadoop.pipes.java.recordreader=true -D hadoop.pipes.java.recordwriter=true -D mapred.job.name= wordcount -input wordcount -output out -program C++/wordcount-simple
先从最基础的两个组件Mapper和Reducer说起。
(1) Mapper编写方法
用户若要实现Mapper组件,需继承HadoopPipes::Mapper虚基类,它的定义如下:
- class Mapper: public Closable {
- public:
- virtual void map(MapContext& context) = 0;
- };
- class MapContext: public TaskContext {
- public:
- virtual const std::string& getInputSplit() = 0;
- virtual const std::string& getInputKeyClass() = 0;
- virtual const std::string& getInputValueClass() = 0;
- };
- class TaskContext {
- public:
- class Counter {
- ……
- public:
- Counter(int counterId) : id(counterId) {}
- Counter(const Counter& counter) : id(counter.id) {}
- ……
- };
- virtual const JobConf* getJobConf() = 0;
- virtual const std::string& getInputKey() = 0;
- virtual const std::string& getInputValue() = 0;
- virtual void emit(const std::string& key, const std::string& value) = 0;
- virtual void progress() = 0;
- …….
- };
Mapper的构造函数带有一个HadoopPipes::TaskContext参数,用户可以通过它注册一些全局counter,对于程序调试和跟踪作业进度非常有用:
如果你想注册全局counter,在构造函数添加一些类似的代码:
- WordCountMap(HadoopPipes::TaskContext& context) {
- inputWords1 = context.getCounter(“group”, ”counter1”);
- inputWords2 = context.getCounter(“group”, ”counter2”);
- }
- context.incrementCounter(inputWords1, 1);
- context.incrementCounter(inputWords2, 1);
用户自定义的counter会在程序结束时,输出到屏幕上,当然,用户可以用通过web界面看到。
相关问答
更多-
电脑应用专业出来找什么工作啊?[2023-05-22]
编程 -
信息与电脑科学是学什么的?[2022-11-19]
编程 -
hadoop pipes怎么用[2021-09-13]
Hadoop的Pipes Hadoop的Pipes是Hadoop MapReduce的C++接口代称。不同于使用标准输入和输出来实现map代码和reduce代码之间的Streaming,Pipes使用套接字作为 tasktracker与C++版本map函数或reduce函数的进程之间的通道,而未使用JNI。 我们将用C++重写贯穿本章的示例,然后,我们将看到如何使用Pipes来运行它。例 2-12 显示了用C++语言编写的map函数和reduce 函数的源代码。 例2-12. 用C++语言编写的MaxTem ... -
hadoop编程书籍推荐[2023-08-14]
目前《Hadoop权威指南》第二版, 据说5月份要出第三版。 -
hadoop,spark用什么语言编程[2022-07-10]
如果条件许可,公司提供Spark集群机器,在Spark集群机器上进行开发和学习是最好的; 如果条件不允许,在亚马逊云计算平台上构建Spark集群环境也是一种非常理想的选择; 如果纯粹是学习使用,安装单机版的Spark也是可以的 -
Hadoop Text类(Hadoop Text class)[2022-02-21]
他们已经实现了自己的Text for String,LongWritable for Long,IntWritable for Integers。 添加这些类的目的是为优化的网络序列化定义自己的基本类型。 这些可以在org.apache.hadoop.io包中找到。 此类型生成紧凑的序列化对象,以充分利用网络带宽。 Hadoop旨在处理大数据,因此网络带宽是他们想要以非常有效的方式使用的最宝贵的资源。 此外,与Java的本机类型相比,它们减少了这些对象的序列化和反序列化的开销。 They have impl ... -
使用Oozie工作流程。 它允许您使用Pipes以及常用的MapReduce作业。 I finally manage to make Hadoop Pipes works. Here some steps to make works the wordcount examples available in src/examples/pipes/impl/. I have a working Hadoop 1.0.4 cluster, configured following the steps describ ...
-
Hadoop HDFS依赖(Hadoop HDFS dependency)[2022-10-17]
Mappers从InputFormat的实现中读取输入数据。 大多数实现都来自FileInputFormat ,后者从本地计算机或HDFS读取数据。 (默认情况下,数据从HDFS读取,mapreduce作业的结果也存储在HDFS中。)当您希望从备用数据源读取数据而不是HDFS时,可以编写自定义InputFormat 。 TableInputFormat将直接从HBase读取数据记录, DBInputFormat将访问关系数据库中的数据。 您还可以想象一个系统,在特定端口上通过网络将数据流式传输到每台计算机; ...