

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

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

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

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


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

# 提交串流步驟
<a name="CLI_CreateStreaming"></a>

本章節涵蓋將串流步驟提交到叢集的基本知識。串流應用程式會從標準輸入讀取輸入，然後針對每個輸入執行指令碼或可執行檔 (稱為映射器)。每個輸入的結果通常會儲存在本機 (通常在 Hadoop 分散式檔案系統 (HDFS) 分割區)。在映射器處理完所有輸入後，第二個指令碼或可執行檔 (稱為縮減器) 會處理映射器結果。縮減器的結果會傳送到標準輸出。您可以將一系列串流步驟串在一起，其中一個步驟的輸出會成為另一個步驟的輸入。

可以參考映射器和縮減器做為檔案，或您可以提供 Java 類別。您可以任何支援的語言 (包括 Ruby、Perl、Python、PHP 或 Bash) 實作映射器和縮減器。

## 使用主控台提交串流步驟
<a name="emr-dev-create-stream-console"></a>

此範例描述了如何使用 Amazon EMR 主控台來將串流步驟提交至執行中的叢集。

**若要提交串流步驟**

1. 在 https：//[https://console.aws.amazon.com/emr](https://console.aws.amazon.com/emr/) 開啟 Amazon EMR 主控台。

1. 在 **Cluster List (叢集清單)** 中，選擇您的叢集名稱。

1. 向下捲動至 **Steps (步驟)** 區段並展開，接著選擇 **Add step (新增步驟)**。

1. 在 **Add Step (新增步驟)** 對話方塊中：
   + 對於 **Step type (步驟類型)**，選擇 **Streaming program (串流程式)**。
   + 對於 **Name (名稱)**，接受預設名稱 (串流程式) 或輸入新名稱。
   + 對於 **Mapper (映射器)**，輸入或瀏覽到 Hadoop 中的映射器類別位置，或映射器可執行檔 (例如 Python 程式) 所在的 S3 儲存貯體。路徑值的格式必須為 *BucketName*/*path*/*MapperExecutable*。
   + 對於**Reducer (縮減器)**，輸入或瀏覽到 Hadoop 中的縮減器類別位置，或縮減器可執行檔 (例如 Python 程式) 所在的 S3 儲存貯體。路徑值的格式必須為 *BucketName*/*path*/*MapperExecutable*。Amazon EMR 支援特殊*彙總*關鍵字。如需更多資訊，請參閱 Hadoop 提供的彙總程式庫。
   + 對於 **Input S3 location (輸入 S3 位置)**，輸入或瀏覽到輸入資料的位置。
   + 針對**輸出 S3 位置**，輸入或瀏覽至 Amazon S3 輸出儲存貯體的名稱。
   + 針對 **Arguments (引數)**，將欄位保留空白。
   + 針對 **Action on failure (失敗的動作)**，接受預設選項 (**Continue (繼續)**)。

1. 選擇**新增**。該步驟會出現在主控台中，且狀態為待定。

1. 隨著步驟的執行，步驟的狀態會依序從 Pending (待定)、Running (執行中) 變成 Completed (完成)。若要更新狀態，您可以選擇 Actions (動作) 欄上的 **Refresh (重新整理)** 圖示。

## AWS CLI
<a name="emr-dev-create-stream-cli"></a>

這些範例示範如何使用 AWS CLI 來建立叢集並提交串流步驟。

**使用 建立叢集並提交串流步驟 AWS CLI**
+ 若要使用 建立叢集並提交串流步驟 AWS CLI，請輸入下列命令，並以 EC2 金鑰對的名稱取代 *myKey*。請注意，`--files` 的引數應該是指令碼位置的 Amazon S3 路徑，`-mapper` 和 `-reducer` 的引數應是對應指令碼檔案的名稱。

  ```
  aws emr create-cluster --name "Test cluster" --release-label emr-7.12.0 --applications Name=Hue Name=Hive Name=Pig --use-default-roles \
  --ec2-attributes KeyName=myKey --instance-type m5.xlarge --instance-count 3 \
  --steps Type=STREAMING,Name="Streaming Program",ActionOnFailure=CONTINUE,Args=[--files,pathtoscripts,-mapper,mapperscript,-reducer,reducerscript,aggregate,-input,pathtoinputdata,-output,pathtooutputbucket]
  ```
**注意**  
包含 Linux 行接續字元 (\$1) 是為了提高可讀性。它們可以在 Linux 命令中移除或使用。對於 Windows，請將其移除或取代為插入符號 (^)。

  若您未使用 `--instance-groups` 參數指定執行個體計數，即會啟動單一主節點，且剩餘執行個體會以核心節點的形式啟動。所有節點都會使用命令中指定的執行個體類型。
**注意**  
如果您先前尚未建立預設 Amazon EMR 服務角色和 EC2 執行個體設定檔，請先鍵入 aws `emr create-default-roles` 來建立這些項目，然後再鍵入 `create-cluster` 子命令。

  如需在 中使用 Amazon EMR 命令的詳細資訊 AWS CLI，請參閱 [https://docs.aws.amazon.com/cli/latest/reference/emr](https://docs.aws.amazon.com/cli/latest/reference/emr)。