建立引導操作以安裝其他軟體 - Amazon EMR

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

建立引導操作以安裝其他軟體

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

Amazon 版本 4.x 中不支持 Amazon EMR AMI 版本 2.x 和 3.x 的大多數預先定義的引導操作。EMR例如configure-Hadoopconfigure-daemonsAmazon EMR 版本 4.x 中不受支持。相反,Amazon 4.x EMR 版本本地提供了此功能。如需如何將啟動程序動作從 Amazon 2.x 和 3.x EMR AMI 版遷移到 Amazon 4.x 版的詳細資訊,請參閱 Amazon EMR 發行指南EMR中的舊AMI版 Amazon 自訂叢集和應用程式組態。EMR

引導操作基本概念

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

所有 Amazon EMR 管理界面都支援啟動程序動作。您可以透過從主控台提供多個bootstrap-actions參數,為每個叢集指定最多 16 個啟動程序動作, AWS CLI,或API。

在建立叢集時,您可以選擇性地從 Amazon EMR 主控台指定啟動程序動作。

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

--bootstrap-actions Path="s3://mybucket/filename",Args=[arg1,arg2]

如果啟動程序動作傳回非零錯誤碼,Amazon 會EMR將其視為失敗並終止執行個體。如果太多執行個體失敗其啟動程序動作,Amazon 就EMR會終止叢集。如果只有少數執行個體失敗,Amazon 會EMR嘗試重新分配失敗的執行個體並繼續。使用叢集 lastStateChangeReason 錯誤代碼來識別引導操作造成的失敗。

有條件地執行引導操作

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

#!/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-clusterAPI呼叫,並將啟動程序指令碼位置指定為的值Path

關閉動作

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

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

注意

使用 Amazon 4.0 及更新EMR版本時,您必須在主節點上手動建立/mnt/var/lib/instance-controller/public/shutdown-actions/目錄。此目錄並非根據存在的目錄;不過,建立之後,此目錄中的指令碼無論如何都會在關機前執行。如需有關連接主節點以建立目錄的詳細資訊,請參閱 使用以下方式 Connect 到主節點 SSH

使用自訂引導操作

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

注意

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

新增自訂引導操作

Console
使用主控台使用啟動程序動作建立叢集
  1. 登入 AWS Management Console,然後在 https://console.aws.amazon.com/em r 打開 Amazon EMR 控制台。

  2. EC2在左側導覽窗格的 [開EMR啟] 下,選擇 [集],然後選擇 [建立叢集]。

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

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

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

  6. 若要啟動您的叢集,請選擇建立叢集

CLI
使用自訂啟動程序動作建立叢集 AWS CLI

使用時 AWS CLI 若要包含啟動程序動作,請將Path和指定Args為逗號分隔清單。下列範例不會使用引數清單。

  • 要使用自定義引導操作啟動集群,請鍵入以下命令,替換 myKey 使用您的 EC2 key pair 的名稱。包含 --bootstrap-actions 作為參數,並將引導指令碼位置指定為 Path 的值。

    • 和 Mac OS X 使用者:UNIX

      aws emr create-cluster --name "Test cluster" --release-label emr-4.0.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"
    • Windows 使用者:

      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-rolescreate-cluster子指令之前輸入以建立它們。

    有關在中使用 Amazon EMR 命令的更多信息 AWS CLI,請參閱https://docs.aws.amazon.com/cli/latest/reference/emr

使用自訂引導操作將物件從 Amazon S3 複製到每個節點

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

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

#!/bin/bash aws s3 cp s3://mybucket/myfilefolder/myfile.jar /mnt1/myfolder

當您啟動叢集時,您會指定指令碼。如下所示 AWS CLI 例子演示了這一點:

aws emr create-cluster --name "Test cluster" --release-label emr-7.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://mybucket/myscriptfolder/copymyfile.sh"