

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

# 配置应用程序来使用特定 Java 虚拟机
<a name="configuring-java8"></a>

Amazon EMR 版本具有不同的默认 Java 虚拟机（JVM）版本。本页介绍了 JVM 对不同版本和应用程序的支持。

## 注意事项
<a name="configuring-java8-considerations"></a>

有关支持的应用程序 Java 版本的信息，请参阅《Amazon EMR 发行版指南》[关于 Amazon EMR 发行版](emr-release-components.md)中的应用程序页面。
+ Amazon EMR 仅支持在一个集群中运行一个运行时系统版本，不支持在同一集群上的不同运行时系统版本上运行不同的节点或应用程序。
+ 对于 Amazon EMR 7.x，支持 Java 17 的应用程序的默认 Java 虚拟机（JVM）为 Java 17，Apache Livy 除外。有关支持的应用程序 Java 版本的更多信息，请参阅《Amazon EMR 发行版指南》中相应的发布页面。
+ 从 Amazon EMR 7.1.0 开始，Flink 支持并默认设置为 Java 17。要使用其他版本的 Java 运行时，请覆盖 `flink-conf` 中的设置。有关配置 Flink 以使用 Java 8 或 Java 11 的更多信息，请参阅[将 Flink 配置为使用 Java 11 运行](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/flink-configure.html#flink-configure-java11)。
+ 对于 Amazon EMR 5.x 和 6.x，默认的 Java 虚拟机（JVM）为 Java 8。
  + 对于 Amazon EMR 6.12.0 及更高版本，某些应用程序还支持 Java 11 和 17。
  + 对于 Amazon EMR 6.9.0 及更高版本，Trino 默认支持 Java 17。有关 Trino 上 Java 17 的更多信息，请参阅 Trino 博客上的 [Trino updates to Java 17](https://trino.io/blog/2022/07/14/trino-updates-to-java-17.html)。

在选择运行时系统版本时，请记住以下特定于应用程序的注意事项：


**特定于应用程序的 Java 配置说明**  

| 应用程序 | Java 配置说明 | 
| --- | --- | 
| Spark | 要使用非默认 Java 版本运行 Spark，必须同时配置 Spark 和 Hadoop。有关示例，请参阅 [覆盖 JVM](#configuring-java8-override)。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ReleaseGuide/configuring-java8.html) | 
| Spark RAPIDS | 您可以使用为 Spark 配置的 Java 版本运行 RAPIDS。 | 
| Iceberg | 您可以使用正在使用 Iceberg 的应用程序的已配置 Java 版本来运行 Iceberg。 | 
| Delta | 您可以使用正在使用 Delta 的应用程序的已配置 Java 版本来运行 Delta。 | 
| Hudi | 您可以使用正在使用 Hudi 的应用程序的已配置 Java 版本来运行 Hudi。 | 
| Hadoop | 要更新适用于 Hadoop 的 JVM，请修改 `hadoop-env`。有关示例，请参阅 [覆盖 JVM](#configuring-java8-override)。 | 
| Hive | 要将 Hive 的 Java 版本设置为 11 或 17，请将 Hadoop JVM 设置配置为要使用的 Java 版本。 | 
| HBase | 要更新的 JVM HBase，请修改`hbase-env`。默认情况下，除非您覆盖中的 HBase 设置，否则 Amazon EMR 会根据 Hadoop 的 JVM 配置来设置 JVM。`hbase-env`有关示例，请参阅 [覆盖 JVM](#configuring-java8-override)。 | 
| Flink | 要更新适用于 Flink 的 JVM，请修改 `flink-conf`。默认情况下，除非您覆盖 `flink-conf` 中的设置，否则 Amazon EMR 会根据 Hadoop 的 JVM 配置来设置 Flink JVM。有关更多信息，请参阅 [将 Flink 配置为使用 Java 11 运行](flink-configure.md#flink-configure-java11)。 | 
| Oozie | 要将 Oozie 配置为在 Java 11 或 17 上运行，请配置 Oozie Server、Oozie LauncherAM Launcher AM，然后更改客户端可执行文件和作业配置。您也可以将 `EmbeddedOozieServer` 配置为在 Java 17 上运行。有关更多信息，请参阅 [为 Oozie 配置 Java 版本](oozie-java.md)。 | 
| Pig | Pig 仅支持 Java 8。您无法在 Hadoop 中使用 Java 11 或 17，也不能在同一个集群上运行 Pig。 | 

## 覆盖 JVM
<a name="configuring-java8-override"></a>

要覆盖 Amazon EMR 版本的 JVM 设置：例如，在使用 Amazon EMR 版本 6.12.0 的集群中使用 Java 17，请为其环境分类提供 `JAVA_HOME` 设置，该设置对于除 Flink 之外的所有应用程序都为 `application-env`。对于 Flink 来说，环境分类是 `flink-conf`。有关使用 Flink 配置 Java 运行时系统的步骤，请参阅 [将 Flink 配置为使用 Java 11 运行](flink-configure.md#flink-configure-java11)。

**Topics**
+ [使用 Apache Spark 覆盖 JVM 设置](#configuring-java8-override-spark)
+ [使用 Apache 重写 JVM 设置 HBase](#configuring-java8-override-hbase)
+ [使用 Apache Hadoop 和 Hive 覆盖 JVM 设置](#configuring-java8-override-hadoop)

### 使用 Apache Spark 覆盖 JVM 设置
<a name="configuring-java8-override-spark"></a>

在 Amazon EMR 6.12 及更高版本中使用 Spark 时，您可以设置环境，以便执行程序使用 Java 11 或 17。而且，当您在低于 5.x 的 Amazon EMR 版本中使用 Spark 并编写驱动程序以在集群模式下提交时，驱动程序会使用 Java 7。不过，您可以设置环境以确保执行程序使用 Java 8。

要覆盖 Spark 的 JVM，请设置 Spark 分类设置。在此示例中，Hadoop 的 Java 版本相同，但这不是必需的。

```
[
{
"Classification": "hadoop-env", 
        "Configurations": [
            {
"Classification": "export", 
                "Configurations": [], 
                "Properties": {
"JAVA_HOME": "/usr/lib/jvm/java-1.8.0"
                }
            }
        ], 
        "Properties": {}
    }, 
    {
"Classification": "spark-env", 
        "Configurations": [
            {
"Classification": "export", 
                "Configurations": [], 
                "Properties": {
"JAVA_HOME": "/usr/lib/jvm/java-1.8.0"
                }
            }
        ], 
        "Properties": {}
    }
]
```

请注意，对于 Amazon EMR 上的 Hadoop，建议的最佳做法是所有 Hadoop 组件的 JVM 版本保持一致。

 以下示例展示了如何为 EMR 7.0.0\$1 添加所需的配置参数，以确保所有组件使用一致的 Java 版本。

```
[
  {
    "Classification": "spark-defaults",
    "Properties": {
      "spark.executorEnv.JAVA_HOME": "/usr/lib/jvm/java-1.8.0",
      "spark.yarn.appMasterEnv.JAVA_HOME": "/usr/lib/jvm/java-1.8.0"
    }
  },
  {
    "Classification": "hadoop-env",
    "Configurations": [
      {
        "Classification": "export",
        "Configurations": [],
        "Properties": {
          "JAVA_HOME": "/usr/lib/jvm/java-1.8.0"
        }
      }
    ],
    "Properties": {}
  },
  {
    "Classification": "spark-env",
    "Configurations": [
      {
        "Classification": "export",
        "Configurations": [],
        "Properties": {
          "JAVA_HOME": "/usr/lib/jvm/java-1.8.0"
        }
      }
    ],
    "Properties": {}
  }
]
```

### 使用 Apache 重写 JVM 设置 HBase
<a name="configuring-java8-override-hbase"></a>

 HBase 要配置为使用 Java 11，可以在启动集群时设置以下配置。

```
[
    {
        "Classification": "hbase-env",
        "Properties": {},
        "Configurations": [
            {
                "Classification": "export",
                "Properties": {
                    "JAVA_HOME": "/usr/lib/jvm/jre-11",
                    "HBASE_OPTS": "-XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -Dsun.net.inetaddr.ttl=5"
                },
                "Configurations": []
            }
        ]
    }
]
```

### 使用 Apache Hadoop 和 Hive 覆盖 JVM 设置
<a name="configuring-java8-override-hadoop"></a>

以下示例说明如何将 Hadoop 和 Hive 的 JVM 设置为版本 17。

```
[
    {
        "Classification": "hadoop-env", 
            "Configurations": [
                {
                    "Classification": "export", 
                    "Configurations": [], 
                    "Properties": {
                        "JAVA_HOME": "/usr/lib/jvm/jre-17"
                    }
                }
        ], 
        "Properties": {}
    }
]
```

## 服务端口
<a name="configuring-java8-service-ports"></a>

以下是 YARN 和 HDFS 服务端口。这些设置反映 Hadoop 默认值。其它应用程序服务托管在默认端口上，除非另有指定。有关更多信息，请参阅应用程序的项目文档。


**YARN 和 HDFS 的端口设置**  

| 设置 | 主机名/端口 | 
| --- | --- | 
| `fs.default.name` | 默认值（`hdfs://emrDeterminedIP:8020`） | 
| `dfs.datanode.address` | 默认值（`0.0.0.0:50010`） | 
| `dfs.datanode.http.address` | 默认值（`0.0.0.0:50075`） | 
| `dfs.datanode.https.address` | 默认值（`0.0.0.0:50475`） | 
| `dfs.datanode.ipc.address` | 默认值（`0.0.0.0:50020`） | 
| `dfs.http.address` | 默认值（`0.0.0.0:50070`） | 
| `dfs.https.address` | 默认值（`0.0.0.0:50470`） | 
| `dfs.secondary.http.address` | 默认值（`0.0.0.0:50090`） | 
| `yarn.nodemanager.address` | 默认值（`${yarn.nodemanager.hostname}:0`） | 
| `yarn.nodemanager.localizer.address` | 默认值（`${yarn.nodemanager.hostname}:8040`） | 
| `yarn.nodemanager.webapp.address` | 默认值（`${yarn.nodemanager.hostname}:8042`） | 
| `yarn.resourcemanager.address` | 默认值（`${yarn.resourcemanager.hostname}:8032`） | 
| `yarn.resourcemanager.admin.address` | 默认值（`${yarn.resourcemanager.hostname}:8033`） | 
| `yarn.resourcemanager.resource-tracker.address` | 默认值（`${yarn.resourcemanager.hostname}:8031`） | 
| `yarn.resourcemanager.scheduler.address` | 默认值（`${yarn.resourcemanager.hostname}:8030`） | 
| `yarn.resourcemanager.webapp.address` | 默认值（`${yarn.resourcemanager.hostname}:8088`） | 
| `yarn.web-proxy.address` | 默认值（`no-value`） | 
| `yarn.resourcemanager.hostname` | `emrDeterminedIP` | 

**注意**  
该术语*emrDeterminedIP*是由 Amazon EMR 控制平面生成的 IP 地址。在较新的版本中，已删除该约定，但 `yarn.resourcemanager.hostname` 和 `fs.default.name` 设置除外。

## 应用程序用户
<a name="configuring-java8-application-users"></a>

应用程序以自己的用户身份运行进程。例如，Hive 以用户身份 JVMs 运行`hive`、以用户身份 MapReduce JVMs 运行`mapred`，依此类推。在以下进程状态示例中说明了这一点。

```
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
hive      6452  0.2  0.7 853684 218520 ?       Sl   16:32   0:13 /usr/lib/jvm/java-openjdk/bin/java -Xmx256m -Dhive.log.dir=/var/log/hive -Dhive.log.file=hive-metastore.log -Dhive.log.threshold=INFO -Dhadoop.log.dir=/usr/lib/hadoop
hive      6557  0.2  0.6 849508 202396 ?       Sl   16:32   0:09 /usr/lib/jvm/java-openjdk/bin/java -Xmx256m -Dhive.log.dir=/var/log/hive -Dhive.log.file=hive-server2.log -Dhive.log.threshold=INFO -Dhadoop.log.dir=/usr/lib/hadoop/l
hbase     6716  0.1  1.0 1755516 336600 ?      Sl   Jun21   2:20 /usr/lib/jvm/java-openjdk/bin/java -Dproc_master -XX:OnOutOfMemoryError=kill -9 %p -Xmx1024m -ea -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -Dhbase.log.dir=/var/
hbase     6871  0.0  0.7 1672196 237648 ?      Sl   Jun21   0:46 /usr/lib/jvm/java-openjdk/bin/java -Dproc_thrift -XX:OnOutOfMemoryError=kill -9 %p -Xmx1024m -ea -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -Dhbase.log.dir=/var/
hdfs      7491  0.4  1.0 1719476 309820 ?      Sl   16:32   0:22 /usr/lib/jvm/java-openjdk/bin/java -Dproc_namenode -Xmx1000m -Dhadoop.log.dir=/var/log/hadoop-hdfs -Dhadoop.log.file=hadoop-hdfs-namenode-ip-10-71-203-213.log -Dhadoo
yarn      8524  0.1  0.6 1626164 211300 ?      Sl   16:33   0:05 /usr/lib/jvm/java-openjdk/bin/java -Dproc_proxyserver -Xmx1000m -Dhadoop.log.dir=/var/log/hadoop-yarn -Dyarn.log.dir=/var/log/hadoop-yarn -Dhadoop.log.file=yarn-yarn-
yarn      8646  1.0  1.2 1876916 385308 ?      Sl   16:33   0:46 /usr/lib/jvm/java-openjdk/bin/java -Dproc_resourcemanager -Xmx1000m -Dhadoop.log.dir=/var/log/hadoop-yarn -Dyarn.log.dir=/var/log/hadoop-yarn -Dhadoop.log.file=yarn-y
mapred    9265  0.2  0.8 1666628 260484 ?      Sl   16:33   0:12 /usr/lib/jvm/java-openjdk/bin/java -Dproc_historyserver -Xmx1000m -Dhadoop.log.dir=/usr/lib/hadoop/logs -Dhadoop.log.file=hadoop.log -Dhadoop.home.dir=/usr/lib/hadoop
```