

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

# 支援 Amazon EMR 叢集中高可用性的功能，以及它們如何使用開放原始碼應用程式


本主題會提供有關 Amazon EMR 叢集中 Hadoop 的 HDFS NameNode 和 YARN ResourceManager 高可用性功能的資訊，以及如何將這些高可用性功能與開放原始碼應用程式和其他 Amazon EMR 功能搭配使用。

## 高可用性 HDFS


具有多個主節點的 Amazon EMR 叢集可在 Hadoop 中啟用 HDFS NameNode 高可用性功能。如需詳細資訊，請參閱 [HDFS 高可用性](https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithNFS.html)。

在 Amazon EMR 叢集中，會將兩個或更多單獨節點設定為 NameNodes。其中一個 NameNode 處於 `active` 狀態，其他 NameNode 處於 `standby` 狀態。如果含有 `active` NameNode 的節點故障，Amazon EMR 會開始執行 HDFS 自動容錯移轉程序。`standby` NameNode 節點的狀態會變成 `active`，然後接管叢集中的所有用戶端操作。接著，Amazon EMR 會將故障的節點取代為新節點，而這個重新加入的節點狀態將是 `standby`。

**注意**  
在 Amazon EMR 5.23.0 至 5.36.2 版中，三個主節點中只有兩個執行 HDFS NameNode。  
在 Amazon EMR 6.x 版和更高版本中，所有三個主要節點都會執行 HDFS NameNode。

如果需要找出處於 `active` 狀態的 NameNode，可以使用 SSH 連接至叢集中的任一主節點，並執行下列命令：

```
hdfs haadmin -getAllServiceState
```

輸出會列出安裝 NameNode 的節點及其狀態。例如 

```
ip-##-#-#-##1.ec2.internal:8020 active
ip-##-#-#-##2.ec2.internal:8020 standby
ip-##-#-#-##3.ec2.internal:8020 standby
```

## 高可用性 YARN ResourceManager


具有多個主節點的 Amazon EMR 叢集可在 Hadoop 中啟用 YARN ResourceManager 高可用性功能。如需詳細資訊，請參閱 [ResourceManager 高可用性](https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html)。

在具有多個主節點的 Amazon EMR 叢集中，YARN ResourceManager 會在所有三個主節點上執行。其中一個 ResourceManager 會處於 `active` 狀態，而另外兩個則會處於 `standby` 狀態。如果含有 `active` ResourceManager 的主節點故障，Amazon EMR 會自動開始容錯移轉程序，讓處於 `standby` 狀態的 ResourceManager 主節點接管所有操作。然後，Amazon EMR 會將故障的主節點取代為新的主節點，而這個新的主節點會以 `standby` 狀態重新加入 ResourceManager 仲裁中。

您可以連接至任何主節點的 "http://*master-public-dns-name*:8088/cluster"，其會自動將您導向狀態為 `active` 的資源管理員。若要找出處於 `active` 狀態的資源管理員，則可使用 SSH 連接至叢集中的任何主節點，然後執行下列命令，即可取得三個主節點的清單及其狀態：

```
yarn rmadmin -getAllServiceState
```

## 具有多個主節點的 Amazon EMR 叢集中支援的應用程式


您可以在具有多個主節點的 Amazon EMR 叢集上安裝和執行下列應用程式。每個應用程式的主節點容錯移轉程序各有不同。


| 應用程式 | 主節點容錯移轉期間的可用性 | 備註 | 
| --- | --- | --- | 
| Flink | 可用性不會受到主節點容錯移轉影響 | Amazon EMR 上的 Flink 作業以 YARN 應用程式執行。Flink 的 JobManagers 在核心節點上以 YARN 的 ApplicationMasters 執行。JobManager 不會受到主節點容錯移轉程序影響。 如果您使用 Amazon EMR 5.27.0 版或更早版本，則 JobManager 是單點故障。JobManager 故障時會失去所有任務狀態，而且執行中的任務將不再繼續。您可以設定應用程式嘗試計數、檢查點作業，並啟用 ZooKeeper 做為 Flink 的狀態儲存，以啟用 JobManager 高可用性。如需詳細資訊，請參閱[在具有多個主節點的 Amazon EMR 叢集上設定 Flink](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/flink-configure.html#flink-multi-master)。 從 Amazon EMR 5.28.0 版開始，無需手動設定即可啟用 JobManager 高可用性。 | 
| Ganglia | 可用性不會受到主節點容錯移轉影響 | Ganglia 可在所有主節點上使用，因此 Ganglia 在主節點容錯移轉程序期間仍可繼續執行。 | 
| Hadoop | 高可用性 |  作用中的主節點故障時，HDFS NameNode 和 YARN ResourceManager 會自動容錯移轉至備用節點。  | 
| HBase |  高可用性  | 作用中的主節點故障時，HBase 會自動容錯移轉至備用節點。 如果要透過 REST 或 Thrift 伺服器連接至 HBase，您必須在作用中主節點故障時切換至另一個主節點。 | 
| HCatalog |  可用性不會受到主節點容錯移轉影響  | HCatalog 是以叢集外部的 Hive 中繼存放區為基礎建置而成，因此 HCatalog 在主節點容錯移轉程序期間仍可繼續使用。 | 
| JupyterHub | 高可用性 |  JupyterHub 安裝在所有三個主要執行個體上。強烈建議您設定筆記本持久性，以防止筆記本在主節點故障時遺失。如需詳細資訊，請參閱[在 Amazon S3 中設定筆記本的持久性](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-jupyterhub-s3.html)。  | 
| Livy | 高可用性 |  所有三個主節點上均已安裝 Livy。作用中的主節點故障時，您就無法存取目前 Livy 工作階段，且需要在不同的主節點或新的替換節點上建立新的 Livy 工作階段。  | 
| Mahout |  可用性不會受到主節點容錯移轉影響  | 由於 Mahout 沒有常駐程式，其不會受到主節點容錯移轉程序影響。 | 
| MXNet |  可用性不會受到主節點容錯移轉影響  | 由於 MXNet 沒有常駐程式，其不會受到主節點容錯移轉程序影響。 | 
| Phoenix |  高可用性   | Phoenix 的 Query Server 只能在三個主節點之一上執行。Phoenix 在所有三個主節點皆已設定為連接 Phoenix QueryServer。您可以使用 `/etc/phoenix/conf/phoenix-env.sh` 檔案尋找 Phoenix 的 Query Server 的私有 IP | 
| Pig |  可用性不會受到主節點容錯移轉影響  | 由於 Pig 沒有常駐程式，其不會受到主節點容錯移轉程序影響。 | 
| Spark | 高可用性 | 所有 Spark 應用程式都會在 YARN 容器中執行，且可依照與 YARN 高可用性功能相同的方式來回應主節點容錯移轉。 | 
| Sqoop | 高可用性 | 依據預設，sqoop-job 和 sqoop-metastore 將資料 (作業描述) 儲存在執行命令之主節點的本機磁碟上，如果您要將中繼存放區資料儲存在外部資料庫，請參閱 apache Sqoop 文件 | 
| Tez |  高可用性  | Tez 容器會在 YARN 上執行，因此 Tez 在主節點容錯移轉程序期間的行為方式與 YARN 相同。 | 
| TensorFlow |  可用性不會受到主節點容錯移轉影響  |  由於 TensorFlow 沒有常駐程式，因此不會受到主節點容錯移轉程序影響。 | 
| Zeppelin |  高可用性  | 所有三個主節點上均已安裝 Zeppelin。依據預設，Zeppelin 會將筆記和解譯器組態存放於 HDFS 以防止資料遺失。解譯器工作階段會在所有三個主要執行個體中完全隔離。主節點故障時，工作階段資料將會遺失。建議不要在不同的主要執行個體上同時修改相同的筆記。 | 
| ZooKeeper | 高可用性 |  ZooKeeper 是 HDFS 自動容錯移轉功能的基礎。ZooKeeper 提供具高度可用性的服務，不僅能用來維護協調資料，還能在該資料變更時通知用戶端，並監控用戶端的故障情形。如需詳細資訊，請參閱 [HDFS 自動容錯移轉](https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithNFS.html#Automatic_Failover)。  | 

若要在具有多個主節點的 Amazon EMR 叢集中執行下列應用程式，您必須設定外部資料庫。外部資料庫位於叢集之外，因此資料在主節點容錯移轉程序期間不會變動。針對下列應用程式，服務元件會在主節點容錯移轉程序期間自動復原，但作用中的作業可能會失敗，需要重試。


| 應用程式 | 主節點容錯移轉期間的可用性 | 備註 | 
| --- | --- | --- | 
| Hive | 唯有服務元件可維持高可用性 |  Hive 需要外部中繼存放區。這必須是 MySQL 外部中繼存放區，因為多主機叢集不支援 PostgreSQL。如需詳細資訊，請參閱[設定適用於 Hive 的外部中繼存放區](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-metastore-external-hive.html)。  | 
| Hue | 唯有服務元件可維持高可用性 |  Hue 需要外部資料庫。如需詳細資訊，請參閱[將 Hue 與 Amazon RDS 中的遠端資料庫搭配使用](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/hue-rds.html)。  | 
| Oozie |  唯有服務元件可維持高可用性  | 需要 Oozie 的外部資料庫。如需詳細資訊，請參閱[將 Oozie 與 Amazon RDS 中的遠端資料庫搭配使用](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/oozie-rds.html)。 OOzie 伺服器和 oozie 用戶端安裝在所有三個主節點上。依據預設，oozie-clients 設定為連接到正確的 oozie-server。 | 
| PrestoDB 或 PrestoSQL/Trino |  唯有服務元件可維持高可用性  | PrestoDB 需要外部 Hive 中繼存放區 (Amazon EMR 6.1.0-6.3.0 上的 PrestoSQL 或 Amazon EMR 6.4.0 及更新版本上的 Trino)。您可以[搭配 AWS Glue Data Catalog 使用 Presto](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-presto-glue.html)[，或使用 Hive 的外部 MySQL 資料庫](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hive-metastore-external.html)。 Presto CLI 安裝在所有三個主節點上，因此您可以使用它從任何主節點存取 Presto Coordinator。Presto Coordinator 只安裝在一個主節點上。您可以透過呼叫 Amazon EMR `describe-cluster` API 並讀取回應中 `MasterPublicDnsName` 欄位的傳回值，尋找安裝 Presto Coordinator 的主節點的 DNS 名稱。  | 

**注意**  
在主節點故障的情況下，Java 資料庫連線 (JDBC) 或開放式資料庫連線 (ODBC) 會終止與主節點的連線。因為 Hive 中繼存放區常駐程式可在所有主節點上執行，您仍能連接至任何剩餘的主節點以繼續工作。或者，您可以等待系統取代故障的主節點。

## Amazon EMR 功能在具多個主節點叢集中的運作方式


### 使用 SSH 連接至主節點


您可以使用 SSH 連接至 Amazon EMR 叢集中三個主節點的任一個，如同連接至單一主節點一樣。如需詳細資訊，請參閱[使用 SSH 連接至主節點](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-connect-master-node-ssh.html)。

如果主節點故障，與該主節點的 SSH 連線就會結束。若要繼續進行工作，您可以連接至另外兩個主節點中的其中一個節點。或者，您可以在 Amazon EMR 將故障的主節點取代為新主節點後，再存取新的主節點。

**注意**  
替換主節點會維持先前主節點的私有 IP 地址，但替換主節點的公有 IP 地址可能會變更。您可以在主控台中擷取新的 IP 地址，或使用 AWS CLI 中的 `describe-cluster` 命令加以擷取。  
NameNode 只會在兩個或三個主節點上執行。不過，您可以執行 `hdfs` CLI 命令並操作相關作業，藉此存取所有三個主節點上的 HDFS。

### 在具有多個主節點的 Amazon EMR 叢集中使用步驟


您可以將步驟提交至具有多個主節點的 Amazon EMR 叢集，就如同在具有單一主節點叢集中使用步驟的方式一樣。如需詳細資訊，請參閱[將工作提交至叢集](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-work-with-steps.html)。

以下是在具有多個主節點的 Amazon EMR 叢集中使用步驟時的考量：
+ 如果主節點故障，則主節點上執行的步驟會標記為 FAILED，且在本機寫入的任何資料都會遺失。不過，FAILED 狀態可能無法反映各步驟的實際狀態。
+ 如果執行中的步驟在主節點故障的情況下啟動 YARN 應用程式，該步驟會繼續進行並成功完成，這是因為系統會自動執行主節點容錯移轉。
+ 建議您參考工作的輸出結果，以查看各步驟狀態。例如，MapReduce 工作會使用 `_SUCCESS` 檔案來判斷該工作是否成功完成。
+ 建議您將 ActionOnFailure 參數設定為 CONTINUE 或 CANCEL\$1AND\$1WAIT，而不是 TERMINATE\$1JOB\$1FLOW 或 TERMINATE\$1CLUSTER。

### 自動終止保護


Amazon EMR 會自動為具有多個主節點的所有叢集啟用終止保護，並覆寫您在建立叢集時提供的任何步驟執行設定。您可以在叢集啟動之後停用終止保護。請參閱 [對執行中的叢集設定終止保護](UsingEMR_TerminationProtection.md#emr-termination-protection-running-cluster)。若要關閉具有多個主節點的叢集，您必須先修改叢集屬性以停用終止保護。如需說明，請參閱[終止具有多個主節點的 Amazon EMR 叢集](emr-plan-ha-launch.md#emr-plan-ha-launch-terminate)。

如需有關終止保護的詳細資訊，請參閱 [使用終止保護來保護 Amazon EMR 叢集免於意外關閉](UsingEMR_TerminationProtection.md)。

### 具有多個主節點的 Amazon EMR 叢集中不支援的功能


下列 Amazon EMR 功能目前在具有多個主節點的 Amazon EMR 叢集中不可用：
+ EMR Notebooks
+ 持續性 Spark 歷程記錄伺服器的一鍵式存取功能
+ 持續應用程式使用者介面
+ 具有多個主節點的 Amazon EMR 叢集或與 AWS Lake Formation 整合的 Amazon EMR 叢集，目前無法使用一鍵式存取持久性應用程式使用者介面。
+ 執行時間角色型存取控制。如需詳細資訊，請參閱 [Amazon EMR 步驟的執行期角色](emr-steps-runtime-roles.md) 中的 [其他考量](emr-steps-runtime-roles.md#emr-steps-runtime-roles-considerations)。
+ Amazon EMR 與 AWS IAM Identity Center （受信任身分傳播） 整合。如需詳細資訊，請參閱[將 Amazon EMR 與 整合 AWS IAM Identity Center](emr-idc.md)。

**注意**  
 若要在叢集中使用 Kerberos 身分驗證，請務必設定外部 KDC。  
從 Amazon EMR 版本 5.27.0 開始，您可以在具有多個主節點的 Amazon EMR 叢集上設定 HDFS 透明加密。如需詳細資訊，請參閱[在 Amazon EMR 上使用 HDFS 中的透明加密](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-encryption-tdehdfs.html)。