Hadoop Streaming 及其优缺点

在本文中介绍了 Hadoop Streaming 及其优缺点,以及运行 Streaming 程序时的常用参数。

Hadoop Streaming 介绍

Hadoop Streaming 提供了一个便于进行 MapReduce 编程的工具包,使用它可以基于一些可执行命令、脚本语言或其他编程语言来实现 Mapper 和 Reducer,从而充分利用 Hadoop 并行计算框架的优势和能力来处理大数据。

Streaming 程序的运行过程就是通过将用其他语言编写的 mapper 和 reducer 通过参数传给一个事先写好的 Java 程序( Hadoop 自带的 *-streaming.jar),这个 Java 程序会负责创建 map-reduce 作业,另开一个进程来运行 mapper,将得到的输入通过 stdin 传给它,再将 mapper 处理后输出到 stdout 的数据交给 Hadoop,partition 和 sort 之后,再另开进程运行 reducer,同样地通过 stdin/stdout 得到最终结果。因此,我们只需要在其他语言编写的程序里,通过 stdin 接收数据,再将处理过的数据输出到 stdout,Hadoop streaming 就能通过这个 Java 的 wrapper 帮我们解决中间繁琐的步骤,运行分布式程序。

Hadoop Streaming 优缺点

优点

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

缺点

  • 只能通过命令行参数来控制 MapReduce 框架,不像 Java 的程序那样可以在代码里使用 API,控制力比较弱。
  • 因为中间隔着一层处理,效率会比较慢。
  • 只能处理能够在标准输入输出中显示的数据。

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

使用管道进行本地调试

1
$ cat input/* | python mapper.py | sort | python reducer.py

Hadoop Streaming 执行命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
hadoop jar D:/bigdata/hadoop-2.7.4/share/hadoop/tools/lib/hadoop-streaming-2.7.4.jar \ 
-D stream.non.zero.exit.is.failure=false \
-input /user/Leo/input/books.json \
-output /user/Leo/output \
-mapper "python mapper.py" \
-reducer "python reducer.py" \
-file C:/Users/Administrator/Desktop/MingDong_Work/Work_2/mapper.py \
-file C:/Users/Administrator/Desktop/MingDong_Work/Work_2/reducer.py

解释:
1、jar 后面跟的是Jar包的路径,官方提倡用环境变量加路径的方式,我这为了演示用了绝对路径进行展示
2、-D stream.non.zero.exit.is.failure=false 这句话的意思是如果函数返回值(即mapper或reducer没有return 0,则函数为异常结果.加了这句就可以跳过检查.)
3、input: 就是HDFS的文件
4、output: 就是M-R任务结束后的文件存放的地方
5、mapper: 指定执行mapper的脚本或代码
6、reducer: 指定执行reducer的脚本或代码
7、-file: 指定代码的位置(多个文件用-files,为了展示更清晰,我用了旧版的-file的形式进行展示)


$ ${HADOOP_HOME}/bin/hadoop jar ${HADOOP_HOME}/share/hadoop/tools/lib/hadoop-streaming-2.6.0.jar \
-input <输入目录> \ # 可以指定多个输入路径,例如:-input '/user/foo/dir1' -input '/user/foo/dir2'
-inputformat <输入格式 JavaClassName> \
-output <输出目录> \
-outputformat <输出格式 JavaClassName> \
-mapper <mapper executable or JavaClassName> \
-reducer <reducer executable or JavaClassName> \
-combiner <combiner executable or JavaClassName> \
-partitioner <JavaClassName> \
-cmdenv <name=value> \ # 可以传递环境变量,可以当作参数传入到任务中,可以配置多个
-file <依赖的文件> \ # 配置文件,字典等依赖
-D <name=value> \ # 作业的属性配置

本文作者:Qiu Qingyu
版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 CN许可协议。转载请注明出处!
本文永久链接:http://qiuqingyu.cn/2019/01/27/Hadoop Streaming 及其优缺点/