

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

# 採用 Amazon EMR 的舊版 AMI 來自訂叢集和應用程式組態
<a name="emr-3x-customizeappconfig"></a>

Amazon EMR 發行版本 4.0.0 推出一個簡易方法，可讓您使用組態分類來設定應用程式。如需詳細資訊，請參閱[設定應用程式](emr-configure-apps.md)。使用 AMI 版本時，您使用引導操作與所傳遞的引數來設定應用程式。例如，`configure-hadoop` 和 `configure-daemons` 引導操作會設定 Hadoop 和特定於 YARN 的環境屬性 (例如 `--namenode-heap-size`)。在較新版本中，這些會使用 `hadoop-env` 和 `yarn-env` 組態分類來加以設定。有關執行常見的組態的引導操作，請參閱[ Github 上的 emr-bootstrap-actions 儲存庫](https://github.com/awslabs/emr-bootstrap-actions)。

下表會將引導操作映射至較新 Amazon EMR 發行版本中的組態分類。


**Hadoop**  

| 受影響的應用程式檔案名稱 | AMI 版本引導操作 | 組態分類 | 
| --- | --- | --- | 
| core-site.xml  | configure-hadoop -c  | core-site | 
| log4j.properties  | configure-hadoop -l  | hadoop-log4j | 
| hdfs-site.xml  | configure-hadoop -s  | hdfs-site  | 
| N/A | 無 | hdfs-encryption-zones | 
| mapred-site.xml  | configure-hadoop -m  | mapred-site | 
| yarn-site.xml  | configure-hadoop -y  | yarn-site | 
| httpfs-site.xml  | configure-hadoop -t  | httpfs-site | 
| capacity-scheduler.xml  | configure-hadoop -z  | capacity-scheduler | 
| yarn-env.sh  | configure-daemons --resourcemanager-opts | yarn-env | 


**Hive**  

| 受影響的應用程式檔案名稱 | AMI 版本引導操作 | 組態分類 | 
| --- | --- | --- | 
| hive-env.sh | N/A | hive-env | 
| hive-site.xml | hive-script --install-hive-site \$1\$1MY\$1HIVE\$1SITE\$1FILE\$1 | hive-site | 
| hive-exec-log4j.properties | 無 | hive-exec-log4j | 
| hive-log4j.properties | 無 | hive-log4j | 


**EMRFS**  

| 受影響的應用程式檔案名稱 | AMI 版本引導操作 | 組態分類 | 
| --- | --- | --- | 
| emrfs-site.xml | configure-hadoop -e | emrfs-site | 
| N/A | s3get -s s3://custom-provider.jar -d /usr/share/aws/emr/auxlib/ | emrfs-site (使用新設定 fs.s3.cse.encryptionMaterialsProvider.uri) | 

如需所有分類的清單，請參閱 [設定應用程式](emr-configure-apps.md)。

## 應用程式環境變數
<a name="emr-3x-appenv"></a>

使用 AMI 版本時，會一同使用 `hadoop-user-env.sh` 指令碼與 `configure-daemons` 引導操作來設定 Hadoop 環境。指令碼包含下列動作：

```
#!/bin/bash 
export HADOOP_USER_CLASSPATH_FIRST=true; 
echo "HADOOP_CLASSPATH=/path/to/my.jar" >> /home/hadoop/conf/hadoop-user-env.sh
```

在 Amazon EMR 版本 4.x 中，您會使用 `hadoop-env` 組態分類進行相同動作，如下所示：

```
[ 
      { 
         "Classification":"hadoop-env",
         "Properties":{ 

         },
         "Configurations":[ 
            { 
               "Classification":"export",
               "Properties":{ 
                  "HADOOP_USER_CLASSPATH_FIRST":"true",
                  "HADOOP_CLASSPATH":"/path/to/my.jar"
               }
            }
         ]
      }
   ]
```

另一個例子是，使用 `configure-daemons` 和傳遞 `--namenode-heap-size=2048` 和 `--namenode-opts=-XX:GCTimeRatio=19` 等同於以下組態分類。

```
[ 
      { 
         "Classification":"hadoop-env",
         "Properties":{ 

         },
         "Configurations":[ 
            { 
               "Classification":"export",
               "Properties":{ 
                  "HADOOP_DATANODE_HEAPSIZE":  "2048",
           	"HADOOP_NAMENODE_OPTS":  "-XX:GCTimeRatio=19"
               }
            }
         ]
      }
   ]
```

不再在 `/home/hadoop/.bashrc` 中定義其他應用程式環境變數。反之，主要是在 `/etc/default` 檔案中根據元件或應用程式來設定這些變數，例如 `/etc/default/hadoop`。應用程式 RPM 安裝之 `/usr/bin/` 中的包裝函式指令碼也可能會設定額外的環境變數，再參與實際 bin 指令碼。

## 服務連接埠
<a name="emr-3x-serviceports"></a>

使用 AMI 版本時，有些服務會使用自訂連接埠。


**連接埠設定的變更**  

| 設定 | AMI 版本 3.x | 開放原始碼預設 | 
| --- | --- | --- | 
| fs.default.name | hdfs://emrDeterminedIP:9000 | 預設值 (hdfs://emrDeterminedIP:8020)  | 
| dfs.datanode.address | 0.0.0.0:9200 | 預設值 (0.0.0.0:50010)  | 
| dfs.datanode.http.address | 0.0.0.0:9102 | 預設值 (0.0.0.0:50075)  | 
| dfs.datanode.https.address | 0.0.0.0:9402 | 預設值 (0.0.0.0:50475) | 
| dfs.datanode.ipc.address | 0.0.0.0:9201 | 預設值 (0.0.0.0:50020) | 
| dfs.http.address | 0.0.0.0:9101 | 預設值 (0.0.0.0:50070)  | 
| dfs.https.address | 0.0.0.0:9202 | 預設值 (0.0.0.0:50470)  | 
| dfs.secondary.http.address | 0.0.0.0:9104 | 預設值 (0.0.0.0:50090) | 
| yarn.nodemanager.address | 0.0.0.0:9103 | 預設值 (\$1\$1yarn.nodemanager.hostname\$1:0)  | 
| yarn.nodemanager.localizer.address  | 0.0.0.0:9033 | 預設值 (\$1\$1yarn.nodemanager.hostname\$1:8040) | 
| yarn.nodemanager.webapp.address | 0.0.0.0:9035 | 預設值 (\$1\$1yarn.nodemanager.hostname\$1:8042) | 
| yarn.resourcemanager.address | emrDeterminedIP:9022 | 預設值 (\$1\$1yarn.resourcemanager.hostname\$1:8032) | 
| yarn.resourcemanager.admin.address | emrDeterminedIP:9025 | 預設值 (\$1\$1yarn.resourcemanager.hostname\$1:8033) | 
| yarn.resourcemanager.resource-tracker.address | emrDeterminedIP:9023 | 預設值 (\$1\$1yarn.resourcemanager.hostname\$1:8031) | 
| yarn.resourcemanager.scheduler.address | emrDeterminedIP:9024 | 預設值 (\$1\$1yarn.resourcemanager.hostname\$1:8030) | 
| yarn.resourcemanager.webapp.address | 0.0.0.0:9026  | 預設值 (\$1\$1yarn.resourcemanager.hostname\$1:8088) | 
| yarn.web-proxy.address | emrDeterminedIP:9046  | 預設值 (無值)  | 
| yarn.resourcemanager.hostname | 0.0.0.0 (預設)  | emrDeterminedIP | 

**注意**  
*emrDeterminedIP* 是 Amazon EMR 所產生的 IP 地址。

## 使用者
<a name="emr-3x-users"></a>

使用 AMI 版本時，使用者在 `hadoop` 會執行所有程序並擁有所有檔案。在 Amazon EMR 發行版本 4.0.0 和更高版本中，使用者存在於應用程式和元件層級。

## 安裝順序、安裝成品，以及日誌檔案位置
<a name="emr-3x-directories"></a>

使用 AMI 版本時，應用程式成品及其組態目錄是安裝在 `/home/hadoop/application` 目錄。例如，如果您已安裝 Hive，目錄會是 `/home/hadoop/hive`。在 Amazon EMR 4.0.0 版和更高版本中，應用程式成品是安裝在 `/usr/lib/application` 目錄中。使用 AMI 版本時，可在各種位置找到日誌檔。下表列出位置。


**Amazon S3 上的日誌位置變更**  

| 常駐程式或應用程式 | 目錄位置 | 
| --- | --- | 
| instance-state | node/instance-id/instance-state/ | 
| hadoop-hdfs-namenode | daemons/instance-id/hadoop-hadoop-namenode.log | 
| hadoop-hdfs-datanode | daemons/instance-id/hadoop-hadoop-datanode.log | 
| hadoop-yarn (ResourceManager) | daemons/instance-id/yarn-hadoop-resourcemanager | 
| hadoop-yarn (代理伺服器) | daemons/instance-id/yarn-hadoop-proxyserver | 
| mapred-historyserver | daemons/instance-id/ | 
| httpfs | daemons/instance-id/httpfs.log | 
| hive-server | node/instance-id/hive-server/hive-server.log | 
| hive-metastore | node/instance-id/apps/hive.log | 
| Hive CLI | node/instance-id/apps/hive.log | 
| YARN 應用程式使用者日誌和容器日誌 | task-attempts/ | 
| Mahout | N/A | 
| Pig | N/A | 
| spark-historyserver | 無 | 
| mapreduce 任務歷史記錄檔 | jobs/ | 

## 命令執行器
<a name="emr-differences-commandrunner"></a>

使用 AMI 版本時，不會將許多指令碼或程式 (例如 `/home/hadoop/contrib/streaming/hadoop-streaming.jar`) 放置在 shell 登入路徑環境，因此當您使用 JAR 檔案 (例如 command-runner.jar) 或 script-runner.jar 來執行指令碼時，會需要指定完整路徑。`command-runner.jar` 就位於 AMI，所以不需要知道完整 URI，因為就跟 `script-runner.jar` 案例一樣。

## 複寫係數
<a name="emr-3x-replication"></a>

複寫係數可讓您設定啟動 Hadoop JVM 的時間。您可以為每個任務啟動新 Hadoop JVM，其會提供更佳的隔離，或者您可以在任務之間共用 JVM，來降低架構開銷。如果您處理的是許多小檔案，多次重複使用 JVM 來分攤啟動的成本的做法相當合理。不過，如果每個任務需要很長的時間或處理大量資料，您可能會選擇不重複使用 JVM，以確保所有記憶體可供後續任務使用。使用 AMI 版本時，您可以使用 `configure-hadoop` 引導操作來設定 `mapred.job.reuse.jvm.num.tasks` 屬性以自訂複寫係數。

以下範例示範為無限 JVM 重複使用設定 JVM 重複使用因子。

**注意**  
包含 Linux 行接續字元 (\$1) 是為了提高可讀性。它們可以在 Linux 命令中移除或使用。對於 Windows，請將其移除或取代為插入符號 (^)。

```
aws emr create-cluster --name "Test cluster" --ami-version 3.11.0 \
--applications Name=Hue Name=Hive Name=Pig \
--use-default-roles --ec2-attributes KeyName=myKey \
--instance-groups InstanceGroupType=MASTER,InstanceCount=1,InstanceType=m3.xlarge \
InstanceGroupType=CORE,InstanceCount=2,InstanceType=m3.xlarge \
--bootstrap-actions Path=s3://elasticmapreduce/bootstrap-actions/configure-hadoop,\
Name="Configuring infinite JVM reuse",Args=["-m","mapred.job.reuse.jvm.num.tasks=-1"]
```