

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

# 當您啟動 Amazon EMR 叢集時設定應用程式
<a name="emr-plan-software"></a>

當您選取軟體版本時，Amazon EMR 會使用 Amazon Machine Image (AMI) 與 Amazon Linux 以在您啟動叢集時安裝您選擇的軟體，例如 Hadoop、Spark 和 Hive。Amazon EMR 會定期提供新版本、新增新功能、新應用程式和一般更新。我們建議您盡可能使用最新的版本來啟動您的叢集。當您從主控台啟動叢集時，最新版本為預設選項。

如需有關 Amazon EMR 發行和每次發行時可用軟體版本的詳細資訊，請移至 [Amazon EMR 版本指南](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/)。如需有關如何編輯安裝在叢集中的應用程式和軟體預設組態的詳細資訊，請移至《Amazon EMR 版本指南》中的[設定應用程式](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps.html)。有些包含在 Amazon EMR 版本的開放原始碼 Hadoop 和 Spark 版本生態系統元件擁有修補程式和改進功能，這些都記載在 [Amazon EMR 版本指南](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/)中。

 除了可安裝在您叢集上的標準軟體和應用程式外，您可以使用引導操作來安裝自訂軟體。引導操做為叢集啟動時在執行個體上執行的指令碼，且是在叢集建立時新增的新節點上執行。引導操作也有助於叫用每個節點上的 AWS CLI 命令，將物件從 Amazon S3 複製到叢集中的每個節點。

**注意**  
 引導操作在 Amazon EMR 4.x 版和更新版本中的使用方式不同。如需有關這些 Amazon EMR AMI 版本 2.x 和 3.x 差異的詳細資訊，請移至《Amazon EMR 版本指南》中的 [4.x 差異介紹](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-release-differences.html)。

# 建立引導操作，以使用 Amazon EMR 叢集安裝其他軟體
<a name="emr-plan-bootstrap"></a>

您可以使用*引導操作*安裝其他軟體，或自訂叢集執行個體的組態。引導操作是在 Amazon EMR 使用 Amazon Linux Amazon Machine Image (AMI) 啟動執行個體之後，於叢集上執行的指令碼。引導操作執行的時機是在 Amazon EMR 安裝您建立叢集時指定的應用程式之前，以及叢集節點開始處理資料之前。如果您將節點新增到執行中的叢集，引導操作也會以同樣的方式在這些節點上執行。您可以建立自訂引導操作，並且在建立叢集時指定它們。

Amazon EMR 4.x 版不支援大多數針對 Amazon EMR AMI 2.x 和 3.x 版預先定義的引導操作。例如，Amazon EMR 4.x 版不支援 `configure-Hadoop` 和 `configure-daemons`。不過 Amazon EMR 4.x 版原本就支援此功能。如需有關如何將引導操作從 Amazon EMR AMI 2.x 和 3.x 版遷移至 Amazon EMR 4.x 版的詳細資訊，請移至《Amazon EMR 版本指南》中的[使用較早 AMI 版本的 Amazon EMR 自訂叢集和應用程式組態](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-3x-customizeappconfig.html)。

## 引導操作基本概念
<a name="bootstrapUses"></a>

根據預設，引導操作會以 Hadoop 使用者身分執行。您可以使用 `sudo` 以根權限執行引導操作。

所有 Amazon EMR 管理介面都支援引導操作。您可以從主控台或 API 提供多個`bootstrap-actions`參數 AWS CLI，為每個叢集指定最多 16 個引導操作。

在建立叢集時，您可以從 Amazon EMR 主控台選擇性地指定引導操作。

使用 CLI 時，您可以在使用 `create-cluster` 命令建立叢集時新增 `--bootstrap-actions` 參數，藉此將引導操作指令碼的參考傳遞至 Amazon EMR。

```
--bootstrap-actions Path="s3://amzn-s3-demo-bucket/filename",Args=[arg1,arg2]
```

如果引導操作傳回非零的錯誤代碼，Amazon EMR 會將它視為失敗，並終止執行個體。如果有太多執行個體的引導操作失敗，那麼 Amazon EMR 就會終止叢集。如果只有少數幾個執行個體失敗，Amazon EMR 會嘗試重新配置失敗的執行個體並繼續。使用叢集 `lastStateChangeReason` 錯誤代碼來識別引導操作造成的失敗。

## 有條件地執行引導操作
<a name="emr-bootstrap-runif"></a>

為了僅在主節點上執行引導操作，您可以使用具有某些邏輯的自訂引導操作來判斷節點是否為主節點。

```
#!/bin/bash
if grep isMaster /mnt/var/lib/info/instance.json | grep false;
then        
    echo "This is not master node, do nothing,exiting"
    exit 0
fi
echo "This is master, continuing to execute script"
# continue with code logic for master node below
```

下列輸出將從核心節點列印。

```
This is not master node, do nothing, exiting
```

下列輸出將從主節點列印。

```
This is master, continuing to execute script
```

若要使用此邏輯，請將您的引導操作 (包括上述程式碼) 上傳至 Amazon S3 儲存貯體。在 上 AWS CLI，將 `--bootstrap-actions` 參數新增至 `aws emr create-cluster` API 呼叫，並將引導指令碼位置指定為 的值`Path`。

## 關閉動作
<a name="bootstrap_Shutown"></a>

引導操作指令碼可藉由將指令碼寫入 `/mnt/var/lib/instance-controller/public/shutdown-actions/` 目錄的方式，建立一個或多個關機動作。當叢集終止時，此目錄中的所有指令碼就會平行執行。每個指令碼都必須執行並在 60 秒內完成。

如果節點終止時發生錯誤，則不保證關機動作指令碼會執行。

**注意**  
在使用 Amazon EMR 4.0 版及更新版本，您必須在主節點上手動建立 `/mnt/var/lib/instance-controller/public/shutdown-actions/` 目錄。此目錄並非根據存在的目錄；不過，建立之後，此目錄中的指令碼無論如何都會在關機前執行。如需有關連接主節點以建立目錄的詳細資訊，請參閱 [使用 SSH 連線至 Amazon EMR 叢集主節點](emr-connect-master-node-ssh.md)。

## 使用自訂引導操作
<a name="bootstrapCustom"></a>

您可以建立自訂指令碼來執行自訂的引導操作。任何 Amazon EMR 介面都可以參考自訂引導操作。

**注意**  
為了獲得最佳效能，建議您將要與 Amazon EMR 搭配使用的自訂引導操作、指令碼和其他檔案，存放在 AWS 區域 與叢集相同的 Amazon S3 儲存貯體中。

**Topics**
+ [新增自訂引導操作](#custom-bootstrap)
+ [使用自訂引導操作將物件從 Amazon S3 複製到每個節點](#CustomBootstrapCopyS3Object)

### 新增自訂引導操作
<a name="custom-bootstrap"></a>

------
#### [ Console ]

**使用主控台建立具有引導操作的叢集**

1. 登入 AWS 管理主控台，並在 https：//[https://console.aws.amazon.com/emr](https://console.aws.amazon.com/emr) 開啟 Amazon EMR 主控台。

1. 在左側導覽窗格中的 **EC2 上的 EMR** 下，選擇**叢集**，然後選擇**建立叢集**。

1. 在**引導操作**下，選擇**新增**以指定動作的名稱、指令碼位置和選用引數。選取**新增引導操作**。

1. 您也可以選擇新增更多引導操作。

1. 選擇適用於您的叢集的任何其他選項。

1. 若要啟動您的叢集，請選擇**建立叢集**。

------
#### [ CLI ]

**使用 建立具有自訂引導操作的叢集 AWS CLI**

使用 AWS CLI 包含引導操作時，請將 `Path`和 指定`Args`為逗號分隔清單。下列範例不會使用引數清單。
+ 若要啟動附帶自訂引導操作的叢集，請鍵入下列命令，將 *myKey* 取代為 EC2 金鑰對的名稱。包含 `--bootstrap-actions` 作為參數，並將引導指令碼位置指定為 `Path` 的值。
  + Linux、UNIX 及 Mac OS X 使用者：

    ```
    1. aws emr create-cluster --name "Test cluster" --release-label emr-4.0.0 \
    2. --use-default-roles --ec2-attributes KeyName=myKey \
    3. --applications Name=Hive Name=Pig \
    4. --instance-count 3 --instance-type m5.xlarge \
    5. --bootstrap-actions Path="s3://elasticmapreduce/bootstrap-actions/download.sh"
    ```
  + Windows 使用者：

    ```
    1. aws emr create-cluster --name "Test cluster" --release-label emr-4.2.0 --use-default-roles --ec2-attributes KeyName=myKey --applications Name=Hive Name=Pig --instance-count 3 --instance-type m5.xlarge --bootstrap-actions Path="s3://elasticmapreduce/bootstrap-actions/download.sh"
    ```

  如果您在未使用 `--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)。

------

### 使用自訂引導操作將物件從 Amazon S3 複製到每個節點
<a name="CustomBootstrapCopyS3Object"></a>

您可以使用引導操作，在應用程式安裝之前將物件從 Amazon S3 複製到叢集中的每個節點。 AWS CLI 安裝在叢集的每個節點上，因此您的引導操作可以呼叫 AWS CLI 命令。

下列範例示範簡單的引導操作指令碼，這會將檔案 `myfile.jar` 從 Amazon S3 複製到每個叢集節點上的本機資料夾 `/mnt1/myfolder` 中。指令碼會儲存至 Amazon S3，其檔案名稱為 `copymyfile.sh` 且包含下列內容。

```
#!/bin/bash
aws s3 cp s3://amzn-s3-demo-bucket/myfilefolder/myfile.jar /mnt1/myfolder
```

當您啟動叢集時，您會指定指令碼。下列 AWS CLI 範例示範了這一點：

```
aws emr create-cluster --name "Test cluster" --release-label emr-7.12.0 \
--use-default-roles --ec2-attributes KeyName=myKey \
--applications Name=Hive Name=Pig \
--instance-count 3 --instance-type m5.xlarge \
--bootstrap-actions Path="s3://amzn-s3-demo-bucket/myscriptfolder/copymyfile.sh"
```