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的安装目录下,执行下面命令:

  1. 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目录下:

直接使用下面命令提交作业:

  1. 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  
3. Hadoop pipes编程方
先从最基础的两个组件Mapper和Reducer说起。
(1) Mapper编写方法
用户若要实现Mapper组件,需继承HadoopPipes::Mapper虚基类,它的定义如下:
  1. class Mapper: public Closable {  
  2.    
  3. public:  
  4.    
  5. virtual void map(MapContext& context) = 0;  
  6.    
  7. };  
用户必须实现map函数,它的参数是MapContext,该类的声明如下:
  1. class MapContext: public TaskContext {  
  2.    
  3. public:  
  4.    
  5. virtual const std::string& getInputSplit() = 0;  
  6.    
  7. virtual const std::string& getInputKeyClass() = 0;  
  8.    
  9. virtual const std::string& getInputValueClass() = 0;  
  10.    
  11. };  
而TaskContext类地声明如下:
  1. class TaskContext {  
  2.    
  3. public:  
  4.    
  5. class Counter {  
  6.    
  7. ……  
  8.    
  9. public:  
  10.    
  11. Counter(int counterId) : id(counterId) {}  
  12.    
  13. Counter(const Counter& counter) : id(counter.id) {}  
  14.    
  15. ……  
  16.    
  17. };  
  18.    
  19. virtual const JobConf* getJobConf() = 0;  
  20.    
  21. virtual const std::string& getInputKey() = 0;  
  22.    
  23. virtual const std::string& getInputValue() = 0;  
  24.    
  25. virtual void emit(const std::string& key, const std::string& value) = 0;  
  26.    
  27. virtual void progress() = 0;  
  28.    
  29. …….  
  30.    
  31. };  
用户可以从context参数中获取当前的key,value,progress和inputsplit等数据信息,此外,还可以调用emit将结果回传给Java代码。
Mapper的构造函数带有一个HadoopPipes::TaskContext参数,用户可以通过它注册一些全局counter,对于程序调试和跟踪作业进度非常有用:
如果你想注册全局counter,在构造函数添加一些类似的代码:
  1. WordCountMap(HadoopPipes::TaskContext& context) {  
  2.    
  3. inputWords1 = context.getCounter(“group”, ”counter1”);  
  4.    
  5. inputWords2 = context.getCounter(“group”, ”counter2”);  
  6.    
  7. }  
当需要增加counter值时,可以这样:
  1. context.incrementCounter(inputWords1, 1);  
  2.    
  3. context.incrementCounter(inputWords2, 1);  
其中getCounter的两个参数分别为组名和组内计数器名,一个组中可以存在多个counter。
用户自定义的counter会在程序结束时,输出到屏幕上,当然,用户可以用通过web界面看到。

相关问答

更多
  • 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权威指南》第二版, 据说5月份要出第三版。
  • 如果条件许可,公司提供Spark集群机器,在Spark集群机器上进行开发和学习是最好的; 如果条件不允许,在亚马逊云计算平台上构建Spark集群环境也是一种非常理想的选择; 如果纯粹是学习使用,安装单机版的Spark也是可以的
  • 他们已经实现了自己的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 ...
  • Mappers从InputFormat的实现中读取输入数据。 大多数实现都来自FileInputFormat ,后者从本地计算机或HDFS读取数据。 (默认情况下,数据从HDFS读取,mapreduce作业的结果也存储在HDFS中。)当您希望从备用数据源读取数据而不是HDFS时,可以编写自定义InputFormat 。 TableInputFormat将直接从HBase读取数据记录, DBInputFormat将访问关系数据库中的数据。 您还可以想象一个系统,在特定端口上通过网络将数据流式传输到每台计算机; ...