Hadoop流提供给了 API允许用户使用任何脚本语言编写 map 函数或 reduce
函数。Hadoop 流的关键是,它使用 UNIX标准流作为程序与 Hadoop 之间的接
口。因此,任何程序只要可以从标准输入流中读取数据,并且可以写入数据到
标准输出流,那么就可以通过 Hadoop流使用其他语言编写 MapReduce程序的
map函数或 reduce函数。

 

bin/Hadoop jar contrib/streaming/Hadoop-0.20.2-streaming.jar –input input –
output output –mapper /bin/cat –reducer usr/bin/wc

从这个例子中可以看到,Hadoop流引入的包是 Hadoop-0.20.2-
streaming.jar,并且具有如下命令:
-input 指明输入文件路径
-output 指明输出文件路径
-mapper 制定 map函数
-reducer 指定 reduce函数

 

Hadoop  流的工作原理(map和reduce类似)

当一个可执行文件作 mapper时,每一个 map 任务会以一个独立的进程启动
这个可执行文件,然后在 map任务运行时,会把输入切分成行提供给可执行文
件,并作为它的标准输入(stdin)内容。当可执行文件运行出结果时,map从
标准输出(stdout)中收集数据,并将其转化为<key,value>对,作为 map输出。

reduce与 map 相同,如果可执行文件作为 reducer时,reduce 任务会启动这
个可执行文件,并且将<key,value>转化为行来作为这个可执行文件的标准输入
(stdin)。然后 reduce 会收集这个可执行文件的标准输出(stdout)内容,并把
每一行转化为<key,value>对,作为 reduce输出。

map与 reduce将输出转化为<key,value>的默认方法是,将每行的第一个 tab
符号(制表符)之前的内容作为 key,之后的内容作为 value。如果没有 tab符
号,那么这一行的所有内容作为 key,而 value值为 null,可以更改。

 

Hadoop流命令的具体内容如下表所示

hadoop不适合处理流式数据 hadoop 流处理_可执行文件

hadoop不适合处理流式数据 hadoop 流处理_Hadoop_02

 

Hadoop Streaming 的优缺点

 

优点:
 可以使用自己喜欢的语言来编写 MapReduce 程序(不必非得使用 Java)
 不需要像写 Java 的 MR 程序那样 import 一大堆库,在代码里做很多配
置,很多东西都抽象到了 stdio 上,代码量显著减少。
 因为没有库的依赖,调试方便,并且可以脱离 Hadoop 先在本地用管道
模拟调试。

缺点:
 只能通过命令行参数来控制 MapReduce 框架,不像 Java 的程序那样可以
在代码里使用 API,控制力比较弱。
 因为中间隔着一层处理,效率会比较慢。

Hadoop Streaming 比较适合做一些简单的任务,比如用 Python 写只有一两
百行的脚本。如果项目比较复杂,或者需要进行比较细致的优化,使用
Streaming 就容易出现一些束手束脚的地方