

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 通过流式处理来处理数据
<a name="UseCase_Streaming"></a>

Hadoop 流媒体是 Hadoop 附带的一个实用程序，它使您能够使用 Java 以外的语言开发可 MapReduce执行文件。流式处理是以 JAR 文件的形式实现的，这样您就可以像运行标准 JAR 文件一样，从 Amazon EMR API 或命令行运行它。

此部分介绍如何结合使用 Streaming 与 Amazon EMR。

**注意**  
Apache Hadoop Streaming 是一种独立工具。因此，这里并不介绍其所有函数和参数。[有关 Hadoop 直播的更多信息，请访问 http://hadoop.apache。 org/docs/stable/hadoop-streaming/HadoopStreaming.html。](http://hadoop.apache.org/docs/stable/hadoop-streaming/HadoopStreaming.html)

## 使用 Hadoop Streaming 实用工具
<a name="HadoopStreamCommands"></a>

此部分介绍如何使用 Hadoop 的 Streaming 实用工具。


**Hadoop 进程**  

|  |  | 
| --- |--- |
| 1 | 以您所选择的编程语言编写映射器和 Reducer 可执行文件。<br />按照 Hadoop 的文档中的指示编写流式处理可执行文件。该等程序应从标准输入读取其输入内容，并通过标准输出来输出数据。默认情况下，输入/输出的每一行都代表一条记录，并且每一行中的第一个制表符都用作密钥与值之间的分隔符。 | 
| 2 | 在本地测试您的可执行文件，并将它们上载到 Amazon S3。 | 
| 3 | 使用 Amazon EMR 命令行界面或 Amazon EMR 控制台可运行您的应用程序。 | 

每个映射器脚本都会以单独进程的形式在集群中启动。每个 Reducer 可执行文件都会通过任务流程将映射器可执行文件的输出转到数据输出中。

大多数 Streaming 应用程序都需要 `input`、`output`、`mapper` 和 `reducer` 参数。下表描述了上述参数和其它可选参数。


| 参数 | 说明 | 必填 | 
| --- | --- | --- | 
| -input | 输入数据在 Amazon S3 上的位置。<br />类型：字符串<br />默认值：无<br />约束：URI。如果没有指定协议，那么它就可以使用集群的默认文件系统。 | 是 | 
| -output | Amazon S3 上的位置，该位置为 Amazon EMR 上载已处理数据的地方。<br />类型：字符串<br />默认值：无<br />约束：URI<br />默认值：如果没有指定位置，那么 `input` 会将数据上载至 Amazon EMR 指定的位置。 | 是 | 
| -mapper | 映射器可执行文件的名称。<br />类型：字符串<br />默认值：无 | 是 | 
| -reducer | Reducer 可执行文件的名称。<br />类型：字符串<br />默认值：无 | 是 | 
| -cacheFile | 一个 Amazon S3 位置，其中包含一些文件可供 Hadoop 复制到本地工作目录（主要目的是提高性能）。<br />类型：字符串<br />默认值：无<br />约束：[URI]\#[要在工作目录中创建的符号链接名称]  | 否 | 
| -cacheArchive | 提取到工作目录的 JAR 文件。<br />类型：字符串<br />默认值：无<br />约束：[URI]\#[要在工作目录中创建的符号链接目录名称]  | 否 | 
| -combiner | 合并结果<br />类型：字符串<br />默认值：无<br />约束：Java 类名 | 否 | 

以下示例代码是写入 Python 的映射器可执行文件。此脚本是 WordCount 示例应用程序的一部分。

```
 1. #!/usr/bin/python
 2. import sys
 3. 
 4. def main(argv):
 5.   line = sys.stdin.readline()
 6.   try:
 7.     while line:
 8.       line = line.rstrip()
 9.       words = line.split()
10.       for word in words:
11.         print "LongValueSum:" + word + "\t" + "1"
12.       line = sys.stdin.readline()
13.   except "end of file":
14.     return None
15. if __name__ == "__main__":
16.   main(sys.argv)
```