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

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

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

注意事项

  • 对于 Amazon EMR 5.0.0 及更高版本,默认 Java 虚拟机(JVM)为 Java 8。

  • 对于 Amazon EMR 6.9.0 及更高版本,Trino 默认支持 Java 17。有关 Trino 上 Java 17 的更多信息,请参阅 Trino 博客上的 Trino updates to Java 17

  • 对于 Amazon EMR 6.12.0 及更高版本,某些应用程序还支持 Java 11 和 17。有关支持的应用程序 Java 版本的信息,请参阅《Amazon EMR Release Guide》https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-release-components.html。请注意,Amazon EMR 仅支持在一个集群中运行一个运行时系统版本,不支持在同一集群上的不同运行时系统版本上运行不同的节点或应用程序。

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

特定于应用程序的 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。

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 默认值(无值)
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