配置应用程序来使用特定 Java 虚拟机 - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

配置应用程序来使用特定 Java 虚拟机

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

注意事项

有关支持的应用程序 Java 版本的信息,请参阅《Amazon EMR 发行版指南》关于 Amazon EMR 发行版中的应用程序页面。

  • Amazon EMR 仅支持在一个集群中运行一个运行时系统版本,不支持在同一集群上的不同运行时系统版本上运行不同的节点或应用程序。

  • 对于 Amazon EMR 7.x,支持 Java 17 的应用程序的默认 Java 虚拟机(JVM)为 Java 17,Apache Livy 除外。有关支持的应用程序 Java 版本的更多信息,请参阅《Amazon EMR 发行版指南》中相应的发布页面。

  • 从亚马逊 EMR 7.1.0 开始,Flink 支持并默认设置为 Java 17。要使用其他版本的 Java 运行时,请覆盖中的设置flink-conf。有关将 Flink 配置为使用 Java 8 或 Java 11 的更多信息,请参阅将 Flink 配置为使用 Java 11 运行

  • 对于 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

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

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

Spark

要使用非默认 Java 版本运行 Spark,必须同时配置 Spark 和 Hadoop。有关示例,请参阅覆盖 JVM

  • spark-env 中配置 JAVA_HOME 以更新主实例进程的 Java 运行时系统。例如,spark-submit、spark-shell 和 Spark 历史记录服务器。

  • 修改 Hadoop 配置以更新 Spark 执行程序和 YARN ApplicationMaster 的 Java 运行时系统

Spark RAPIDS

您可以使用为 Spark 配置的 Java 版本运行 RAPIDS。

Iceberg

您可以使用正在使用 Iceberg 的应用程序的已配置 Java 版本来运行 Iceberg。

Delta

您可以使用正在使用 Delta 的应用程序的已配置 Java 版本来运行 Delta。

Hudi

您可以使用正在使用 Hudi 的应用程序的已配置 Java 版本来运行 Hudi。

Hadoop

要更新适用于 Hadoop 的 JVM,请修改 hadoop-env。有关示例,请参阅覆盖 JVM

Hive

要将 Hive 的 Java 版本设置为 11 或 17,请将 Hadoop JVM 设置配置为要使用的 Java 版本。

HBase

要更新适用于 HBase 的 JVM,请修改 hbase-env。默认情况下,除非您覆盖 hbase-env 中的设置,否则 Amazon EMR 会根据 Hadoop 的 JVM 配置来设置 HBase JVM。有关示例,请参阅覆盖 JVM

Flink

要更新适用于 Flink 的 JVM,请修改 flink-conf。默认情况下,除非您覆盖 flink-conf 中的设置,否则 Amazon EMR 会根据 Hadoop 的 JVM 配置来设置 Flink JVM。有关更多信息,请参阅 将 Flink 配置为使用 Java 11 运行

Oozie

要将 Oozie 配置为在 Java 11 或 17 上运行,请配置 Oozie Server、Oozie LauncherAM Launcher AM,然后更改客户端可执行文件和作业配置。您也可以将 EmbeddedOozieServer 配置为在 Java 17 上运行。有关更多信息,请参阅 为 Oozie 配置 Java 版本

Pig

Pig 仅支持 Java 8。您无法在 Hadoop 中使用 Java 11 或 17,也不能在同一个集群上运行 Pig。

覆盖 JVM

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

使用 Apache Spark 覆盖 JVM 设置

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

要覆盖 Spark 的 JVM,我们建议您同时设置 Hadoop 和 Spark 分类。

{ "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 HBase 覆盖 JVM 设置

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

[ { "Classification": "hbase-env", "Configurations": [ { "Classification": "export", "Configurations": [], "Properties": { "JAVA_HOME": "/usr/lib/jvm/jre-11" } } ], "Properties": {} } ]

使用 Apache Hadoop 和 Hive 覆盖 JVM 设置

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

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

服务端口

以下是 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.hostnamefs.default.name 设置除外。

应用程序用户

应用程序以自己的用户身份运行进程。例如,Hive JVM 以用户身份运行hive, MapReduce JVM 以用户身份运行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