

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 設定應用程式以使用特定 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 Virtual Machine (JVM) 為 Java 17，適用於支援 Java 17 的應用程式，但 Apache Livy 除外。如需有關應用程式支援的 JDK 版本的詳細資訊，請參閱《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 Virtual Machine (JVM) 為 Java 8。
  + 對於 Amazon EMR 6.12.0 版及更高版本，部分應用程式也支援 Java 11 和 17。
  + 對於 Amazon EMR 6.9.0 版及更高版本，Trino 支援 Java 17 作為預設值。如需有關 Java 17 與 Trino 的詳細資訊，請參閱 Trino 部落格上的 [Trino 對 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_tw/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 | 若要更新用於 HBase 的 JVM，請修改 `hbase-env`。依預設，Amazon EMR 根據 Hadoop 的 JVM 組態設定 HBase JVM，除非您覆寫 `hbase-env` 中的設定。如需範例，請參閱 [覆寫 JVM](#configuring-java8-override)。 | 
| Flink | 若要更新用於 Flink 的 JVM，請修改 `flink-conf`。依預設，Amazon EMR 根據 Hadoop 的 JVM 組態設定 Flink JVM，除非您覆寫 `flink-conf` 中的設定。如需詳細資訊，請參閱[將 Flink 設定為使用 Java 11 執行](flink-configure.md#flink-configure-java11)。 | 
| Oozie | 若要將 Oozie 設定為在 Java 11 或 17 上執行，請設定 Oozie 伺服器和 Oozie Launcher AM，並變更用戶端可執行檔和作業組態。您也可以將 `EmbeddedOozieServer` 設定為在 Java 17 上執行。如需詳細資訊，請參閱[設定適用於 Oozie 的 Java 版本](oozie-java.md)。 | 
| Pig | Pig 僅支援 Java 8。您無法將 Java 11 或 17 與 Hadoop 搭配使用並在相同叢集上執行 Pig。 | 

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

若要覆寫 Amazon EMR 發行版本的 JVM 設定 (例如，將 Java 17 與使用 Amazon EMR 發行版本 6.12.0 的叢集搭配使用)，請為環境分類提供 `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 HBase 覆寫 JVM 設定](#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。當您將 Spark 與低於 5.x 的 Amazon EMR 版本搭配使用，並撰寫用於在叢集模式下提交的驅動程式時，該驅動程式將使用 Java 7。不過，您可以設定環境來確保執行程式使用 Java 8。

若要覆寫 JVM for Spark，請設定 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，建議最佳實務是 JVM 版本在所有 Hadoop 元件之間應該保持一致。

 下列範例示範如何新增 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 HBase 覆寫 JVM 設定
<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 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
```