Hadoop Streaming和Pipes

来源:互联网 发布:西安淘宝模特兼职 编辑:程序博客网 时间:2024/06/06 03:38

原始问题的引出见:http://bbs.hadoopor.com/viewthread.php?tid=542 
在论坛里搜索了下,发现了两篇利用C/C++编写mapreduce的文章.如下: 
http://bbs.hadoopor.com/thread-256-1-1.html 
http://bbs.hadoopor.com/thread-420-1-2.html 
一.其中,利用stream的文章中提到,利用stream编写mapreduce程序,其reduce任务要等到所有map任务结束后才能进行,这点不太理解. 
二.从两种方法的实现上来看.感觉有点奇怪.在linux下,一般从stdin读入数据认为是管道的方式,而通过socket读入数据为stream方式,但是在hadoop中,貌似其叫法与linux下相反.不知道为什么. 
三.从代码可以看出,在hadoop中,stream是利用stdin,而pipes是利用socket.这两者有什么优缺点可以比较下的. 
By:guxiangxi

一,二两个问题我也不理解,不止如何回答。第三个问题我更关注一些,因为之前用过一下streaming,感觉不是特别好用,现在的状况还是熟悉C++,但写mapreduce还是用java。正好Pipes正好是我想要的。下面有三处文章可以参考 
      1、http://cxwangyi.blogspot.com/2010/01/writing-hadoop-programs-using-c.html 
      2、http://remonstrate.wordpress.com/2010/10/01/hadoop-上的-c-例程/ 
      3、http://blog.endlesscode.com/2010/06/16/simple-demo-of-streaming-and-pipes/

总结如下: 
     1、Streaming是Hadoop提供的一个可以使用其他编程语言来进行MapReduce来的API,因为Hadoop是基于Java(由于作者比较擅长Java,Lucene和Nutch都是出于Hadoop的作者)。HadoopStreaming并不复杂,其只是使用了Unix的标准输入输出作为Hadoop和其他编程语言的开发接口,因此在其他的编程语言所写的程序中,只需要将标准输入作为程序的输入,将标准输出作为程序的输出就可以了。在标准的输入输出中,key和value是以tab作为分隔符,并且在reduce的标准输入中,hadoop框架保证了输入的数据是经过了按key排序的。

     2、Hadoop Pipes是HadoopMapReduce的C++接口。与使用标准输入输出的HadoopStreaming不同(当然Streaming也可以用于C++),HadoopPipes在tasktacker和map/reduce进行通信时使用的socket作为管道,不是标准输入输出,而不是JNI。HadoopPipes不能运行在standalone模式下,所以要先配置成pseudo-distributed模式,因为HadoopPipes依赖于Hadoop的分布式缓存技术,而分布式缓存只会在HDFS运行的时候才会支持。与Java的接口不一样,HadoopPipes的key和value都是基于STL的string,因此在处理时开发人员需要手动地进行数据类型的转换。

     3、从本质上 hadoop pipes 和 hadoop streaming 做的事情几乎一样,除了两者的通信不同,pipes可以利用 hadoop 的 counter 特性。与 Java native code 比较,Java native code可以使用实现了 Writable 接口的任何数据类型作为 key/value,而 pipes 和 streaming就必须通过字符串进行一次转换(通信开销大,存储开销大)。也许正是这个原因,pipes 可能以后会被从 hadoop中移除。当然,如果计算代价较高,可能 Java native code 并没有 C++ 执行效率高,那么以后可能就写streaming code 了。pipes 使用的是 byte array,正好可以用 std:string封装,只是例子里面都是转换成为字符串输入输出。这要求程序员自己设计合理的输入输出方式(数据 key/value 的分段)。

已经得到证实:pipes 已经从hadoop 中移除。运行$~/hadoop-0.21.0/bin/hadoop,已经看不到pipe的这一项了。

使用上的参考: 
1、http://developer.yahoo.com/hadoop/tutorial/module4.html#pipes 
2、http://code.google.com/p/hypertable/wiki/MapReduceWithHypertable

转: http://hi.baidu.com/huaqing03/blog

原创粉丝点击