特定の Java 仮想マシンを使用するようにアプリケーションを設定 - Amazon EMR

特定の Java 仮想マシンを使用するようにアプリケーションを設定

Amazon EMR は、リリースごとに、デフォルトの Java 仮想マシン (JVM) のバージョンが異なります。このページでは、さまざまなリリースやアプリケーションに対する JVM サポートについて説明します。

考慮事項

アプリケーションでサポートされている Java バージョンについては、Amazon EMR リリースガイドのアプリケーションのページを参照してください。

  • Amazon EMR のクラスター内で実行可能なランタイムバージョンは 1 つのみであり、同じクラスターで、異なるランタイムバージョンを実行し、異なるノードまたはアプリケーションを稼働させることはできません。

  • Amazon EMR 7.x の場合、Apache Livy を除く、Java 17 をサポートするアプリケーションのデフォルトの Java 仮想マシン (JVM) は Java 17 です。アプリケーションでサポートされている JDK バージョンの詳細については、Amazon EMR リリースガイドの対応するリリースページを参照してください。

  • Amazon EMR 7.1.0 以降、Flink は Java 17 をサポートし、デフォルトで Java 17 に設定されています。別のバージョンの Java ランタイムを使用するには、flink-conf の設定を上書きします。Java 8 または Java 11 を使用するように Flink を設定する方法の詳細については、「Configure Flink to run with 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 をサポートしています。Java 17 と Trino の詳細については、Trino のブログ、「Trino updates to Java 17」を参照してください。

ランタイムバージョンを選択する際には、次に示すアプリケーション固有の考慮事項に留意してください。

Java 設定に関する、アプリケーション固有の注意点
アプリケーション Java の設定に関する注意点

Spark

Spark をデフォルト以外の Java バージョンで稼働させるには、Spark と Hadoop の両方を設定する必要があります。例については、「JVM をオーバーライドする」を参照してください。

  • プライマリインスタンスプロセスの Java ランタイムを更新するには、spark-envJAVA_HOME を設定します。例えば、spark-submit、spark-shell、Spark History Server などです。

  • Hadoop の設定を変更して Spark エグゼキューターと YARN ApplicationMaster の Java ランタイムを更新してください。

Spark RAPIDS

Spark 用に設定されている Java バージョンで RAPIDS を実行できます。

Iceberg

Iceberg は、それを使用するアプリケーションの設定済み Java バージョンで稼働させることができます。

差分

Delta は、それを使用するアプリケーションの設定済み Java バージョンで稼働させることができます。

Hudi

Hudi は、それを使用するアプリケーションの設定済み Java バージョンで稼働させることができます。

Hadoop

Hadoop の JVM を更新するには、hadoop-env を変更します。例については、「JVM をオーバーライドする」を参照してください。

[Hive]

Hive の Java バージョンを 11 または 17 に設定するには、Hadoop の JVM 設定で、使用する Java バージョンを指定します。

HBase

HBase の JVM を更新するには、hbase-env を変更します。デフォルトの場合、Amazon EMR では、Hadoop の JVM 設定に基づいて HBase の JVM が設定されます。ただし、hbase-env の設定をオーバーライドした場合を除きます。例については、「JVM をオーバーライドする」を参照してください。

Flink

Flink の JVM を更新するには、flink-conf を変更します。デフォルトの場合、Amazon EMR では、Hadoop の JVM 設定に基づいて Flink の JVM が設定されます。ただし、flink-conf の設定をオーバーライドした場合を除きます。詳細については、「Flink が Java 11 で実行されるよう設定する」を参照してください。

Oozie

Oozie が Java 11 または 17 で稼働するように構成するには、Oozie サーバーと Oozie LauncherAM ランチャー 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 をその環境分類に設定します。この場合の環境分類は application-env であり、Flink を除くすべてのアプリケーションに適用されます。Flink の環境分類は flink-conf です。Flink の Java ランタイムを設定する手順については、「Flink が Java 11 で実行されるよう設定する」を参照してください。

JVM 設定をオーバーライドし Apache Spark を使用する

Amazon EMR リリース 6.12 以降で Spark を使用し、クラスターモードで送信するドライバーを作成すると、そのドライバーは Java 8 を使用します。ただし、エグゼキューターが Java 11 または 17 を使用するよう環境を設定できます。Amazon EMR リリース 5.x より前のリリースで 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": {} }

JVM 設定をオーバーライドし Apache HBase を使用する

HBase で Java 11 が使用されるように設定するには、クラスターの起動時に次の設定を行います。

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

JVM 設定をオーバーライドし Apache Hadoop と Hive を使用する

次の例は、JVM をバージョン 17 に設定し、Hadoop と Hive を利用可能にする方法を示しています。

[ { "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.hostname および fs.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