

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

# 端對端 Amazon EMR Java 原始程式碼範例
<a name="emr-common-programming-sample"></a>

開發人員能夠使用自訂 Java 程式碼來呼叫 Amazon EMR API，然後透過 Amazon EMR 主控台或 CLI 執行相同的操作。本節提供安裝 AWS Toolkit for Eclipse 和執行全功能 Java 原始程式碼範例所需的end-to-end步驟，這些範例會將步驟新增至 Amazon EMR 叢集。

**注意**  
此範例雖著重於 Java，但 Amazon EMR 也推出了一系列的 Amazon EMR 軟體開發套件來支援多種程式語言。如需詳細資訊，請參閱[使用軟體開發套件呼叫 Amazon EMR API](call-emr-using-sdks.md)。

 此 Java 原始程式碼範例示範如何使用 Amazon EMR API 執行以下任務：
+ 擷取 AWS 憑證並將其傳送至 Amazon EMR 以進行 API 呼叫
+ 設定新的自訂步驟與新的預先定義步驟
+ 在現有 Amazon EMR 叢集新增步驟
+ 從執行中的叢集擷取叢集步驟 ID

**注意**  
此範例將示範如何在現有叢集新增步驟，因此要求您在帳戶中擁有作用中的叢集。

在開始之前，請先安裝符合電腦平台的 **Eclipse IDE for Java EE Developers (Eclipse IDE for Java EE Developers)** 版本。如需詳細資訊，請前往 [Eclipse 下載專區](http://www.eclipse.org/downloads/)。

接著，安裝適用於 Eclipse 的資料庫開發外掛程式。

**安裝資料庫開發 Eclipse 外掛程式**

1. 開啟 Eclipse IDE。

1. 選擇 **Help (說明)**，接著選擇 **Install New Software (安裝新軟體)**。

1. 在 **Work with: (使用以下路徑：)** 欄位中，輸入 **http://download.eclipse.org/releases/kepler** 或符合 Eclipse IDE 版本編號的路徑。

1. 在項目清單中，請選擇 **Database Development (資料庫開發)**，並按一下 **Finish (完成)**。

1. 在提示時重新啟動 Eclipse。

接著安裝 Toolkit for Eclipse，讓有用且預先設定的原始程式碼專案範本可以使用。

**若要安裝 Toolkit for Eclipse**

1. 開啟 Eclipse IDE。

1. 選擇 **Help (說明)**，接著選擇 **Install New Software (安裝新軟體)**。

1. 在 **Work with: (使用：)** 欄位中，輸入 **https://aws.amazon.com/eclipse**。

1. 在項目清單中，選擇 **AWS Toolkit for Eclipse** 和**完成**。

1. 在提示時重新啟動 Eclipse。

接著，建立新的 AWS Java 專案並執行範例 Java 原始程式碼。

**建立新的 AWS Java 專案**

1. 開啟 Eclipse IDE。

1. 依序選擇 **File (檔案)**、**New (新增)**，接著選擇 **Other (其他)**。

1. 在**選取精靈**對話方塊中，選擇 **AWS Java 專案**，並按一下**下一步**。

1. 在**新 AWS Java 專案**對話方塊中的 **Project name:** 欄位中，輸入新專案的名稱，例如 **EMR-sample-code**。

1. 選擇**設定 AWS 帳戶...**，輸入您的公有和私有存取金鑰，然後選擇**完成**。如需有關建立存取金鑰的詳細資訊，請參閱 *Amazon Web Services 一般參考*中的[如何取得安全憑證？](https://docs.aws.amazon.com/general/latest/gr/getting-aws-sec-creds.html)。
**注意**  
**請勿**直接在程式碼內嵌存取金鑰。Amazon EMR 軟體開發套件可讓您將存取金鑰放入已知位置，如此一來，就不必將其留在程式碼中。

1. 在新的 Java 專案中按一下滑鼠右鍵並選取 **src (src)** 資料夾，然後選擇 **New (新增)**，再選擇 **Class (類別)**。

1. 在 **Java Class (Java 類別)** 對話方塊的 **Name (名稱)** 欄位中，輸入新類別的名稱，例如 **main**。

1. 在 **Which method stubs would you like to create? (您希望建立哪些 Stub 方法？)** 區段中，選擇 **public static void main(String[] args) (public static void main(String[] args))**，然後按一下 **Finish (完成)**。

1. 在新的類別中輸入 Java 來源碼，並為範例內的類別和方法新增適當的 **import (匯入)** 陳述式。為方便起見，完整的原始程式碼列表如下所示。
**注意**  
在下列範例程式碼中，將範例叢集 ID (JobFlowId) 取代為您帳戶中的有效叢集 ID{{`j-xxxxxxxxxxxx`}}，可在 中找到， AWS 管理主控台 或使用下列 AWS CLI 命令：  

   ```
   aws emr list-clusters --active | grep "Id"
   ```
除此之外，您還需要將範例 Amazon S3 路徑 ({{`s3://path/to/my/jarfolder`}}) 替換成 JAR 的有效路徑。最後，將範例類別名稱 ({{`com.my.Main1`}})，更換為您 JAR 中正確的類別名稱 (如果適用)。

   ```
   import com.amazonaws.AmazonClientException;
   import com.amazonaws.auth.AWSCredentials;
   import com.amazonaws.auth.AWSStaticCredentialsProvider;
   import com.amazonaws.auth.profile.ProfileCredentialsProvider;
   import com.amazonaws.services.elasticmapreduce.AmazonElasticMapReduce;
   import com.amazonaws.services.elasticmapreduce.AmazonElasticMapReduceClientBuilder;
   import com.amazonaws.services.elasticmapreduce.model.*;
   import com.amazonaws.services.elasticmapreduce.util.StepFactory;
   
   public class Main {
   
   	public static void main(String[] args) {
   		AWSCredentials credentials_profile = null;
   		try {
   			credentials_profile = new ProfileCredentialsProvider("default").getCredentials();
   		} catch (Exception e) {
   			throw new AmazonClientException(
   					"Cannot load credentials from .aws/credentials file. " +
   							"Make sure that the credentials file exists and the profile name is specified within it.",
   					e);
   		}
   
   		AmazonElasticMapReduce emr = AmazonElasticMapReduceClientBuilder.standard()
   				.withCredentials(new AWSStaticCredentialsProvider(credentials_profile))
   				.withRegion(Regions.US_WEST_1)
   				.build();
   
   		// Run a bash script using a predefined step in the StepFactory helper class
   		StepFactory stepFactory = new StepFactory();
   		StepConfig runBashScript = new StepConfig()
   				.withName("Run a bash script")
   				.withHadoopJarStep(stepFactory.newScriptRunnerStep("s3://jeffgoll/emr-scripts/create_users.sh"))
   				.withActionOnFailure("CONTINUE");
   
   		// Run a custom jar file as a step
   		HadoopJarStepConfig hadoopConfig1 = new HadoopJarStepConfig()
   				.withJar("s3://path/to/my/jarfolder") // replace with the location of the jar to run as a step
   				.withMainClass("com.my.Main1") // optional main class, this can be omitted if jar above has a manifest
   				.withArgs("--verbose"); // optional list of arguments to pass to the jar
   		StepConfig myCustomJarStep = new StepConfig("RunHadoopJar", hadoopConfig1);
   
   		AddJobFlowStepsResult result = emr.addJobFlowSteps(new AddJobFlowStepsRequest()
   				.withJobFlowId("j-xxxxxxxxxxxx") // replace with cluster id to run the steps
   				.withSteps(runBashScript, myCustomJarStep));
   
   		System.out.println(result.getStepIds());
   
   	}
   }
   ```

1. 選擇 **Run (執行)**，然後選擇 **Run As (依此執行)**，最後選取 **Java Application (Java 應用程式)**。

1. 如果該範例正確執行，一份新步驟的 ID 清單會顯示在 Eclipse IDE 主控台視窗。正確輸出類似如下：

   ```
   [s-39BLQZRJB2E5E, s-1L6A4ZU2SAURC]
   ```