Hadoop Streaming 是 Hadoop 生态系统中的一个工具,它允许用户使用任意可执行程序(如脚本或命令行工具)作为 Map 和 Reduce 阶段的处理程序,而不必使用 Java 编写完整的 MapReduce 应用。这个特性极大地拓宽了 Hadoop 的应用范围,因为用户可以用熟悉的编程语言如 Python、Ruby 或 Bash shell 来处理数据。
**Hadoop Streaming 的工作原理**
Hadoop Streaming 通过 Unix 标准输入和输出(stdin 和 stdout)作为 MapReduce 程序与 Hadoop 框架之间的通信接口。Map任务的输入是从输入文件中逐行读取的,而 Map 函数的输出则必须是键值对,以制表符(\t)分隔。Reduce 函数的输入同样是由 Map 输出的键值对组成,同样遵循相同的分隔规则。这种设计使得非 Java 语言也能轻松地参与到 MapReduce 处理流程中。
**Map 阶段**
在 Map 阶段,用户编写的可执行程序从 stdin 接收输入数据,通常是一行文本。然后,程序对每一行数据进行处理并生成键值对,输出到 stdout。在 Ruby 示例中,`max_temperature_map.rb` 脚本从输入数据中提取年份和温度,并过滤掉无效记录,生成格式化的键值对。
**Reduce 阶段**
在 Reduce 阶段,用户提供的可执行程序同样通过 stdin 读取数据,这次是按键分组的 Map 输出。Reduce 函数对每个键的所有值进行处理,例如在 `max_temperature_reduce.rb` 示例中,它找到对应键的最大温度值。处理完后,Reduce 程序将结果输出到 stdout,形成最终的结果键值对。
**运行 Hadoop Streaming 作业**
执行 Hadoop Streaming 作业通常涉及以下步骤:
1. 指定 Hadoop Streaming JAR 文件的位置。
2. 指定输入数据的路径。
3. 指定输出结果的路径。
4. 分别提供 Map 和 Reduce 可执行程序的位置。
例如:
```
hadoop jar $HADOOP_INSTALL/contrib/streaming/hadoop-*-streaming.jar \
-input input/ncdc/sample.txt \
-output output \
-mapper ch02/src/main/ruby/max_temperature_map.rb \
-reducer ch02/src/main/ruby/max_temperature_reduce.rb
```
在这个命令中,`$HADOOP_INSTALL` 指向 Hadoop 安装目录,`input/ncdc/sample.txt` 是输入文件,`output` 是输出目录,`max_temperature_map.rb` 和 `max_temperature_reduce.rb` 分别是 Map 和 Reduce 的脚本。
**其他支持的编程语言**
除了 Ruby,Hadoop Streaming 还支持许多其他语言,如 Python,Python 示例中展示了如何导入 `re` 模块来处理文本数据,实现类似的功能。
Hadoop Streaming 提供了一种灵活的方式来利用非 Java 语言处理大规模数据,这对于那些不熟悉 Java 或者希望利用现有脚本语言技能的开发人员来说非常有用。尽管它的能力有限,不适合所有类型的数据处理,但对于文本处理和简单的数据分析任务,Hadoop Streaming 是一个快速有效的解决方案。