

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Amazon EMR 集群中支持高可用性的功能，及其如何与开源应用程序配合使用
<a name="emr-plan-ha-applications"></a>

本主题提供有关 Amazon EMR 集群中 HDFS NameNode 和 YARN 的 Hadoop 高可用性功能，以及这些高可用性功能如何与开源应用程序和其他 A ResourceManager mazon EMR 功能配合使用的信息。

## 高可用性 HDFS
<a name="emr-plan-ha-applications-HDFS"></a>

具有多个主节点的 Amazon EMR 集群在 Hadoop 中启用 HDFS NameNode 高可用性功能。有关更多信息，请参阅 [HDFS 高可用性](https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithNFS.html)。

在 Amazon EMR 集群中，两个或更多单独的节点配置为。 NameNodes一个NameNode 处于`active`状态，另一个处于`standby`状态。如果带有的节点`active` NameNode 出现故障，Amazon EMR 会启动自动 HDFS 故障转移过程。具有的节点`standby`NameNode 将变为`active`并接管集群中的所有客户机操作。Amazon EMR 用新的主节点替换故障的主节点，新主节点将作为 `standby` 重新加入。

**注意**  
在 5.23.0 至 5.36.2 的 Amazon EMR 版本中，三个主节点中只有两个运行 HDFS。 NameNode  
在 Amazon EMR 6.x 及更高版本中，所有三个主节点都运行 HDFS。 NameNode

如果您需要找出哪个 NameNode 是`active`，可以使用 SSH 连接到集群中的任何主节点并运行以下命令：

```
hdfs haadmin -getAllServiceState
```

输出列出了节点的安装 NameNode 位置及其状态。例如，

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

## 高可用性纱线 ResourceManager
<a name="emr-plan-ha-applications-YARN"></a>

具有多个主节点的 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 用一个新的主节点替换出现故障的主节点，然后该主节点作为重新加入 ResourceManager 法定人数。`standby`

您可以连接到任何主节点的 “http: //: 8088/cluster*master-public-dns-name*”，它会自动将您定向到资源管理器。`active`要找出哪个资源管理器是 `active`，请使用 SSH 连接到集群中的任何主节点。然后运行以下命令以获取三个主节点及其状态的列表：

```
yarn rmadmin -getAllServiceState
```

## 具有多个主节点的 Amazon EMR 集群中支持的应用程序
<a name="emr-plan-ha-applications-list"></a>

您可以在具有多个主节点的 Amazon EMR 集群上安装和运行以下应用程序。对于每个应用程序，主节点失效转移过程各不相同。


| 应用程序 | 主节点失效转移期间的可用性 | 注意 | 
| --- | --- | --- | 
| Flink | 可用性不受主节点失效转移的影响 | 在 Amazon EMR 上作为 YARN 应用程序运行的 Flink 任务。Flink 在核心节点 ApplicationMasters 上作为 YARN JobManagers 运行。JobManager 不受主节点故障转移过程的影响。 如果您使用的是 Amazon EMR 版本 5.27.0 或更早版本，则 JobManager 是单点故障。当 JobManager 失败时，它会丢失所有作业状态，并且不会恢复正在运行的作业。您可以通过配置应用程序尝试次数、检查点操作以及启用 Flink 的状态存储来实现 JobManager ZooKeeper 高可用性。有关更多信息，请参阅[在包括多个主节点的 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 当主节点出现故障时，会自动故障转移到备用节点。 如果您 HBase 通过 REST 或 Thrift 服务器进行连接，则在主动主节点出现故障时必须切换到其他主节点。 | 
| HCatalog |  可用性不受主节点失效转移的影响  | HCatalog 建立在集群外部的 Hive 元数据仓之上。 HCatalog 在主节点故障切换过程中仍然可用。 | 
| JupyterHub | 高可用性 |  JupyterHub 已安装在所有三个主实例上。强烈建议配置 Notebook 持久性，以防止在出现主节点故障时丢失 Notebook。有关更多信息，请参阅[在 Amazon S3 中为 Notebooks 配置持久性](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-jupyterhub-s3.html)。  | 
| Livy | 高可用性 |  Livy 安装在所有三个主节点上。当处于活动状态的主节点发生故障时，您将无法访问当前的 Livy 会话，并需要在不同的主节点或新的替换节点上创建新的 Livy 会话。  | 
| Mahout |  可用性不受主节点失效转移的影响  | 由于 Mahout 没有进程守护程序，因此不受主节点失效转移过程的影响。 | 
| MXNet |  可用性不受主节点失效转移的影响  | 由于 MXNet 没有守护程序，因此它不受主节点故障转移过程的影响。 | 
| Phoenix |  高可用性   | Phoenix'仅在三个主节点中的一个上 QueryServer 运行。所有三个主机上的 Phoenix 都配置为连接 Phoenix QueryServer。您可以通过使用 `/etc/phoenix/conf/phoenix-env.sh` 文件找到 Phoenix 查询服务器的私有 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 的外部数据库是必需的。有关更多信息，请参阅[在 Amazon RDS 中将 Hue 与远程数据库结合使用](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/hue-rds.html)。  | 
| Oozie |  仅适用于服务组件的高可用性  | Oozie 的外部数据库是必需的。有关更多信息，请参阅[在 Amazon RDS 中将 Oozie 与远程数据库结合使用](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/oozie-rds.html)。 Oozie-server 和 oozie-client 安装在所有三个主节点上。默认情况下，oozie 客户端配置为连接到正确的 oozie 服务器。 | 
| PrestoDB 或 PrestoSQL/Trino |  仅适用于服务组件的高可用性  | PrestoDB（或 Amazon EMR 6.1.0 至 6.3.0 版本的 PrestoSQL 或 Amazon EMR 6.4.0 以及跟高版本的 Trino）的外部 Hive 元数据是必需的。你可以将 [Presto 与 AWS Glue 数据目录](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 协调器。Presto 协调器仅安装在一个主节点上。您可以通过调用 Amazon EMR `describe-cluster` API 并读取响应中 `MasterPublicDnsName` 字段的返回值，以查找安装有 Presto 协调器的主节点的 DNS 名称。  | 

**注意**  
当主节点发生故障时，Java 数据库连接（JDBC）或开放式数据库连接（ODBC）将终止其与主节点的连接。您可以连接到任何剩余的主节点以继续工作，因为 Hive 元存储进程守护程序在所有主节点上运行。或者您可以等待故障的主节点被替换。

## Amazon EMR 功能如何在具有多个主节点的集群中工作
<a name="emr-plan-ha-features"></a>

### 使用 SSH 连接到主节点
<a name="emr-plan-ha-features-SSH"></a>

您可以采用与连接到单个主节点相同的方式，使用 SSH 连接到 Amazon EMR 集群中三个主节点中的任何一个。有关更多信息，请参阅[使用 SSH 连接到主节点](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-connect-master-node-ssh.html)。

如果主节点发生故障，与该主节点的 SSH 连接将终止。要继续工作，您可以连接到另外两个主节点之一。或者，您可以在 Amazon EMR 用新的主节点替换故障的节点后访问新的主节点。

**注意**  
替换主节点的私有 IP 地址与前一个相同。替换主节点的公有 IP 地址可能会更改。您可以在控制台中或使用 AWS CLI 中的 `describe-cluster` 命令检索新的 IP 地址。  
NameNode 只能在两个或三个主节点上运行。但是，您可以运行 `hdfs` CLI 命令并操作任务以访问所有三个主节点上的 HDFS。

### 在具有多个主节点的 Amazon EMR 集群中的处理步骤
<a name="emr-plan-ha-features-steps"></a>

您可以采用与具有单个主节点的集群中的步骤相同的方式，向具有多个主节点的 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。

### 自动终止保护
<a name="emr-plan-ha-termination-protection"></a>

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 集群中不支持的功能
<a name="emr-plan-ha-features-unsupported"></a>

具有多个主节点的 Amazon EMR 集群目前不支持以下 Amazon EMR 功能：
+ EMR Notebooks
+ 一键访问持久性 Spark 历史记录服务器
+ 持久性应用程序用户界面
+ 对于具有多个主节点的 Amazon EMR 集群或与 Lake Formation 集成的亚马逊 EMR 集群，目前无法一键访问永久应用程序用户界面。 AWS 
+ 基于运行时角色的访问控制。有关更多信息，请参阅[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)。