

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用串流處理資料
<a name="UseCase_Streaming"></a>

Hadoop 串流是 Hadoop 隨附的公用程式，可讓您以 Java 以外的語言開發 MapReduce 可執行檔。串流是以 JAR 檔的形式進行實作，因此您可以從 Amazon EMR API 或命令列 (就像標準的 JAR 檔案) 執行它。

本章節描述了如何使用串流搭配 Amazon EMR。

**注意**  
Apache Hadoop 串流是一個獨立的工具。因此，這裡並不會敘述其所有函數和參數。如需有關 Hadoop 串流的詳細資訊，請前往 [http://hadoop.apache.org/docs/stable/hadoop-streaming/HadoopStreaming.html](http://hadoop.apache.org/docs/stable/hadoop-streaming/HadoopStreaming.html)。

## 使用 Hadoop 串流公用程式
<a name="HadoopStreamCommands"></a>

本章節將描述了如何使用 Hadoop 的串流公用程式。


**Hadoop 程序**  

|  |  | 
| --- |--- |
| 1 | 以您選擇的程式設計語言來寫入映射器和縮減器可執行檔。<br />遵照 Hadoop 文件中的指示來撰寫串流可執行檔。此程式應透過標準輸出從標準輸入和輸出資料讀取其輸入。根據預設，每列輸入/輸出代表一個記錄且每列的第一個標籤會用做為金鑰和值的分隔符號。 | 
| 2 | 在本機上測試可執行檔並將它們上傳到 Amazon S3。 | 
| 3 | 使用 Amazon EMR 命令列界面或 Amazon EMR 主控台來執行您的應用程式。 | 

每個映射器指令碼會在叢集中以個別程序來啟動。每個縮減器可執行檔會將映射器可執行檔的輸出轉換為任務流程的資料輸出。

大多數串流應用程式都需要 `input`、`output`、`mapper` 和 `reducer` 參數。下表描述這些和其他可選參數。


| 參數 | Description | 必要 | 
| --- | --- | --- | 
| -input | Amazon S3 上的輸入資料位置。<br />類型：字串<br />預設：無<br />限制條件：URI。如果沒有指定通訊協定，則會使用叢集的預設檔案系統。 | 是 | 
| -輸出 | 在 Amazon S3 上 Amazon EMR 上傳已處理資料的位置。<br />類型：字串<br />預設：無<br />限制條件：URI<br />預設：如果未指定位置，Amazon EMR 會將資料上傳至 `input` 指定的位置。 | 是 | 
| -mapper | 映射器可執行檔的名稱。<br />類型：字串<br />預設：無 | 是 | 
| -reducer | 縮減器可執行檔的名稱。<br />類型：字串<br />預設：無 | 是 | 
| -cacheFile | 包含 Hadoop 檔案的 Amazon S3 位置會複製到本機工作目錄 (主要是為了改善效能)。<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)
```