

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

# 建立或執行 Hadoop 應用程式
<a name="emr-hadoop-application"></a>

**Topics**
+ [使用 Amazon EMR 建置二進位檔](emr-build-binaries.md)
+ [使用串流處理資料](UseCase_Streaming.md)
+ [使用自訂 JAR 處理資料](UseCase_CustomJar.md)

# 使用 Amazon EMR 建置二進位檔
<a name="emr-build-binaries"></a>

您可以使用 Amazon EMR 作為建置環境，以編譯要用於叢集內的程式。與 Amazon EMR 搭配使用的程式，必須在執行 Amazon EMR 所用相同 Linux 版本的系統上進行編譯。若為 32 位元版本，應在 32 位元的裝置上編譯，或開啟 32 位元的跨編譯選項。若為 64 位元版本，則需在 64 位元的裝置上編譯，或開啟 64 位元的跨編譯選項。如需有關 EC2 執行個體版本的詳細資訊，請參閱《Amazon EMR 管理指南》**中的[規劃與設定 EC2 執行個體](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-ec2-instances.html)。支援的程式設計語言包含 C\$1\$1、Python 及 C\$1。

下表概略列出了使用 Amazon EMR 建置和測試應用程式所需的步驟。


**模組建置流程**  

|  |  | 
| --- |--- |
|  1 |  連接至您的叢集主節點。 | 
|  2  |  複製來源檔案到主節點。 | 
|  3  |  建置二進位檔並進行必要的最佳化。 | 
|  4 |  將二進位檔從主節點複製到 Amazon S3。 | 

各步驟的詳細資訊請見以下幾節。

**連接至叢集主節點**
+ 請按《Amazon EMR 管理指南》**中的[使用 SSH 連線至主節點](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-connect-master-node-ssh.html)的說明執行操作。

**複製來源檔案到主節點**

1. 將來源檔案置於 Amazon S3 儲存貯體內。若要了解如何建立 儲存貯體和如何將資料移至 Amazon S3，請參閱《Amazon Simple Storage Service 使用者指南》[https://docs.aws.amazon.com/AmazonS3/latest/userguide/](https://docs.aws.amazon.com/AmazonS3/latest/userguide/)。

1. 輸入類似以下內容的命令，在 Hadoop 叢集上建立一個來源檔案專用的資料夾：

   ```
   mkdir SourceFiles
   ```

1. 輸入類似以下內容的命令，將來源檔案從 Amazon S3 複製到主節點：

   ```
   hadoop fs -get s3://amzn-s3-demo-bucket/SourceFiles SourceFiles
   ```

**建置二進位檔並進行必要的最佳化**  
建置二進位檔的方式取決於多種因素。請按照您所使用的特定建置工具的說明，開始建立和設定您的環境。您可以使用 Hadoop 系統規格的命令來取得叢集資訊，以判斷該如何安裝建置環境。

**辨識系統規格**
+ 請使用以下命令來確認您要用來建構二進位檔的架構。

  1. 若要查看 Debian 版本，請輸入以下命令：

     ```
     master$ cat /etc/issue
     ```

     輸出結果類似如下。

     ```
     Debian GNU/Linux 5.0
     ```

  1. 若要查看公有 DNS 名稱和處理器大小，請輸入以下命令：

     ```
     master$ uname -a
     ```

     輸出結果類似如下。

     ```
     Linux domU-12-31-39-17-29-39.compute-1.internal 2.6.21.7-2.fc8xen #1 SMP Fri Feb 15 12:34:28 EST 2008 x86_64 GNU/Linux
     ```

  1. 若要查看處理器速度，請輸入以下命令：

     ```
     master$ cat /proc/cpuinfo
     ```

     輸出結果類似如下。

     ```
     processor : 0
     vendor_id : GenuineIntel
     model name : Intel(R) Xeon(R) CPU E5430 @ 2.66GHz
     flags : fpu tsc msr pae mce cx8 apic mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx lm constant_tsc pni monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr cda lahf_lm
     ...
     ```

二進位檔建置完成後，就可以將檔案複製到 Amazon S3。

**若要將二進位檔從主節點複製到 Amazon S3**
+ 請輸入以下命令，將二進位檔複製到您的 Amazon S3 儲存貯體：

  ```
  hadoop fs -put BinaryFiles s3://amzn-s3-demo-bucket/BinaryDestination
  ```

# 使用串流處理資料
<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)。

# 使用自訂 JAR 處理資料
<a name="UseCase_CustomJar"></a>

自訂 JAR 會執行您可以上傳至 Amazon S3 的編譯 Java 程式。您應該針對想要啟動 Hadoop 版本編譯程式，然後將 `CUSTOM_JAR` 步驟提交到您的 Amazon EMR 叢集。如需有關如何編譯 JAR 檔案的詳細資訊，請參閱 [使用 Amazon EMR 建置二進位檔](emr-build-binaries.md)。

如需有關建置 Hadoop MapReduce 應用程式的詳細資訊，請參閱 Apache Hadoop 文件中的 [MapReduce 教學課程](http://hadoop.apache.org/docs/stable/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html)。

**Topics**
+ [提交自訂 JAR 步驟](emr-launch-custom-jar-cli.md)

# 提交自訂 JAR 步驟
<a name="emr-launch-custom-jar-cli"></a>

自訂 JAR 會執行您可以上傳至 Amazon S3 的編譯 Java 程式。您應該針對想要啟動 Hadoop 版本編譯程式，然後將 `CUSTOM_JAR` 步驟提交到您的 Amazon EMR 叢集。如需有關如何編譯 JAR 檔案的詳細資訊，請參閱 [使用 Amazon EMR 建置二進位檔](emr-build-binaries.md)。

如需有關建置 Hadoop MapReduce 應用程式的詳細資訊，請參閱 Apache Hadoop 文件中的 [MapReduce 教學課程](http://hadoop.apache.org/docs/stable/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html)。

本章節涵蓋在 Amazon EMR 中提交自訂 JAR 步驟的基本知識。提交自訂 JAR 步驟可讓您撰寫指令碼來使用 Java 程式設計語言處理資料。

## 使用主控台提交自訂 JAR 步驟
<a name="ConsoleCreatingaCustomJARJob"></a>

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

**若要使用主控台提交自訂 JAR 步驟**

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 (步驟類型)**，選擇 **Custom JAR (自訂 JAR)**。
   + 對於 **Name (名稱)**，接受預設名稱 (自訂 JAR) 或輸入新名稱。
   + 對於 **JAR S3 location (JAR S3 位置)**，輸入或瀏覽到 JAR 檔案的位置。JAR 位置可能是連接至 S3 或是類別路徑中完整 Java 類別的路徑。
   + 對於 **Argument (引數)**，以空格分隔字串的形式輸入任何必要的引數，或將欄位留白。
   + 針對 **Action on failure (失敗的動作)**，接受預設選項 (**Continue (繼續)**)。

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

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

## 使用 啟動叢集並提交自訂 JAR 步驟 AWS CLI
<a name="emr-dev-create-jar-cli"></a>

**使用 啟動叢集並提交自訂 JAR 步驟 AWS CLI**

若要啟動叢集並使用 提交自訂 JAR 步驟 AWS CLI，請使用 `--steps` 參數輸入 `create-cluster`子命令。
+ 若要啟動叢集並提交自訂 JAR 步驟，請輸入下列命令，將 *myKey* 取代為您的 EC2 金鑰對名稱，並將 *amzn-s3-demo-bucket* 取代為您的儲存貯體名稱。

  ```
  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=CUSTOM_JAR,Name="Custom JAR Step",ActionOnFailure=CONTINUE,Jar=pathtojarfile,Args=["pathtoinputdata","pathtooutputbucket","arg1","arg2"]
  ```
**注意**  
包含 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)。

## 第三方相依性
<a name="emr-custom-jar-dependency"></a>

有時可能需要在 MapReduce classpath JAR 中包含此相依性以與您的程式搭配使用。執行此動作有兩種選項：
+ 在步驟選項中包含 `--libjars s3://URI_to_JAR` 以進行[使用 啟動叢集並提交自訂 JAR 步驟 AWS CLI](#emr-dev-create-jar-cli)所述的程序。
+ 使用 `mapred-site.xml` 中經修改的 `mapreduce.application.classpath` 設定來啟動叢集。使用 `mapred-site` 組態分類。若要使用 步驟建立叢集 AWS CLI，如下所示：

  ```
  aws emr create-cluster --release-label emr-7.12.0 \
  --applications Name=Hue Name=Hive Name=Pig --use-default-roles \
  --instance-type m5.xlarge --instance-count 2  --ec2-attributes KeyName=myKey \
  --steps Type=CUSTOM_JAR,Name="Custom JAR Step",ActionOnFailure=CONTINUE,Jar=pathtojarfile,Args=["pathtoinputdata","pathtooutputbucket","arg1","arg2"] \
  --configurations https://s3.amazonaws.com/amzn-s3-demo-bucket/myfolder/myConfig.json
  ```

  `myConfig.json`:

  ```
  [
      {
        "Classification": "mapred-site",
        "Properties": {
          "mapreduce.application.classpath": "path1,path2"
        }
      }
    ]
  ```

  以逗號分隔的路徑清單應附加到每個任務的 JVM classpath。