

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

# 執行任務
<a name="jobs"></a>

佈建應用程式後，請將任務提交至應用程式。本節說明如何使用 AWS CLI 來執行這些任務。本節也會識別 EMR Serverless 上可用的每種應用程式類型的預設值。

**Topics**
+ [作業執行狀態](job-states.md)
+ [具有寬限期的 EMR Serverless 任務執行取消](job-cancellation-grace-period.md)
+ [從 EMR Studio 主控台執行任務](jobs-studio.md)
+ [從 執行任務 AWS CLI](jobs-cli.md)
+ [執行 IAM 政策](jobs-cli-execution.md)
+ [使用隨機最佳化磁碟](jobs-shuffle-optimized-disks.md)
+ [使用 Amazon EMR Serverless 的無伺服器儲存](jobs-serverless-storage.md)
+ [處理持續串流資料的串流任務](jobs-streaming.md)
+ [執行 EMR Serverless 任務時使用 Spark 組態](jobs-spark.md)
+ [執行 EMR Serverless 任務時使用 Hive 組態](jobs-hive.md)
+ [EMR Serverless 任務彈性](jobs-resiliency.md)
+ [EMR Serverless 的中繼存放區組態](metastore-config.md)
+ [從 EMR Serverless 存取另一個 AWS 帳戶中的 S3 資料](jobs-s3-access.md)
+ [故障診斷 EMR Serverless 中的錯誤](jobs-troubleshoot.md)
+ [啟用任務層級成本分配](jobs-job-level-cost-allocation.md)

# 作業執行狀態
<a name="job-states"></a>

當您將任務執行提交至 Amazon EMR Serverless 任務佇列時，任務執行會進入 `SUBMITTED` 狀態。任務狀態會從 傳遞`SUBMITTED`到 ，`RUNNING`直到達到 `FAILED`、 `SUCCESS`或 `CANCELLING`為止。

作業執行可能有以下狀態：


****  

| State | Description | 
| --- | --- | 
| 已提交 | 當您將任務執行提交至 EMR Serverless 時的初始任務狀態。任務會等待為應用程式排程。EMR Serverless 開始排定任務執行的優先順序和排程。 | 
| 已排入佇列 | 當應用程式層級任務執行並行完全佔用時，任務執行會在此狀態下等待。如需佇列和並行的詳細資訊，請參閱 [EMR Serverless 應用程式的任務並行和佇列](applications-concurrency-queuing.md)。 | 
| 待定 | 排程器正在評估任務執行，以排定應用程式的執行優先順序和排程。 | 
| 已排程 | EMR Serverless 已排程應用程式的作業執行，並正在配置資源來執行作業。 | 
| 執行中 | EMR Serverless 已配置任務最初需要的資源，且任務正在應用程式中執行。在 Spark 應用程式中，這意味著 Spark 驅動程式進程處於 running 狀態。 | 
| 失敗 | EMR Serverless 無法將任務執行提交至應用程式，或未成功完成。如需此任務失敗的其他資訊StateDetails，請參閱 。 | 
| Success | 任務執行已成功完成。 | 
| 取消 | CancelJobRun API 已請求取消任務執行，或任務執行已逾時。EMR Serverless 正在嘗試取消應用程式中的任務並釋出資源。 | 
| 已取消 | 任務執行已成功取消，且已釋出其使用的資源。 | 

# 具有寬限期的 EMR Serverless 任務執行取消
<a name="job-cancellation-grace-period"></a>

在資料處理系統中，突然終止可能會導致資源浪費、不完整的操作和潛在的資料不一致。Amazon EMR Serverless 可讓您在取消任務執行時指定寬限期。此功能允許在任務終止之前，有時間正確清除和完成進行中的工作。

取消任務執行時，請使用 參數指定寬限期 （以秒為單位）`shutdownGracePeriodInSeconds`，在此期間任務可以在最終終止之前執行清除操作。行為和預設設定因批次和串流任務而異。

## 批次任務的寬限期
<a name="grace-period-batch-jobs"></a>

對於批次任務，EMR Serverless 可讓您實作在寬限期內執行的自訂清除操作。您可以在應用程式程式碼中將這些清除操作註冊為 JVM 關機掛鉤的一部分。

**預設行為**

關機的預設行為是沒有寬限期。它包含以下兩個動作：
+ 立即終止
+ 資源會立即釋出

**組態選項**

您可以指定導致正常關機的設定：
+ 關閉寬限期的有效範圍：15-1800 秒 （選用）
+ 立即終止 （無任何寬限期）：0 秒

### 啟用正常關機
<a name="enable-graceful-shutdown-batch"></a>

若要為批次任務實作正常關機，請遵循下列步驟：

1. 在包含自訂關閉邏輯的應用程式程式碼中新增關機掛鉤。

------
#### [ Example in Scala ]

   ```
   import org.apache.hadoop.util.ShutdownHookManager
   
   // Register shutdown hook with priority (second argument)
   // Higher priority hooks run first
   ShutdownHookManager.get().addShutdownHook(() => {
       logger.info("Performing cleanup operations...")
   }, 100)
   ```

   使用 [ShutdownHookManager](https://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-common/api/org/apache/hadoop/util/ShutdownHookManager.html)

------
#### [ Example in PySpark ]

   ```
   import atexit
   
   def cleanup():
       # Your cleanup logic here
       print("Performing cleanup operations...")
   
   # Register the cleanup function
   atexit.register(cleanup)
   ```

------

1. 在取消任務時指定寬限期，以允許先前新增的勾點有時間執行

   **範例**

   ```
   # Default (immediate termination)
   aws emr-serverless cancel-job-run \
     --application-id APPLICATION_ID \
     --job-run-id JOB_RUN_ID
   
   # With 5-minute grace period
   aws emr-serverless cancel-job-run \
     --application-id APPLICATION_ID \
     --job-run-id JOB_RUN_ID \
     --shutdown-grace-period-in-seconds 300
   ```

## 串流任務的寬限期
<a name="grace-period-streaming-jobs"></a>

在 Spark 結構化串流中，其中運算涉及從外部資料來源讀取或寫入，突然關機可能會導致不需要的結果。串流任務處理微批次中的資料，並在中途中斷這些操作可能會導致後續嘗試中重複處理。當先前微批次的最新檢查點未寫入，導致串流任務重新啟動時再次處理相同的資料時，就會發生這種情況。這種重複處理不僅浪費運算資源，還可能影響業務營運，因此避免突然關機至關重要。

EMR Serverless 透過串流查詢接聽程式提供內建的正常關機支援。這可確保在任務終止之前正確完成持續的微批次。此服務會自動管理串流應用程式微批次之間的正常關閉，確保目前的微批次完成處理、正確寫入檢查點，並且串流內容會乾淨地終止，而不會在關閉程序期間擷取新資料。

**預設行為**
+ 預設啟用 120 秒寬限期。
+ 內建串流查詢接聽程式可管理正常關機。

**組態選項**
+ 關閉寬限期的有效範圍：15-1800 秒 （選用）
+ 立即終止：0 秒

### 啟用 Graceful 關機
<a name="enable-graceful-shutdown-streaming"></a>

若要為串流任務實作正常關機：

取消任務時，請指定寬限期，讓進行中的微批次有時間完成。

**範例**

```
# Default graceful shutdown (120 seconds)
aws emr-serverless cancel-job-run \
  --application-id APPLICATION_ID \
  --job-run-id JOB_RUN_ID

# Custom grace period (e.g. 300 seconds)
aws emr-serverless cancel-job-run \
  --application-id APPLICATION_ID \
  --job-run-id JOB_RUN_ID \
  --shutdown-grace-period-in-seconds 300

# Immediate Termination
aws emr-serverless cancel-job-run \
  --application-id APPLICATION_ID \
  --job-run-id JOB_RUN_ID \
  --shutdown-grace-period-in-seconds 0
```

### 新增自訂關閉掛鉤 （選用）
<a name="custom-shutdown-hooks"></a>

雖然 EMR Serverless 預設會透過內建串流查詢接聽程式來管理正常關機，但您可以選擇為個別串流查詢實作自訂關機邏輯。EMR Serverless 會註冊其具有優先順序 60 的正常關機接聽程式 （使用 ShutdownHookManager)。由於優先順序較高的掛鉤會先執行，因此您可以註冊優先順序大於 60 的自訂清除操作，以確保它們在 EMR Serverless 的關閉程序開始之前執行。

若要新增自訂掛鉤，請參閱本主題中第一個範例，說明如何在應用程式程式碼中新增關機掛鉤。在這裡，100 是優先順序，大於 60。因此，這類關機掛鉤會先執行。

**注意**  
自訂關閉掛鉤是選用的，對於正常的關閉功能並非必要，此功能由 EMR Serverless 自動處理。

### 寬限期費用和批次持續時間
<a name="grace-period-charges"></a>

如果使用寬限期的預設值 (120 秒）：
+ 如果您的批次持續時間少於 120 秒，您只需支付完成批次所需的實際時間費用。
+ 如果您的批次持續時間超過 120 秒，則會向您收取最長寬限期 (120 秒） 的費用，但查詢可能無法正常關閉，因為它將被強制終止。

若要最佳化成本並確保正常關機：
+ 對於批次持續時間 > 120 秒：考慮增加寬限期以符合批次持續時間
+ 對於批次持續時間 < 120 秒：不需要調整寬限期，因為您只需支付實際處理時間的費用

## 考量事項
<a name="considerations"></a>

### 寬限期行為
<a name="grace-period-behavior"></a>
+ 寬限期提供註冊的關閉勾點完成的時間。
+ 任務會在關閉勾點完成後立即終止，即使它在寬限期之前也是如此。
+ 如果清除操作超過寬限期，任務將強制終止。

### 服務行為
<a name="service-behavior"></a>
+ 寬限期關閉僅適用於處於 RUNNING 狀態的任務。
+ CANCELLING 狀態期間的後續取消請求會被忽略。
+ 如果 EMR Serverless 因內部服務錯誤而無法啟動寬限期關閉：
  + 服務將重試最多 2 分鐘。
  + 如果重試失敗，任務將強制終止。

### 帳單
<a name="billing"></a>

任務會針對使用的運算資源計費，直到任務完全關閉為止，包括在寬限期內採取的任何時間。

# 從 EMR Studio 主控台執行任務
<a name="jobs-studio"></a>

您可以將任務執行提交至 EMR Serverless 應用程式，並從 EMR Studio 主控台存取任務。若要在 EMR Studio 主控台上建立或導覽至 EMR Serverless 應用程式，請遵循[從主控台入門](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/getting-started.html#gs-console)中的指示。

## 提交工作
<a name="studio-submit-job"></a>

在**提交任務**頁面上，將任務提交至 EMR Serverless 應用程式，如下所示。

------
#### [ Spark ]

1. 在**名稱**欄位中，輸入任務執行的名稱。

1. 在**執行期角色**欄位中，輸入 EMR Serverless 應用程式可為任務執行擔任的 IAM 角色名稱。若要進一步了解執行期角色，請參閱 [Amazon EMR Serverless 的任務執行期角色](security-iam-runtime-role.md)。

1. 在**指令碼位置**欄位中，輸入您要執行的指令碼或 JAR 的 Amazon S3 位置。對於 Spark 任務，指令碼可以是 Python (`.py`) 檔案或 JAR (`.jar`) 檔案。

1. 如果您的指令碼位置是 JAR 檔案，請在**主類別欄位中輸入任務進入點的類別**名稱。

1. （選用） 輸入其餘欄位的值。
   + **指令碼引**數 — 輸入您要傳遞給主要 JAR 或 Python 指令碼的任何引數。您的程式碼會讀取這些參數。以逗號分隔陣列中的每個引數。
   + **Spark 屬性** — 展開 Spark 屬性區段，並在此欄位中輸入任何 Spark 組態參數。
**注意**  
如果您指定 Spark 驅動程式和執行器大小，請將記憶體負荷納入考量。在屬性 `spark.driver.memoryOverhead`和 中指定記憶體額外負荷值`spark.executor.memoryOverhead`。記憶體額外負荷的預設值為容器記憶體的 10%，下限為 384 MB。執行器記憶體和記憶體額外負荷不能超過工作者記憶體。例如，30 GB 工作者`spark.executor.memory`的上限為 27 GB。
   + **任務組態** — 在此欄位中指定任何任務組態。您可以使用這些任務組態來覆寫應用程式的預設組態。
   + **其他設定** — 啟用或停用 AWS Glue Data Catalog 做為中繼存放區，並修改應用程式日誌設定。若要進一步了解中繼存放區組態，請參閱 [EMR Serverless 的中繼存放區組態](metastore-config.md)。若要進一步了解應用程式記錄選項，請參閱 [儲存日誌](logging.md)。
   + **標籤** — 將自訂標籤指派給應用程式。

1. 選擇 **Submit job** (提交任務)。

------
#### [ Hive ]

1. 在**名稱**欄位中，輸入任務執行的名稱。

1. 在**執行期角色**欄位中，輸入 EMR Serverless 應用程式可為任務執行擔任的 IAM 角色名稱。

1. 在**指令碼位置**欄位中，輸入您要執行的指令碼或 JAR 的 Amazon S3 位置。對於 Hive 任務，指令碼必須是 Hive (`.sql`) 檔案。

1. （選用） 輸入其餘欄位的值。
   + **初始化指令碼位置** – 輸入在 Hive 指令碼執行之前初始化資料表的指令碼位置。
   + **Hive 屬性** – 展開 Hive 屬性區段，並在此欄位中輸入任何 Hive 組態參數。
   + **任務組態** – 指定任何任務組態。您可以使用這些任務組態來覆寫應用程式的預設組態。對於 Hive 任務， `hive.exec.scratchdir`和 `hive.metastore.warehouse.dir`是`hive-site`組態中的必要屬性。

     ```
     {
         "applicationConfiguration": [
             {
                 "classification": "hive-site",
                 "configurations": [],
                 "properties": {
                     "hive.exec.scratchdir": "s3://DOC-EXAMPLE_BUCKET/hive/scratch",
                     "hive.metastore.warehouse.dir": "s3://DOC-EXAMPLE_BUCKET/hive/warehouse"
                 }
             }
         ],
         "monitoringConfiguration": {}
     }
     ```
   + **其他設定** — 啟用或停用 AWS Glue Data Catalog 做為中繼存放區，並修改應用程式日誌設定。若要進一步了解中繼存放區組態，請參閱 [EMR Serverless 的中繼存放區組態](metastore-config.md)。若要進一步了解應用程式記錄選項，請參閱 [儲存日誌](logging.md)。
   + **標籤** — 將任何自訂標籤指派給應用程式。

1. 選擇 **Submit job** (提交任務)。

------

## 存取任務執行
<a name="studio-view-jobs"></a>

從應用程式**詳細資訊**頁面上**的任務執行**索引標籤中，存取任務執行，並針對任務執行執行執行下列動作。

**取消任務** — 若要取消處於 `RUNNING` 狀態的任務執行，請選擇此選項。若要進一步了解任務執行轉換，請參閱 [作業執行狀態](job-states.md)。

**複製任務** — 若要複製先前的任務執行並重新提交，請選擇此選項。

# 從 執行任務 AWS CLI
<a name="jobs-cli"></a>

您可以在 上建立、描述和刪除個別任務 AWS CLI。您也可以列出所有任務，讓您一目了然地存取它們。

若要提交新任務，請使用 `start-job-run`。提供您要執行的應用程式 ID，以及任務特定的屬性。如需 Spark 範例，請參閱 [執行 EMR Serverless 任務時使用 Spark 組態](jobs-spark.md)。如需 Hive 範例，請參閱 [執行 EMR Serverless 任務時使用 Hive 組態](jobs-hive.md)。此命令會傳回您的 `application-id`、ARN 和新的 `job-id`。

每個任務執行都有設定的逾時持續時間。如果任務執行超過此持續時間，EMR Serverless 會自動將其取消。預設逾時為 12 小時。當您開始任務執行時，請將此逾時設定設定為符合您任務需求的值。使用 `executionTimeoutMinutes` 屬性設定 值。

```
aws emr-serverless start-job-run \
  --application-id application-id \
  --execution-role-arn job-role-arn \
  --execution-timeout-minutes 15 \
  --job-driver '{
    "hive": {
        "query": "s3://amzn-s3-demo-bucket/scripts/create_table.sql",
        "parameters": "--hiveconf hive.exec.scratchdir=s3://amzn-s3-demo-bucket/hive/scratch --hiveconf hive.metastore.warehouse.dir=s3://amzn-s3-demo-bucket/hive/warehouse"
    }
   }' \
  --configuration-overrides '{
    "applicationConfiguration": [{
        "classification": "hive-site",
        "properties": {
            "hive.client.cores": "2",
            "hive.client.memory": "4GIB"
        }
    }]
}'
```

若要描述任務，請使用 `get-job-run`。此命令會傳回任務特定的組態，以及新任務的設定容量。

```
aws emr-serverless get-job-run \
--job-run-id job-id \
--application-id application-id
```

若要列出您的任務，請使用 `list-job-runs`。此命令會傳回一組縮寫屬性，其中包含任務類型、狀態和其他高階屬性。如果您不想存取所有任務，請指定您要存取的任務數量上限，最多 50 個。下列範例指定您想要存取前兩個任務執行。

```
aws emr-serverless list-job-runs \
--max-results 2 \
--application-id application-id
```

若要取消任務，請使用 `cancel-job-run`。提供您要取消之任務`job-id`的 `application-id`和 。

```
aws emr-serverless cancel-job-run \
--job-run-id job-id \
--application-id application-id
```

如需如何從 執行任務的詳細資訊 AWS CLI，請參閱 [EMR Serverless API 參考](https://docs.aws.amazon.com/emr-serverless/latest/APIReference/Welcome.html)。

# 執行 IAM 政策
<a name="jobs-cli-execution"></a>

在 EMR Serverless 上提交任務執行時，除了執行角色之外，您還可以指定執行 IAM 政策。任務執行所取得的許可是執行角色和指定執行 IAM 政策中許可的交集。

## 開始使用
<a name="jobs-cli-execution-getting-started"></a>

使用執行 IAM 政策的步驟：

建立應用程式或使用現有的`emr-serverless`應用程式，然後執行下列 aws cli，以使用內嵌 IAM 政策開始任務執行：

```
aws emr-serverless start-job-run --region us-west-2 \
      --application-id application-id \
      --execution-role-arn execution-role-arn \
      --job-driver job-driver-options \
      --execution-iam-policy '{"policy": "inline-policy"}'
```

## CLI 命令範例
<a name="jobs-cli-execution-examples"></a>

如果我們在機器的 `policy.json` 檔案中存放了下列政策：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::my-test-bucket",
        "arn:aws:s3:::my-test-bucket/*"
      ],
      "Sid": "AllowS3Getobject"
    }
  ]
}
```

------

然後，我們可以使用下列 AWS CLI 命令啟動此政策的任務：

```
aws emr-serverless start-job-run --region us-west-2 \
      --application-id application-id \
      --execution-role-arn execution-role-arn \
      --job-driver job-driver-options
      --execution-iam-policy '{
          "policy": '$(jq -c '. | @json' policy.json)'
      }'
```

您也可以同時使用 AWS 和客戶受管政策，透過其 ARNs 指定它們：

```
aws emr-serverless start-job-run --region us-west-2 \
      --application-id application-id \
      --execution-role-arn execution-role-arn \
      --job-driver job-driver-options
      --execution-iam-policy '{
          "policyArns": [
          "arn:aws:iam::aws:policy/AmazonS3FullAccess",
          "arn:aws:iam::aws:policy/CloudWatchLogsFullAccess"
          ]
    }'
```

您也可以在相同的請求中同時指定內嵌 IAM 政策和受管政策 ARNs：

```
aws emr-serverless start-job-run --region us-west-2 \
      --application-id application-id \
      --execution-role-arn execution-role-arn \
      --job-driver job-driver-options
      --execution-iam-policy '{
          "policy": '$(jq -c '. | @json' policy.json)',
          "policyArns": [
          "arn:aws:iam::aws:policy/AmazonS3FullAccess",
          "arn:aws:iam::aws:policy/CloudWatchLogsFullAccess"
          ]
      }'
```

## 重要說明
<a name="jobs-cli-execution-important-notes"></a>
+ `execution-role-policy``policy` 的欄位長度上限為 2048 個字元。
+ 在 的 `execution-iam-policy``policy`欄位中指定的內嵌 IAM 政策字串必須符合 json 字串標準，而不會逸出新行和引號，如上述範例所示。
+ 最多可以指定 10 個受管政策 ARNs 的清單做為 `execution-iam-policy`的 `policyArns` 欄位的值。
+ 受管政策 ARNs 必須是有效 AWS 或客戶受管政策 ARN 的清單，指定客戶受管政策 ARN 時，政策必須屬於 EMR-S JobRun 的相同 AWS 帳戶。
+ 同時使用內嵌 IAM 政策和受管政策時，您用於內嵌和受管政策的純文字組合不得超過 2，048 個字元。
+ JobRun 所取得的許可是執行角色和指定執行 IAM 政策中許可的交集。

## 政策交集
<a name="jobs-cli-execution-policy-intersection"></a>

任務執行所取得的許可是執行角色和指定執行 IAM 政策中許可的交集。這表示必須在兩個位置指定任何必要的許可，JobRun 才能運作。不過，您可以針對您不打算更新或覆寫的任何許可，在內嵌政策中指定額外的括號允許陳述式。

範例

根據下列執行 IAM 角色政策：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:*"
      ],
      "Resource": [
        "*"
      ],
      "Sid": "AllowS3"
    },
    {
      "Effect": "Allow",
      "Action": [
        "logs:DescribeLogGroups"
      ],
      "Resource": [
        "arn:aws:logs:us-west-2:123456789012:log-group::log-stream"
      ],
      "Sid": "AllowLOGSDescribeloggroups"
    },
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:DescribeTable"
      ],
      "Resource": [
        "arn:aws:dynamodb:*:*:table/MyCompany1table"
      ],
      "Sid": "AllowDYNAMODBDescribetable"
    }
  ]
}
```

------

以及下列內嵌 IAM 政策：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::my-test-bucket/tenant1",
        "arn:aws:s3:::my-test-bucket/tenant1/*"
      ],
      "Sid": "AllowS3Getobject"
    },
    {
      "Effect": "Allow",
      "Action": [
        "logs:*",
        "dynamodb:*"
      ],
      "Resource": [
        "*"
      ],
      "Sid": "AllowLOGS"
    }
  ]
}
```

------

JobRun 所取得的許可如下：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::my-test-bucket/tenant1",
        "arn:aws:s3:::my-test-bucket/tenant1/*"
      ],
      "Sid": "AllowS3Getobject"
    },
    {
      "Effect": "Allow",
      "Action": [
        "logs:DescribeLogGroups"
      ],
      "Resource": [
        "arn:aws:logs:us-west-2:123456789012:log-group::log-stream"
      ],
      "Sid": "AllowLOGSDescribeloggroups"
    },
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:DescribeTable"
      ],
      "Resource": [
        "arn:aws:dynamodb:*:*:table/MyCompany1table"
      ],
      "Sid": "AllowDYNAMODBDescribetable"
    }
  ]
}
```

------

# 使用隨機最佳化磁碟
<a name="jobs-shuffle-optimized-disks"></a>

使用 Amazon EMR 7.1.0 版及更新版本，請在執行 Apache Spark 或 Hive 任務時使用隨機最佳化磁碟，以提高 I/O 密集型工作負載的效能。相較於標準磁碟，隨機播放最佳化磁碟提供更高的 IOPS （每秒 I/O 操作），可在隨機播放操作期間更快速地移動資料並減少延遲。隨機最佳化磁碟可讓您連接每個工作者最多 2 TB 的磁碟大小，因此請為您的工作負載需求設定適當的容量。

## 主要優點
<a name="jobs-shuffle-optimized-disks-key-benefits"></a>

隨機最佳化磁碟提供下列優點。
+ **高 IOPS 效能** – 隨機播放最佳化磁碟提供的 IOPS 高於標準磁碟，因此在 Spark 和 Hive 任務和其他隨機播放密集型工作負載期間，資料隨機播放更有效率且速度更快。
+ **較大的磁碟大小** – 隨機最佳化磁碟支援每個工作者 20GB 到 2TB 的磁碟大小，因此請根據您的工作負載選擇適當的容量。

## 開始使用
<a name="jobs-shuffle-optimized-disks-getting-started"></a>

請參閱下列步驟，以在工作流程中使用隨機最佳化磁碟。

------
#### [ Spark ]

1. 使用下列命令建立 EMR Serverless 7.1.0 版應用程式。

   ```
   aws emr-serverless create-application \
     --type "SPARK" \
     --name my-application-name \
     --release-label emr-7.1.0 \
     --region <AWS_REGION>
   ```

1. 設定您的 Spark 任務以包含參數`spark.emr-serverless.driver.disk.type`和/`spark.emr-serverless.executor.disk.type`或使用隨機最佳化磁碟執行。視您的使用案例而定，您可以使用一個或兩個參數。

   ```
   aws emr-serverless start-job-run \
       --application-id application-id \
       --execution-role-arn job-role-arn \
       --job-driver '{
           "sparkSubmit": {
               "entryPoint": "/usr/lib/spark/examples/jars/spark-examples.jar",
               "entryPointArguments": ["1"],
               "sparkSubmitParameters": "--class org.apache.spark.examples.SparkPi 
               --conf spark.executor.cores=4 
               --conf spark.executor.memory=20g 
               --conf spark.driver.cores=4 
               --conf spark.driver.memory=8g 
               --conf spark.executor.instances=1 
               --conf spark.emr-serverless.executor.disk.type=shuffle_optimized"
           }
       }'
   ```

   如需詳細資訊，請參閱 [ Spark 任務屬性](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/jobs-spark.html#spark-defaults)。

------
#### [ Hive ]

1. 使用下列命令建立 EMR Serverless 7.1.0 版應用程式。

   ```
   aws emr-serverless create-application \
     --type "HIVE" \
     --name my-application-name \
     --release-label emr-7.1.0 \
     --region <AWS_REGION>
   ```

1. 設定 Hive 任務以包含參數`hive.driver.disk.type`和/`hive.tez.disk.type`或使用隨機最佳化磁碟執行。視您的使用案例而定，您可以使用一個或兩個參數。

   ```
   aws emr-serverless start-job-run \
       --application-id application-id \
       --execution-role-arn job-role-arn \
       --job-driver '{
           "hive": {
               "query": "s3://<DOC-EXAMPLE-BUCKET>/emr-serverless-hive/query/hive-query.ql",
               "parameters": "--hiveconf hive.log.explain.output=false"
           }
       }' \
       --configuration-overrides '{
           "applicationConfiguration": [{
               "classification": "hive-site",
               "properties": {
                   "hive.exec.scratchdir": "s3://<DOC-EXAMPLE-BUCKET>/emr-serverless-hive/hive/scratch",
                   "hive.metastore.warehouse.dir": "s3://<DOC-EXAMPLE-BUCKET>/emr-serverless-hive/hive/warehouse",
                   "hive.driver.cores": "2",
                   "hive.driver.memory": "4g",
                   "hive.tez.container.size": "4096",
                   "hive.tez.cpu.vcores": "1",
                   "hive.driver.disk.type": "shuffle_optimized",
                   "hive.tez.disk.type": "shuffle_optimized"
               }
           }]
       }'
   ```

   如需詳細資訊，請參閱 [ Hive 任務屬性](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/jobs-hive.html#hive-defaults)。

------

**設定具有預先初始化容量的應用程式**

請參閱下列範例，以根據 Amazon EMR 7.1.0 版建立應用程式。這些應用程式具有下列屬性：
+ 5 個預先初始化的 Spark 驅動程式，每個驅動程式都有 2 個 vCPU、4 GB 記憶體和 50 GB 隨機最佳化磁碟。
+ 50 個預先初始化的執行器，每個執行器都有 4 個 vCPU、8 GB 記憶體和 500 GB 隨機最佳化磁碟。

當此應用程式執行 Spark 任務時，它會先使用預先初始化的工作者，然後將隨需工作者擴展到最大容量 400 個 vCPU 和 1024 GB 的記憶體。或者，您可以省略 `DRIVER`或 的容量`EXECUTOR`。

------
#### [ Spark ]

```
aws emr-serverless create-application \
  --type "SPARK" \
  --name <my-application-name> \
  --release-label emr-7.1.0 \
  --initial-capacity '{
    "DRIVER": {
        "workerCount": 5,
        "workerConfiguration": {
            "cpu": "2vCPU",
            "memory": "4GB",
            "disk": "50GB",
            "diskType": "SHUFFLE_OPTIMIZED"
        }
    },
    "EXECUTOR": {
        "workerCount": 50,
        "workerConfiguration": {
            "cpu": "4vCPU",
            "memory": "8GB",
            "disk": "500GB",
            "diskType": "SHUFFLE_OPTIMIZED"
        }
    }
  }' \
  --maximum-capacity '{
    "cpu": "400vCPU",
    "memory": "1024GB"
  }'
```

------
#### [ Hive ]

```
aws emr-serverless create-application \
  --type "HIVE" \
  --name <my-application-name> \
  --release-label emr-7.1.0 \
  --initial-capacity '{
    "DRIVER": {
        "workerCount": 5,
        "workerConfiguration": {
            "cpu": "2vCPU",
            "memory": "4GB",
            "disk": "50GB",
            "diskType": "SHUFFLE_OPTIMIZED"
        }
    },
    "EXECUTOR": {
        "workerCount": 50,
        "workerConfiguration": {
            "cpu": "4vCPU",
            "memory": "8GB",
            "disk": "500GB",
            "diskType": "SHUFFLE_OPTIMIZED"
        }
    }
  }' \
  --maximum-capacity '{
    "cpu": "400vCPU",
    "memory": "1024GB"
  }'
```

------

# 使用 Amazon EMR Serverless 的無伺服器儲存
<a name="jobs-serverless-storage"></a>

使用 Amazon EMR 7.12 版及更高版本時，請在執行 Apache Spark 任務時使用無伺服器儲存體，以消除本機磁碟佈建並降低資料處理成本，並防止任務失敗造成磁碟容量限制。無伺服器儲存會自動處理任務的隨機播放、磁碟溢出和磁碟快取操作，而不需要容量組態，並免費存放中繼資料。Amazon EMR Serverless 會將中繼資料存放在完全受管的無伺服器儲存體中，該儲存體會根據工作負載需求自動擴展，並可讓 Spark 在閒置時立即釋放運算工作者，進而降低運算成本。

## 主要優點
<a name="jobs-serverless-storage-key-benefits"></a>

EMR Serverless 的無伺服器儲存提供下列優點。
+ **零組態儲存** – 無伺服器儲存不需要為每個應用程式或任務設定本機磁碟類型和大小。EMR Serverless 會自動管理中繼資料操作，無需容量規劃。
+ **透過自動擴展來防止任務失敗** – 儲存容量會根據工作負載需求自動擴展，防止任務失敗的磁碟容量不足。
+ **降低資料處理成本** – 無伺服器儲存體透過兩種機制降低處理成本。首先，免費提供中繼資料儲存，您只需支付運算和記憶體資源的費用。其次，具有 Spark 動態資源配置的解耦儲存可讓 Spark 在閒置時立即釋出工作者，而不是保留工作者，以保留本機磁碟上的中繼資料。這可讓每個 Spark 階段的向外擴展和向內擴展速度更快，降低較新階段需要較少工作者的任務運算成本。
+ **具有任務層級隔離的加密儲存** – 所有中繼資料都會在傳輸中和靜態時以嚴格的任務層級隔離進行加密。
+ **精細存取控制支援** – 無伺服器儲存支援透過 AWS Lake Formation 整合進行精細存取控制。

## 開始使用
<a name="jobs-serverless-storage-getting-started"></a>

請參閱下列步驟，以在 Spark 工作流程中使用 EMR Serverless 的無伺服器儲存。

1. **建立 EMR Serverless 應用程式**

   在 spark-defaults 分類中將 spark 屬性設定為 `spark.aws.serverlessStorage.enabled` **true**，以建立已啟用無伺服器儲存的 EMR Serverless 7.12 版 （或更新版本） 應用程式。

   ```
   aws emr-serverless create-application \
     --type "SPARK" \
     --name my-application \
     --release-label emr-7.12.0 \
     --runtime-configuration '[{
         "classification": "spark-defaults",
           "properties": {
             "spark.aws.serverlessStorage.enabled": "true"
           }
       }]' \
     --region <AWS_REGION>
   ```

1. **啟動 Spark 任務**

   在您的應用程式上啟動任務執行。EMR Serverless 的無伺服器儲存會自動處理中繼資料操作，例如任務的隨機播放。

   ```
   aws emr-serverless start-job-run \
     --application-id <application-id> \
     --execution-role-arn <job-role-arn> \
     --job-driver '{
       "sparkSubmit": {
         "entryPoint": "s3://<bucket>/script.py",
         "sparkSubmitParameters": "--conf spark.executor.cores=4 
           --conf spark.executor.memory=20g 
           --conf spark.driver.cores=4 
           --conf spark.driver.memory=8g 
           --conf spark.executor.instances=10"
       }
     }'
   ```

   您也可以在任務層級啟用 EMR Serverless 的無伺服器儲存體，即使應用程式層級未啟用也一樣。這將啟動已啟用無伺服器儲存的工作者節點，以處理您的任務。您也可以將相同的 Spark 屬性設定為 `spark.aws.serverlessStorage.enabled` **false**，以停用特定任務的無伺服器儲存。

   ```
   # Turn on serverless storage for EMR serverless for a specific job
   aws emr-serverless start-job-run \
       --application-id <application-id> \
       --execution-role-arn <job-role-arn> \
       --job-driver '{
   "sparkSubmit": {
   "entryPoint": "/usr/lib/spark/examples/jars/spark-examples.jar",
               "entryPointArguments": ["1"],
               "sparkSubmitParameters": "--class org.apache.spark.examples.SparkPi
               --conf spark.aws.serverlessStorage.enabled": "true"
           }
       }'
   ```
**注意**  
若要繼續使用傳統的本機磁碟佈建，請省略`spark.aws.serverlessStorage.enabled`組態或將其設定為 **false**。

## 考量和限制
<a name="jobs-serverless-storage-limitations"></a>
+ **發行版本** – Amazon EMR 7.12 版及更新版本支援無伺服器儲存。
+ **資料量限制** – 每個任務每次任務執行最多可讀取和寫入總計 200 GB 的中繼資料。超過此限制的任務將會失敗，並顯示錯誤訊息，指出已達到無伺服器儲存限制。
+ **任務執行逾時** – 無伺服器儲存支援執行逾時長達 24 小時的任務。針對較長執行逾時設定的任務將會失敗，並顯示錯誤訊息。
+ **預先初始化的容量** – 預先初始化的容量工作者不支援無伺服器儲存。當您設定預先初始化容量時，它只會由在任務層級明確停用無伺服器儲存的任務使用。啟用無伺服器儲存的任務一律會隨需佈建新工作者，而且不會使用任何預先初始化的容量，無論應用程式層級中的組態為何。
+ **工作負載類型** – 串流和互動式任務不支援無伺服器儲存。
+ **工作者組態** – 具有 1 或 2 個 vCPUs工作者不支援無伺服器儲存。

## 支援的 AWS 區域
<a name="jobs-serverless-storage-regions"></a>

EMR Serverless 在下列區域中支援無伺服器儲存：
+ 美國東部 (維吉尼亞北部)
+ 美國西部 (奧勒岡)
+ 歐洲 (愛爾蘭)

# 處理持續串流資料的串流任務
<a name="jobs-streaming"></a>

EMR Serverless 中的串流任務是一種任務模式，可讓您近乎即時地分析和處理串流資料。這些長時間執行的任務會輪詢串流資料，並在資料送達時持續處理結果。串流任務最適合需要即時資料處理的任務，例如近乎即時的分析、詐騙偵測和建議引擎。EMR Serverless 串流任務提供最佳化，例如內建任務彈性、即時監控、增強型日誌管理，以及與串流連接器的整合。

以下是具有串流任務的一些使用案例：
+ **近乎即時的分析** – Amazon EMR Serverless 中的串流任務可讓您近乎即時地處理串流資料，因此您可以對連續資料串流執行即時分析，例如日誌資料、感應器資料或點擊串流資料，以衍生洞見並根據最新資訊及時做出決策。
+ **詐騙偵測** – 當您分析資料串流，並在發生可疑模式或異常時，使用串流任務在金融交易、信用卡操作或線上活動中執行近乎即時的詐騙偵測。
+ **建議引擎** – 串流任務可以處理使用者活動資料和更新建議模型。這樣做會根據行為和偏好開啟個人化和即時建議的可能性。
+ **社交媒體分析** – 串流任務可以處理社交媒體資料，例如推文、評論和文章，讓組織可以近乎即時地監控趨勢、情緒分析和管理品牌評價。
+ **物聯網 (IoT) 分析** – 串流任務可以處理和分析來自 IoT 裝置、感應器和連線機器的高速資料串流，因此執行異常偵測、預測性維護和其他 IoT 分析使用案例。
+ **Clickstream 分析** – 串流任務可以處理和分析來自網站或行動應用程式的 Clickstream 資料。使用這類資料的企業可以執行分析，以進一步了解使用者行為、個人化使用者體驗，以及最佳化行銷活動。
+ **日誌監控和分析** – 串流任務也可以處理來自伺服器、應用程式和網路裝置的日誌資料。這可為您提供異常偵測、故障診斷，以及系統運作狀態和效能。

**主要優點**

EMR Serverless 中的串流任務會自動提供*任務彈性*，這是下列因素的組合：
+ **自動重試** – EMR Serverless 會自動重試失敗的任何任務，而無需您進行任何手動輸入。
+ **可用區域 (AZ) 彈性** – 如果原始 AZ 遇到問題，EMR Serverless 會自動將串流任務切換到運作狀態良好的 AZ。
+ **日誌管理：**
  + **日誌輪換** – 為了更有效率的磁碟儲存管理，EMR Serverless 會定期輪換長時間串流任務的日誌。這樣做可以防止可能耗用所有磁碟空間的日誌累積。
  + **日誌壓縮** – 可協助您以受管持久性有效率地管理和最佳化日誌檔案。壓縮也會改善您使用 受管 Spark 歷史記錄伺服器的偵錯體驗。

**支援的資料來源和資料接收器**

EMR Serverless 可與多個輸入資料來源和輸出資料接收器搭配使用：
+ 支援的輸入資料來源 – Amazon Kinesis Data Streams、Amazon Managed Streaming for Apache Kafka 和自我管理 Apache Kafka 叢集。根據預設，Amazon EMR 7.1.0 版和更新版本包含 [Amazon Kinesis Data Streams 連接器](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark-structured-streaming-kinesis.html)，因此您不需要建置或下載任何其他套件。
+ 支援的輸出資料接收器 – AWS Glue Data Catalog 資料表、Amazon S3、Amazon Redshift、MySQL、PostgreSQL Oracle、Oracle、Microsoft SQL、Apache Iceberg、Delta Lake 和 Apache Hudi。

## 考量和限制
<a name="jobs-spark-streaming-considerations"></a>

當您使用串流任務時，請記住下列考量和限制。
+ [Amazon EMR 7.1.0 版及更高版本](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-710-release.html)支援串流任務。
+ EMR Serverless 預期串流任務會長時間執行，因此您無法設定執行逾時來限制任務的執行時間。
+ 串流任務僅與 Spark 引擎相容，該引擎以[結構化串流架構](https://spark.apache.org/streaming/)為基礎。
+ EMR Serverless 會無限期重試串流任務，您無法自訂最大嘗試次數。如果失敗的嘗試次數超過每小時時段設定的閾值，則會自動包含預防威脅以停止任務重試。預設閾值是在一小時內嘗試失敗 5 次。您可以將此閾值設定為 1 到 10 次嘗試。如需詳細資訊，請參閱 [任務彈性](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/SECTION-jobs-resiliency.xml.html)。
+ 串流任務具有檢查點來儲存執行時間狀態和進度，因此 EMR Serverless 可以從最新的檢查點繼續串流任務。如需詳細資訊，請參閱 Apache Spark 文件中的[使用檢查點從失敗中復原](https://spark.apache.org/docs/latest/structured-streaming-programming-guide.html#recovering-from-failures-with-checkpointing)。

# 開始使用串流任務
<a name="jobs-spark-streaming-getting-started"></a>

請參閱下列指示，了解如何開始使用串流任務。

1. 遵循 [Amazon EMR Serverless 入門來建立應用程式。](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/getting-started.html)請注意，您的應用程式必須執行 [Amazon EMR 7.1.0 版](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-710-release.html)或更新版本。

1. 一旦應用程式準備就緒，請將 `mode` 參數設定為 `STREAMING` 以提交串流任務，類似下列 AWS CLI 範例。

   ```
   aws emr-serverless start-job-run \
   --application-id <APPPLICATION_ID> \
   --execution-role-arn <JOB_EXECUTION_ROLE> \
   --mode 'STREAMING' \
   --job-driver '{
       "sparkSubmit": {
           "entryPoint": "s3://<streaming script>",
           "entryPointArguments": ["s3://<DOC-EXAMPLE-BUCKET-OUTPUT>/output"],
           "sparkSubmitParameters": "--conf spark.executor.cores=4
               --conf spark.executor.memory=16g 
               --conf spark.driver.cores=4
               --conf spark.driver.memory=16g 
               --conf spark.executor.instances=3"
       }
   }'
   ```

# 支援的串流連接器
<a name="jobs-spark-streaming-connectors"></a>

串流連接器有助於從串流來源讀取資料，也可以將資料寫入串流接收器。

以下是支援的串流連接器：

**Amazon Kinesis Data Streams 連接器**

適用於 Apache Spark 的 [Amazon Kinesis Data Streams 連接器](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark-structured-streaming-kinesis.html)可讓您建置串流應用程式和管道，以取用來自 的資料，並將資料寫入 Amazon Kinesis Data Streams。連接器支援增強的廣發耗用，專用讀取輸送量速率高達每個碎片 2MB/秒。根據預設，Amazon EMR Serverless 7.1.0 及更高版本包含 連接器，因此您不需要建置或下載任何其他套件。如需連接器的詳細資訊，請參閱 [ GitHub 上的 spark-sql-kinesis-connector 頁面](https://github.com/awslabs/spark-sql-kinesis-connector/)。

以下是如何使用 Kinesis Data Streams 連接器相依性啟動任務執行的範例。

```
aws emr-serverless start-job-run \
--application-id <APPLICATION_ID> \
--execution-role-arn <JOB_EXECUTION_ROLE> \
--mode 'STREAMING' \
--job-driver '{
    "sparkSubmit": {
        "entryPoint": "s3://<Kinesis-streaming-script>",
        "entryPointArguments": ["s3://<DOC-EXAMPLE-BUCKET-OUTPUT>/output"],
        "sparkSubmitParameters": "--conf spark.executor.cores=4
                --conf spark.executor.memory=16g 
                --conf spark.driver.cores=4
                --conf spark.driver.memory=16g 
                --conf spark.executor.instances=3
                --jars /usr/share/aws/kinesis/spark-sql-kinesis/lib/spark-streaming-sql-kinesis-connector.jar"
    }
}'
```

若要連線至 Kinesis Data Streams，請使用 VPC 存取設定 EMR Serverless 應用程式，並使用 VPC 端點來允許私有存取。 或使用 NAT Gateway 來取得公有存取。如需詳細資訊，請參閱[設定 VPC 存取](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/vpc-access.html)。您還必須確保任務執行時間角色具有必要的讀取和寫入許可，以存取所需的資料串流。若要進一步了解如何設定任務執行期角色，請參閱 [Amazon EMR Serverless 的任務執行期角色](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/security-iam-runtime-role.html)。如需所有必要許可的完整清單，請參閱 [ GitHub 上的 spark-sql-kinesis-connector 頁面](https://github.com/awslabs/spark-sql-kinesis-connector/?tab=readme-ov-file#how-to-use-it)。

**Apache Kafka 連接器**

適用於 Spark 結構化串流的 Apache Kafka 連接器是 Spark 社群的開放原始碼連接器，可在 Maven 儲存庫中使用。此連接器有助於 Spark 結構化串流應用程式從自我管理的 Apache Kafka 和 Amazon Managed Streaming for Apache Kafka 讀取和寫入資料。如需連接器的詳細資訊，請參閱 Apache Spark 文件中的[結構化串流 \$1 Kafka 整合指南](https://spark.apache.org/docs/latest/structured-streaming-kafka-integration.html)。

下列範例示範如何在任務執行請求中包含 Kafka 連接器。

```
aws emr-serverless start-job-run \
--application-id <APPLICATION_ID> \
--execution-role-arn <JOB_EXECUTION_ROLE> \
--mode 'STREAMING' \
--job-driver '{
    "sparkSubmit": {
        "entryPoint": "s3://<Kafka-streaming-script>",
        "entryPointArguments": ["s3://<DOC-EXAMPLE-BUCKET-OUTPUT>/output"],
        "sparkSubmitParameters": "--conf spark.executor.cores=4
                --conf spark.executor.memory=16g 
                --conf spark.driver.cores=4
                --conf spark.driver.memory=16g 
                --conf spark.executor.instances=3
                --packages org.apache.spark:spark-sql-kafka-0-10_2.12:<KAFKA_CONNECTOR_VERSION>"
    }
}'
```

Apache Kafka 連接器版本取決於您的 EMR Serverless 發行版本和對應的 Spark 版本。若要尋找正確的 Kafka 版本，請參閱 [結構化串流 \$1 Kafka 整合指南](https://spark.apache.org/docs/latest/structured-streaming-kafka-integration.html)。

若要搭配 IAM 身分驗證使用 Amazon Managed Streaming for Apache Kafka，請包含另一個相依性，讓 Kafka 連接器能夠透過 IAM 連線至 Amazon MSK。如需詳細資訊，請參閱 [ GitHub 上的 aws-msk-iam-auth 儲存庫](https://github.com/aws/aws-msk-iam-auth)。您也必須確保任務執行時間角色具有必要的 IAM 許可。下列範例示範如何使用具有 IAM 身分驗證的連接器。

```
aws emr-serverless start-job-run \
--application-id <APPLICATION_ID> \
--execution-role-arn <JOB_EXECUTION_ROLE> \
--mode 'STREAMING' \
--job-driver '{
    "sparkSubmit": {
        "entryPoint": "s3://<Kafka-streaming-script>",
        "entryPointArguments": ["s3://<DOC-EXAMPLE-BUCKET-OUTPUT>/output"],
        "sparkSubmitParameters": "--conf spark.executor.cores=4
                --conf spark.executor.memory=16g 
                --conf spark.driver.cores=4
                --conf spark.driver.memory=16g 
                --conf spark.executor.instances=3
                --packages org.apache.spark:spark-sql-kafka-0-10_2.12:<KAFKA_CONNECTOR_VERSION>,software.amazon.msk:aws-msk-iam-auth:<MSK_IAM_LIB_VERSION>"
    }
}'
```

若要使用 Kafka 連接器和來自 Amazon MSK 的 IAM 身分驗證程式庫，請設定具有 VPC 存取的 EMR Serverless 應用程式。您的子網路必須具有網際網路存取權，並使用 NAT Gateway 來存取 Maven 相依性。如需詳細資訊，請參閱[設定 VPC 存取](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/vpc-access.html)。子網路必須具有網路連線才能存取 Kafka 叢集。無論您的 Kafka 叢集是自我管理還是使用 Amazon Managed Streaming for Apache Kafka，都是如此。

# 串流任務日誌管理
<a name="jobs-spark-streaming-log-management"></a>

串流任務支援 Spark 應用程式日誌和事件日誌的日誌輪換，以及 Spark 事件日誌的日誌壓縮。這可協助您有效管理 資源。

**日誌輪換**

串流任務支援 Spark 應用程式日誌和事件日誌的日誌輪換。日誌輪換可防止長串流任務產生可能佔用所有可用磁碟空間的大型日誌檔案。日誌輪換可協助您儲存磁碟儲存體，並防止任務因磁碟空間不足而失敗。如需詳細資訊，請參閱[輪換日誌](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/rotating-logs.html)。

**日誌壓縮**

只要有可用的受管日誌，串流任務也支援 Spark 事件日誌的日誌壓縮。如需受管記錄的詳細資訊，請參閱[使用受管儲存記錄](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/logging.html#jobs-log-storage-managed-storage)。串流任務可能會長時間執行，而且事件資料量可能會隨著時間累積，並大幅增加日誌檔案大小。Spark 歷史記錄伺服器會讀取這些事件並將其載入至 Spark 應用程式 UI 的記憶體。此程序可能會導致高延遲和成本，特別是在 Amazon S3 中存放的事件日誌非常大時。

日誌壓縮會減少事件日誌大小，因此 Spark 歷史記錄伺服器不需要隨時載入超過 1 GB 的事件日誌。如需詳細資訊，請參閱 Apache Spark 文件中的[監控和檢測](https://spark.apache.org/docs/latest/monitoring.html)。

# 執行 EMR Serverless 任務時使用 Spark 組態
<a name="jobs-spark"></a>

您可以在 `type` 參數設定為 的應用程式上執行 Spark 任務`SPARK`。任務必須與與 Amazon EMR 發行版本相容的 Spark 版本相容。例如，當您使用 Amazon EMR 6.6.0 版執行任務時，您的任務必須與 Apache Spark 3.2.0 相容。如需每個版本的應用程式版本資訊，請參閱 [Amazon EMR Serverless 發行版本](release-versions.md)。

## Spark 任務參數
<a name="spark-params"></a>

當您使用 [`StartJobRun` API](https://docs.aws.amazon.com/emr-serverless/latest/APIReference/API_StartJobRun.html) 執行 Spark 任務時，請指定下列參數。

**Topics**
+ [Spark 任務執行期角色](#spark-defaults-executionRoleArn)
+ [Spark 任務驅動程式參數](#spark-defaults-jobDriver)
+ [Spark 組態覆寫參數](#spark-defaults-configurationOverrides)
+ [Spark 動態資源配置最佳化](#spark-defaults-dynamicResourceAllocation)

### Spark 任務執行期角色
<a name="spark-defaults-executionRoleArn"></a>

使用 **`executionRoleArn`**為應用程式用來執行 Spark 任務的 IAM 角色指定 ARN。此角色必須包含下列許可：
+ 從資料所在的 S3 儲存貯體或其他資料來源讀取
+ 從 PySpark 指令碼或 JAR 檔案所在的 S3 儲存貯體或字首讀取
+ 寫入您要寫入最終輸出的 S3 儲存貯體
+ 將日誌寫入`S3MonitoringConfiguration`指定 的 S3 儲存貯體或字首
+ 如果您使用 KMS 金鑰來加密 S3 儲存貯體中的資料，則存取 KMS 金鑰
+ 如果您使用 SparkSQL，存取 AWS Glue Data Catalog

如果您的 Spark 任務讀取資料或從其他資料來源寫入資料，請在此 IAM 角色中指定適當的許可。如果您未將這些許可提供給 IAM 角色，任務可能會失敗。如需詳細資訊，請參閱 [Amazon EMR Serverless 的任務執行期角色](security-iam-runtime-role.md) 和 [儲存日誌](logging.md)。

### Spark 任務驅動程式參數
<a name="spark-defaults-jobDriver"></a>

使用 **`jobDriver`**為任務提供輸入。任務驅動程式參數只接受您要執行之任務類型的一個值。對於 Spark 任務，參數值為 `sparkSubmit`。您可以使用此任務類型，透過 Spark 提交執行 Scala、Java、PySpark 和任何其他支援的任務。Spark 任務具有下列參數：
+ **`sparkSubmitParameters`** – 這些是您要傳送至任務的其他 Spark 參數。使用此參數可覆寫預設 Spark 屬性，例如驅動程式記憶體或執行器數量，例如 `--conf`或 `--class`引數中定義的屬性。
+ **`entryPointArguments`** – 這是您要傳遞至主要 JAR 或 Python 檔案的引數陣列。應使用 entrypoint 程式碼讀取這些參數。以逗號分隔陣列中的每個引數。
+ **`entryPoint`** – 這是 Amazon S3 中您要執行的主要 JAR 或 Python 檔案的參考。如果您正在執行 Scala 或 Java JAR，`SparkSubmitParameters`請使用 `--class`引數在 中指定主要項目類別。

如需詳細資訊，請參閱[使用 spark-submit 啟動應用程式](https://spark.apache.org/docs/latest/submitting-applications.html#launching-applications-with-spark-submit)。

### Spark 組態覆寫參數
<a name="spark-defaults-configurationOverrides"></a>

使用 **`configurationOverrides`**覆寫監控層級和應用程式層級組態屬性。此參數接受具有下列兩個欄位的 JSON 物件：
+ **`monitoringConfiguration`** ‐ 使用此欄位指定您希望 EMR Serverless 任務存放 Spark 任務日誌的 Amazon S3 URL (`s3MonitoringConfiguration`)。請確定您已使用託管您應用程式的相同 AWS 帳戶 建立此儲存貯體，並在執行任務 AWS 區域 的相同 中建立此儲存貯體。
+ **`applicationConfiguration`** – 若要覆寫應用程式的預設組態，您可以在此欄位中提供組態物件。可以使用速記語法，以提供組態或參考 JSON 檔案中物件的組態。組態物件是由分類、屬性和選用的巢狀組態所組成。屬性由您想要在檔案中覆寫的設定組成。您可以在單一 JSON 物件中，為多個應用程式指定多個分類。
**注意**  
可用的組態分類會因特定 EMR Serverless 版本而有所不同。例如，自訂 Log4j `spark-driver-log4j2`和 的分類`spark-executor-log4j2`僅適用於 6.8.0 版和更新版本。

如果您在應用程式覆寫和 Spark 提交參數中使用相同的組態，Spark 提交參數會優先。組態的優先順序如下，從最高到最低：
+ EMR Serverless 在建立 時提供的組態`SparkSession`。
+ 您使用 `sparkSubmitParameters` `--conf`引數做為 一部分提供的組態。
+ 當您啟動任務時，您作為應用程式一部分提供的組態會覆寫 。
+ 您在建立應用程式`runtimeConfiguration`時作為 的一部分提供的組態。
+ Amazon EMR 用於發行版本的最佳化組態。
+ 應用程式的預設開放原始碼組態。

如需在應用程式層級宣告組態，以及在任務執行期間覆寫組態的詳細資訊，請參閱 [EMR Serverless 的預設應用程式組態](default-configs.md)。

### Spark 動態資源配置最佳化
<a name="spark-defaults-dynamicResourceAllocation"></a>

使用 `dynamicAllocationOptimization` 來最佳化 EMR Serverless 中的資源用量。在 Spark 組態分類`true`中將此屬性設定為 表示 為 EMR Serverless，以最佳化執行器資源配置，讓 Spark 請求和取消執行器的速率與 EMR Serverless 建立和釋放工作者的速率更一致。如此一來，EMR Serverless 就能在各個階段以最佳方式重複使用工作者，進而在執行具有多個階段的任務時降低成本，同時維持相同的效能。

此屬性適用於所有 Amazon EMR 發行版本。

以下是 的範例組態分類`dynamicAllocationOptimization`。

```
[
  {
    "Classification": "spark",
    "Properties": {
      "dynamicAllocationOptimization": "true"
    }
  }
]
```

如果您使用的是動態配置最佳化，請考慮下列事項：
+ 此最佳化適用於您啟用動態資源配置的 Spark 任務。
+ 為了實現最佳成本效益，我們建議您根據您的工作負載，使用任務層級設定`spark.dynamicAllocation.maxExecutors`或[應用程式層級最大容量](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/app-behavior.html#max-capacity)設定來設定工作者上擴展範圍。
+ 您可能不會注意到更簡單任務的成本改善。例如，如果您的任務在小型資料集上執行或完成在一個階段中執行，Spark 可能不需要更多執行器或多個擴展事件。
+ 具有一系列大型階段、較小階段，然後再次大型階段的任務，可能會在任務執行時間中遇到迴歸。由於 EMR Serverless 更有效率地使用資源，因此可能會減少較大階段的可用工作者，進而延長執行時間。

## Spark 任務屬性
<a name="spark-defaults"></a>

下表列出選用的 Spark 屬性及其預設值，您可以在提交 Spark 任務時覆寫這些屬性。


**選用 Spark 屬性和預設值**  

| 金錀 | Description | 預設值 | 
| --- | --- | --- | 
| spark.archives | Spark 擷取到每個執行器工作目錄的以逗號分隔的封存清單。支援的檔案類型包括 .jar .tar.gz、 .tgz和 .zip。若要指定要擷取的目錄名稱，請在您要擷取的檔案名稱\$1後面新增 。例如 file.zip\$1directory。 | NULL | 
| spark.authenticate | 開啟 Spark 內部連線身分驗證的選項。 | TRUE | 
| spark.driver.cores | 驅動程式使用的核心數量。 | 4 | 
| spark.driver.extraJavaOptions | Spark 驅動程式的額外 Java 選項。 | NULL | 
| spark.driver.memory | 驅動程式使用的記憶體量。 | 14G | 
| spark.dynamicAllocation.enabled | 開啟動態資源配置的選項。此選項會根據工作負載，縱向擴展或縮減向應用程式註冊的執行器數量。 | TRUE | 
| spark.dynamicAllocation.executorIdleTimeout | 在 Spark 移除執行器之前，執行器可以保持閒置的時間長度。這僅適用於您開啟動態配置的情況。 | 60 年代 | 
| spark.dynamicAllocation.initialExecutors | 如果您開啟動態配置，要執行的執行器初始數量。 | 3 | 
| spark.dynamicAllocation.maxExecutors | 如果您開啟動態配置，則執行器數量的上限。 | 對於 6.10.0 和更新版本， `infinity` 對於 6.9.0 及更低版本， `100`  | 
| spark.dynamicAllocation.minExecutors | 如果您開啟動態配置，執行器數量的下限。 | 0 | 
| spark.emr-serverless.allocation.batch.size | 每個執行器配置週期中要請求的容器數量。每個配置週期之間有一秒的間隔。 | 20 | 
| spark.emr-serverless.driver.disk | Spark 驅動程式磁碟。 | 20G | 
| spark.emr-serverless.driverEnv.[KEY] | 將環境變數新增至 Spark 驅動程式的選項。 | NULL | 
| spark.emr-serverless.executor.disk | Spark 執行器磁碟。 | 20G | 
| spark.emr-serverless.memoryOverheadFactor | 設定要新增至驅動程式和執行器容器記憶體的記憶體額外負荷。 | 0.1 | 
| spark.emr-serverless.driver.disk.type | 連接至 Spark 驅動程式的磁碟類型。 | 標準 | 
| spark.emr-serverless.executor.disk.type | 連接至 Spark 執行器的磁碟類型。 | 標準 | 
| spark.executor.cores | 每個執行器使用的核心數量。 | 4 | 
| spark.executor.extraJavaOptions | Spark 執行器的額外 Java 選項。 | NULL | 
| spark.executor.instances | 要配置的 Spark 執行器容器數量。 | 3 | 
| spark.executor.memory | 每個執行器使用的記憶體數量。 | 14G | 
| spark.executorEnv.[KEY] | 將環境變數新增至 Spark 執行器的選項。 | NULL | 
| spark.files | 要放入每個執行器工作目錄中的檔案逗號分隔清單。您可以使用 存取執行器中這些檔案的檔案路徑SparkFiles.get(fileName)。 | NULL | 
| spark.hadoop.hive.metastore.client.factory.class | Hive 中繼存放區實作類別。 | NULL | 
| spark.jars | 要新增至驅動程式和執行器執行時間 classpath 的其他 jar。 | NULL | 
| spark.network.crypto.enabled | 開啟 AES 型 RPC 加密的選項。這包括在 Spark 2.2.0 中新增的身分驗證通訊協定。 | FALSE | 
| spark.sql.warehouse.dir | 受管資料庫和資料表的預設位置。 | 的值 \$1PWD/spark-warehouse | 
| spark.submit.pyFiles | 以逗號分隔的 .zip、 .egg或 .py 檔案清單，以放置在PYTHONPATH適用於 Python 應用程式的 中。 | NULL | 

下表列出預設 Spark 提交參數。


**預設 Spark 提交參數**  

| 金錀 | Description | 預設值 | 
| --- | --- | --- | 
| archives | Spark 擷取到每個執行器工作目錄的以逗號分隔的封存清單。 | NULL | 
| class | 應用程式的主要類別 （適用於 Java 和 Scala 應用程式）。 | NULL | 
| conf | 任意 Spark 組態屬性。 | NULL | 
| driver-cores | 驅動程式使用的核心數量。 | 4 | 
| driver-memory | 驅動程式使用的記憶體量。 | 14G | 
| executor-cores | 每個執行器使用的核心數量。 | 4 | 
| executor-memory | 執行器使用的記憶體數量。 | 14G | 
| files | 以逗號分隔的檔案清單，放置在每個執行器的工作目錄中。您可以使用 存取執行器中這些檔案的檔案路徑SparkFiles.get(fileName)。 | NULL | 
| jars | 要包含在驅動程式和執行器 classpaths 上的逗號分隔 jar 清單。 | NULL | 
| num-executors | 要啟動的執行器數目。 | 3 | 
| py-files | 要放置在PYTHONPATH適用於 Python 應用程式的 上的 .zip、 .egg或 .py 檔案的逗號分隔清單。 | NULL | 
| verbose | 開啟其他偵錯輸出的選項。 | NULL | 

## 資源組態最佳實務
<a name="spark-configuring-driver-executor-resources"></a>

### 透過 StartJobRun API 設定驅動程式和執行器資源
<a name="spark-configuring-driver-executor-resources"></a>

**注意**  
如果指定 Spark 驅動程式和執行器核心和記憶體屬性，則必須在 StartJobRun API 請求中直接指定。

以此方式設定您的資源，可確保 EMR Serverless 可以在執行任務之前配置正確的資源。這與使用者指令碼中提供的設定相反，例如 .py 或 .jar 檔案中的評估太晚，因為驅動程式和執行器工作者有時會在指令碼執行開始之前預先佈建。有兩種支援的方法來在任務提交期間設定這些資源：

#### 選項 1：使用 sparkSubmitParameters
<a name="-spark-option-sparksubmitparameters"></a>

```
"jobDriver": {
 "sparkSubmit": {
    "entryPoint": "s3://your-script-path.py",
    "sparkSubmitParameters": "—conf spark.driver.memory=4g \
    —conf spark.driver.cores=2 \
    —conf spark.executor.memory=8g \
    —conf spark.executor.cores=4"
  }
 }
```

#### 選項 2：使用 configurationOverrides 進行 spark-defaults 分類
<a name="spark-option2configurationoverrides"></a>

```
"configurationOverrides": {
 "applicationConfiguration": [
 {
 "classification": "spark-defaults",
 "properties": {
     "spark.driver.memory": "4g",
     "spark.driver.cores": "2",
     "spark.executor.memory": "8g",
     "spark.executor.cores": "4"
      }
    }
  ]
 }
```

## Spark 範例
<a name="spark-examples"></a>

下列範例示範如何使用 `StartJobRun` API 來執行 Python 指令碼。如需使用此範例的end-to-end教學課程，請參閱 [Amazon EMR Serverless 入門](getting-started.md)。您可以在 [EMR Serverless Samples](https://github.com/aws-samples/emr-serverless-samples/tree/main/examples/pyspark) GitHub 儲存庫中找到有關如何執行 PySpark 任務和新增 Python 相依性的其他範例。

```
aws emr-serverless start-job-run \
    --application-id application-id \
    --execution-role-arn job-role-arn \
    --job-driver '{
        "sparkSubmit": {
            "entryPoint": "s3://us-east-1.elasticmapreduce/emr-containers/samples/wordcount/scripts/wordcount.py",
            "entryPointArguments": ["s3://amzn-s3-demo-destination-bucket/wordcount_output"],
            "sparkSubmitParameters": "--conf spark.executor.cores=1 --conf spark.executor.memory=4g --conf spark.driver.cores=1 --conf spark.driver.memory=4g --conf spark.executor.instances=1"
        }
    }'
```

下列範例示範如何使用 `StartJobRun` API 來執行 Spark JAR。

```
aws emr-serverless start-job-run \
    --application-id application-id \
    --execution-role-arn job-role-arn \
    --job-driver '{
        "sparkSubmit": {
            "entryPoint": "/usr/lib/spark/examples/jars/spark-examples.jar",
            "entryPointArguments": ["1"],
            "sparkSubmitParameters": "--class org.apache.spark.examples.SparkPi --conf spark.executor.cores=4 --conf spark.executor.memory=20g --conf spark.driver.cores=4 --conf spark.driver.memory=8g --conf spark.executor.instances=1"
        }
    }'
```

# 執行 EMR Serverless 任務時使用 Hive 組態
<a name="jobs-hive"></a>

您可以在 `type` 參數設定為 的應用程式上執行 Hive 任務`HIVE`。任務必須與與 Amazon EMR 發行版本相容的 Hive 版本相容。例如，當您在具有 Amazon EMR 6.6.0 版的應用程式上執行任務時，您的任務必須與 Apache Hive 3.1.2 相容。如需每個版本的應用程式版本資訊，請參閱 [Amazon EMR Serverless 發行版本](release-versions.md)。

## Hive 任務參數
<a name="hive-params"></a>

當您使用 [`StartJobRun` API](https://docs.aws.amazon.com/emr-serverless/latest/APIReference/API_StartJobRun.html) 執行 Hive 任務時，請指定下列參數。

**Topics**
+ [Hive 任務執行時間角色](#hive-defaults-executionRoleArn)
+ [Hive 任務驅動程式參數](#hive-defaults-jobDriver)
+ [Hive 組態覆寫參數](#hive-defaults-configurationOverrides)

### Hive 任務執行時間角色
<a name="hive-defaults-executionRoleArn"></a>

使用 **`executionRoleArn`**為應用程式用來執行 Hive 任務的 IAM 角色指定 ARN。此角色必須包含下列許可：
+ 從資料所在的 S3 儲存貯體或其他資料來源讀取
+ 從 Hive 查詢檔案和 init 查詢檔案所在的 S3 儲存貯體或字首讀取
+ 讀取和寫入 Hive Scratch 目錄和 Hive Metastore 倉儲目錄所在的 S3 儲存貯體
+ 寫入您要寫入最終輸出的 S3 儲存貯體
+ 將日誌寫入`S3MonitoringConfiguration`指定 的 S3 儲存貯體或字首
+ 如果您使用 KMS 金鑰來加密 S3 儲存貯體中的資料，則存取 KMS 金鑰
+ 存取 AWS Glue Data Catalog

如果您的 Hive 任務讀取資料或從其他資料來源寫入資料，請在此 IAM 角色中指定適當的許可。如果您未將這些許可提供給 IAM 角色，您的任務可能會失敗。如需詳細資訊，請參閱 [Amazon EMR Serverless 的任務執行期角色](security-iam-runtime-role.md)。

### Hive 任務驅動程式參數
<a name="hive-defaults-jobDriver"></a>

使用 **`jobDriver`**為任務提供輸入。任務驅動程式參數只接受您要執行之任務類型的一個值。當您將 指定`hive`為任務類型時，EMR Serverless 會將 Hive 查詢傳遞給 `jobDriver` 參數。Hive 任務具有下列參數：
+ **`query`** – 這是 Amazon S3 中您要執行之 Hive 查詢檔案的參考。
+ **`parameters`** – 這些是您要覆寫的其他 Hive 組態屬性。若要覆寫屬性，請將它們以 的形式傳遞至此參數`--hiveconf property=value`。若要覆寫變數，請將它們以 的形式傳遞至此參數`--hivevar key=value`。
+ **`initQueryFile`** – 這是 init Hive 查詢檔案。Hive 會在查詢之前執行此檔案，並使用它來初始化資料表。

### Hive 組態覆寫參數
<a name="hive-defaults-configurationOverrides"></a>

使用 **`configurationOverrides`**覆寫監控層級和應用程式層級組態屬性。此參數接受具有下列兩個欄位的 JSON 物件：
+ **`monitoringConfiguration`** – 使用此欄位指定您希望 EMR Serverless 任務存放 Hive 任務日誌的 Amazon S3 URL (`s3MonitoringConfiguration`)。請確定您建立此儲存貯體的方式 AWS 帳戶 與託管您應用程式的儲存貯體相同，且與您執行任務 AWS 區域 的儲存貯體相同。
+ **`applicationConfiguration`** – 您可以在此欄位中提供組態物件，以覆寫應用程式的預設組態。可以使用速記語法，以提供組態或參考 JSON 檔案中物件的組態。組態物件是由分類、屬性和選用的巢狀組態所組成。屬性由您想要在檔案中覆寫的設定組成。您可以在單一 JSON 物件中，為多個應用程式指定多個分類。
**注意**  
可用的組態分類會因特定 EMR Serverless 版本而有所不同。例如，自訂 Log4j `spark-driver-log4j2`和 的分類`spark-executor-log4j2`僅適用於 6.8.0 版和更新版本。

如果您在應用程式覆寫和 Hive 參數中傳遞相同的組態，Hive 參數會優先。下列清單會將組態從最高優先順序排名為最低優先順序。
+ 您使用 作為 Hive 參數一部分提供的組態`--hiveconf property=value`。
+ 當您啟動任務時，您作為應用程式一部分提供的組態會覆寫 。
+ 您在建立應用程式`runtimeConfiguration`時作為 的一部分提供的組態。
+ Amazon EMR 為發行版本指派的最佳化組態。
+ 應用程式的預設開放原始碼組態。

如需在應用程式層級宣告組態，以及在任務執行期間覆寫組態的詳細資訊，請參閱 [EMR Serverless 的預設應用程式組態](default-configs.md)。

## Hive 任務屬性
<a name="hive-defaults"></a>

下表列出當您提交 Hive 任務時所設定的強制性屬性。


**強制性 Hive 任務屬性**  

| 設定 | Description | 
| --- | --- | 
| hive.exec.scratchdir | EMR Serverless 在 Hive 任務執行期間建立暫存檔案的 Amazon S3 位置。 | 
| hive.metastore.warehouse.dir | Hive 中受管資料表資料庫的 Amazon S3 位置。 | 

下表列出您可以在提交 Hive 任務時覆寫的選用 Hive 屬性及其預設值。


**選用 Hive 屬性和預設值**  

| 設定 | Description | 預設值 | 
| --- | --- | --- | 
| fs.s3.customAWSCredentialsProvider | 您要使用的 AWS 登入資料提供者。 | com.amazonaws.auth.DefaultAWSCredentialsProviderChain | 
| fs.s3a.aws.credentials.provider | 您要搭配 S3A 檔案系統使用的 AWS 登入資料提供者。 | com.amazonaws.auth.DefaultAWSCredentialsProviderChain | 
| hive.auto.convert.join | 根據輸入檔案大小，開啟常見聯結自動轉換至 mapjoins 的選項。 | TRUE | 
| hive.auto.convert.join.noconditionaltask | 當 Hive 根據輸入檔案大小將常見聯結轉換為映射聯結時開啟最佳化的選項。 | TRUE | 
| hive.auto.convert.join.noconditionaltask.size | 聯結會直接轉換為低於此大小的映射聯結。 | 最佳值是根據 Tez 任務記憶體計算 | 
| hive.cbo.enable | 使用 Calcite 架構開啟成本型最佳化的選項。 | TRUE | 
| hive.cli.tez.session.async | 在 Hive 查詢編譯時啟動背景 Tez 工作階段的選項。設定為 時false，Tez AM 會在 Hive 查詢編譯之後啟動。 | TRUE | 
| hive.compute.query.using.stats | 啟用 Hive 以使用中繼存放區中存放的統計資料回答特定查詢的選項。對於基本統計資料，將 hive.stats.autogather設定為 TRUE。如需更進階的查詢集合，請執行 analyze table queries。 | TRUE | 
| hive.default.fileformat | CREATE TABLE 陳述式的預設檔案格式。如果您在CREATE TABLE命令STORED AS [FORMAT]中指定 ，您可以明確覆寫此項目。 | TEXTFILE | 
| hive.driver.cores | 用於 Hive 驅動程式程序的核心數量。 | 2 | 
| hive.driver.disk | Hive 驅動程式的磁碟大小。 | 20G | 
| hive.driver.disk.type | Hive 驅動程式的磁碟類型。 | 標準 | 
| hive.tez.disk.type | Tez 工作者的磁碟大小。 | 標準 | 
| hive.driver.memory | 每個 Hive 驅動程式程序要使用的記憶體量。Hive CLI 和 Tez Application Master 與 20% 的前端空間平均共用此記憶體。 | 6G | 
| hive.emr-serverless.launch.env.[KEY] | 在所有 Hive 特定程序中設定KEY環境變數的選項，例如 Hive 驅動程式、Tez AM 和 Tez 任務。 |  | 
| hive.exec.dynamic.partition | 在 DML/DDL 中開啟動態分割區的選項。 | TRUE | 
| hive.exec.dynamic.partition.mode | 指定您要使用嚴格模式或非嚴格模式的選項。在嚴格模式下，請指定至少一個靜態分割區，以防您不小心覆寫所有分割區。在非嚴格模式中，所有分割區都可以是動態的。 | strict | 
| hive.exec.max.dynamic.partitions | Hive 建立的動態分割區總數上限。 | 1000 | 
| hive.exec.max.dynamic.partitions.pernode | Hive 在每個映射器和縮減器節點中建立的動態分割區數目上限。 | 100 | 
| hive.exec.orc.split.strategy | 預期下列其中一個值：BI、 ETL或 HYBRID。這不是使用者層級組態。 BI 指定您想要花較少的時間在分割產生中，而不是查詢執行。 ETL 指定您想要花更多時間在分割產生中。 指定根據啟發式HYBRID選擇上述策略。 | HYBRID | 
| hive.exec.reducers.bytes.per.reducer | 每個縮減器的大小。預設值為 256 MB。如果輸入大小為 1G，任務會使用 4 個縮減器。 | 256000000 | 
| hive.exec.reducers.max | 減少程式的數量上限。 | 256 | 
| hive.exec.stagingdir | 存放 Hive 在資料表位置和 hive.exec.scratchdir 屬性中指定之暫存目錄位置內建立之暫存檔案的目錄名稱。 | .hive-staging | 
| hive.fetch.task.conversion | 預期下列其中一個值：NONE、 MINIMAL或 MORE。Hive 可以將選取的查詢轉換為單一FETCH任務。這可將延遲降至最低。 | MORE | 
| hive.groupby.position.alias | 讓 Hive 在GROUP BY陳述式中使用資料欄位置別名的選項。 | FALSE | 
| hive.input.format | 預設輸入格式。HiveInputFormat 如果您遇到 問題，請將 設定為 CombineHiveInputFormat。 | org.apache.hadoop.hive.ql.io.CombineHiveInputFormat | 
| hive.log.explain.output | 開啟 Hive 日誌中任何查詢延伸輸出說明的選項。 | FALSE | 
| hive.log.level | Hive 記錄層級。 | INFO | 
| hive.mapred.reduce.tasks.speculative.execution | 開啟縮減器推測啟動的選項。僅支援 Amazon EMR 6.10.x 及更低版本。 | TRUE | 
| hive.max-task-containers | 並行容器的數量上限。設定的映射器記憶體會乘以此值，以判斷可分割運算和任務先佔用量的可用記憶體。 | 1000 | 
| hive.merge.mapfiles | 在僅映射任務結束時，導致小型檔案合併的選項。 | TRUE | 
| hive.merge.size.per.task | 任務結束時合併檔案的大小。 | 256000000 | 
| hive.merge.tezfiles | 在 Tez DAG 結束時開啟小型檔案合併的選項。 | FALSE | 
| hive.metastore.client.factory.class | 產生實作IMetaStoreClient界面之物件的原廠類別名稱。 | com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory | 
| hive.metastore.glue.catalogid | 如果 AWS Glue Data Catalog 充當中繼存放區，但在與任務不同的 AWS 帳戶 中執行，則為任務執行 AWS 帳戶 所在 的 ID。 | NULL | 
| hive.metastore.uris | 中繼存放區用戶端用來連線至遠端中繼存放區的偏離 URI。 | NULL | 
| hive.optimize.ppd | 開啟述詞下推的選項。 | TRUE | 
| hive.optimize.ppd.storage | 開啟述詞下推至儲存處理常式的選項。 | TRUE | 
| hive.orderby.position.alias | 讓 Hive 在ORDER BY陳述式中使用資料欄位置別名的選項。 | TRUE | 
| hive.prewarm.enabled | 開啟 Tez 容器預熱的選項。 | FALSE | 
| hive.prewarm.numcontainers | 要為 Tez 預熱的容器數量。 | 10 | 
| hive.stats.autogather | 讓 Hive 在INSERT OVERWRITE命令期間自動收集基本統計資料的選項。 | TRUE | 
| hive.stats.fetch.column.stats | 關閉從中繼存放區擷取資料欄統計資料的選項。當資料欄數量很高時，擷取資料欄統計資料可能會很昂貴。 | FALSE | 
| hive.stats.gather.num.threads | partialscan 和 noscan分析命令用於分割資料表的執行緒數量。這僅適用於實作 的檔案格式 StatsProvidingRecordReader（例如 ORC)。 | 10 | 
| hive.strict.checks.cartesian.product | 開啟嚴格笛卡兒聯結檢查的選項。這些檢查不允許笛卡兒產品 （交叉聯結）。 | FALSE | 
| hive.strict.checks.type.safety | 開啟嚴格類型安全檢查並關閉 bigint 與 string和 比較的選項double。 | TRUE | 
| hive.support.quoted.identifiers | 預期值為 NONE或 COLUMN。 NONE 表示識別符中只有英數字元和底線字元有效。 COLUMN 表示資料欄名稱可包含任何字元。 | COLUMN | 
| hive.tez.auto.reducer.parallelism | 開啟 Tez 自動減少程式平行處理功能的選項。Hive 仍會估計資料大小並設定平行處理估計值。Tez 會取樣來源頂點的輸出大小，並視需要在執行時間調整預估值。 | TRUE | 
| hive.tez.container.size | 每個 Tez 任務程序要使用的記憶體量。 | 6144 | 
| hive.tez.cpu.vcores | 要用於每個 Tez 任務的核心數量。 | 2 | 
| hive.tez.disk.size | 每個任務容器的磁碟大小。 | 20G | 
| hive.tez.input.format | Tez AM 中分割產生的輸入格式。 | org.apache.hadoop.hive.ql.io.HiveInputFormat | 
| hive.tez.min.partition.factor | 當您開啟自動減少程式平行處理時，Tez 指定的減少程式下限。 | 0.25 | 
| hive.vectorized.execution.enabled | 開啟查詢執行的向量化模式的選項。 | TRUE | 
| hive.vectorized.execution.reduce.enabled | 開啟查詢執行縮減端之向量化模式的選項。 | TRUE | 
| javax.jdo.option.ConnectionDriverName | JDBC 中繼存放區的驅動程式類別名稱。 | org.apache.derby.jdbc.EmbeddedDriver | 
| javax.jdo.option.ConnectionPassword | 與中繼存放區資料庫相關聯的密碼。 | NULL | 
| javax.jdo.option.ConnectionURL | JDBC 中繼存放區的 JDBC 連線字串。 | jdbc:derby:;databaseName=metastore\$1db;create=true | 
| javax.jdo.option.ConnectionUserName | 與中繼存放區資料庫相關聯的使用者名稱。 | NULL | 
| mapreduce.input.fileinputformat.split.maxsize | 當您的輸入格式為 時，分割運算期間的分割大小上限org.apache.hadoop.hive.ql.io.CombineHiveInputFormat。值 0 表示沒有限制。 | 0 | 
| tez.am.dag.cleanup.on.completion | 當 DAG 完成時開啟隨機資料清除的選項。 | TRUE | 
| tez.am.emr-serverless.launch.env.[KEY] | 在 Tez AM 程序中設定KEY環境變數的選項。對於 Tez AM，此值會覆寫該hive.emr-serverless.launch.env.[KEY]值。 |  | 
| tez.am.log.level | EMR Serverless 傳遞至 Tez 應用程式主要的根記錄層級。 | INFO | 
| tez.am.sleep.time.before.exit.millis | EMR Serverless 應該在 AM 關閉請求後的這段時間之後推送 ATS 事件。 | 0 | 
| tez.am.speculation.enabled | 導致推測啟動較慢任務的選項。這有助於在部分任務因錯誤或慢速機器而執行速度較慢時減少任務延遲。僅支援 Amazon EMR 6.10.x 及更低版本。 | FALSE | 
| tez.am.task.max.failed.attempts | 在任務失敗之前，特定任務可能失敗的嘗試次數上限。此數字不會計入手動終止的嘗試次數。 | 3 | 
| tez.am.vertex.cleanup.height | 如果所有相依頂點都完成，Tez AM 會刪除頂點隨機播放資料的距離。當值為 0 時，此功能會關閉。Amazon EMR 6.8.0 版及更新版本支援此功能。 | 0 | 
| tez.client.asynchronous-stop | 讓 EMR Serverless 在 Hive 驅動程式結束之前推送 ATS 事件的選項。 | FALSE | 
| tez.grouping.max-size | 分組分割的大小上限 （以位元組為單位）。此限制可防止過大的分割。 | 1073741824 | 
| tez.grouping.min-size | 分組分割的大小下限 （以位元組為單位）。此限制可防止太多小分割。 | 16777216 | 
| tez.runtime.io.sort.mb | 當 Tez 排序輸出時，軟緩衝區的大小會排序。 | 最佳值是根據 Tez 任務記憶體計算 | 
| tez.runtime.unordered.output.buffer.size-mb | 如果 Tez 未直接寫入磁碟，要使用的緩衝區大小。 | 最佳值是根據 Tez 任務記憶體計算 | 
| tez.shuffle-vertex-manager.max-src-fraction | 在 EMR Serverless 排程目前頂點的所有任務之前 （在ScatterGather連線的情況下），必須完成的來源任務部分。在目前頂點上準備好排程的任務數量，會在 min-fraction和 之間線性擴展max-fraction。預設值為 或 tez.shuffle-vertex-manager.min-src-fraction，以較大者為準。 | 0.75 | 
| tez.shuffle-vertex-manager.min-src-fraction | 在 EMR Serverless 排程目前頂點的任務之前 （在ScatterGather連線的情況下），必須完成的來源任務部分。 | 0.25 | 
| tez.task.emr-serverless.launch.env.[KEY] | 在 Tez 任務程序中設定KEY環境變數的選項。對於 Tez 任務，此值會覆寫該hive.emr-serverless.launch.env.[KEY]值。 |  | 
| tez.task.log.level | EMR Serverless 傳遞給 Tez 任務的根記錄層級。 | INFO | 
| tez.yarn.ats.event.flush.timeout.millis | AM 在關閉之前應等待事件排清的時間上限。 | 300000 | 

## Hive 任務範例
<a name="hive-examples"></a>

下列程式碼範例示範如何使用 `StartJobRun` API 執行 Hive 查詢。

```
aws emr-serverless start-job-run \
    --application-id application-id \
    --execution-role-arn job-role-arn \
    --job-driver '{
        "hive": {
            "query": "s3://amzn-s3-demo-bucket/emr-serverless-hive/query/hive-query.ql",
            "parameters": "--hiveconf hive.log.explain.output=false"
        }
    }' \
    --configuration-overrides '{
        "applicationConfiguration": [{
            "classification": "hive-site",
            "properties": {
                "hive.exec.scratchdir": "s3://amzn-s3-demo-bucket/emr-serverless-hive/hive/scratch",
                "hive.metastore.warehouse.dir": "s3://amzn-s3-demo-bucket/emr-serverless-hive/hive/warehouse",
                "hive.driver.cores": "2",
                "hive.driver.memory": "4g",
                "hive.tez.container.size": "4096",
                "hive.tez.cpu.vcores": "1"
            }
        }]
    }'
```

您可以在 [EMR Serverless Samples](https://github.com/aws-samples/emr-serverless-samples/tree/main/examples/hive) GitHub 儲存庫中找到有關如何執行 Hive 任務的其他範例。

# EMR Serverless 任務彈性
<a name="jobs-resiliency"></a>

 EMR Serverless 7.1.0 版和更新版本包含對任務彈性的支援，因此它會自動重試任何失敗的任務，而無需您進行任何手動輸入。任務彈性的另一個好處是，EMR Serverless 會在 AZ 遇到任何問題時，將任務執行移至不同的可用區域 (AZ)。

若要啟用任務的任務彈性，請為您的任務設定重試政策。重試政策可確保 EMR Serverless 在任何時間點失敗時自動重新啟動任務。批次和串流任務支援重試政策，因此請根據您的使用案例自訂任務彈性。下表比較批次和串流任務的任務彈性行為和差異。


|  | 批次任務 | 串流任務 | 
| --- | --- | --- | 
| 預設行為 | 不會重新執行任務。 | 應用程式在執行任務時建立檢查點時，一律重試執行任務。 | 
| 重試點 | 批次任務沒有檢查點，因此 EMR Serverless 一律會從頭重新執行任務。 | 串流任務支援檢查點，因此請設定串流查詢，以儲存執行時間狀態和進度至 Amazon S3 中的檢查點位置。EMR Serverless 會從檢查點繼續任務執行。如需詳細資訊，請參閱 Apache Spark 文件中的[使用檢查點從失敗中復原](https://spark.apache.org/docs/latest/structured-streaming-programming-guide.html#recovering-from-failures-with-checkpointing)。 | 
| 重試嘗試次數上限 | 允許最多 10 次重試。 | 串流任務具有內建的防撞控制，因此如果任務在一小時後繼續失敗，應用程式會停止重試任務。一小時內的預設重試次數為 5 次嘗試。您可以將此重試次數設定為介於 1 或 10 之間。您無法自訂最大嘗試次數。值 1 表示沒有重試。 | 

當 EMR Serverless 嘗試重新執行任務時，也會以嘗試次數為任務編製索引，因此 會在任務嘗試期間追蹤任務的生命週期。

使用 EMR Serverless API 操作或 AWS CLI 來變更任務彈性或存取與任務彈性相關的資訊。如需詳細資訊，請參閱 [EMR Serverless API 指南](https://docs.aws.amazon.com/emr-serverless/latest/APIReference/Welcome.html)。

根據預設，EMR Serverless 不會重新執行批次任務。若要啟用批次任務的重試，請在啟動批次任務執行時設定 `maxAttempts` 參數。`maxAttempts` 參數僅適用於批次任務。預設值為 1，表示不重新執行任務。接受的值為 1 到 10，包含 。

下列範例示範如何在開始任務執行時指定最多 10 次嘗試。

```
aws emr-serverless start-job-run
 --application-id <APPLICATION_ID> \
 --execution-role-arn <JOB_EXECUTION_ROLE> \
 --mode 'BATCH' \
 --retry-policy '{
    "maxAttempts": 10
 }' \
 --job-driver '{
    "sparkSubmit": {
         "entryPoint": "/usr/lib/spark/examples/jars/spark-examples-does-not-exist.jar",
         "entryPointArguments": ["1"],
         "sparkSubmitParameters": "--class org.apache.spark.examples.SparkPi"
     }
}'
```

如果串流任務失敗，EMR Serverless 會無限期重試。若要避免因重複無法復原的失敗而發生當機，請使用 `maxFailedAttemptsPerHour`設定串流任務重試的當機預防控制。此參數可讓您指定 EMR Serverless 停止重試前一小時允許的失敗嘗試次數上限。預設值為 5。接受的值為 1 到 10，包含 。

```
aws emr-serverless start-job-run
 --application-id <APPPLICATION_ID> \
 --execution-role-arn <JOB_EXECUTION_ROLE> \
 --mode 'STREAMING' \
 --retry-policy '{
    "maxFailedAttemptsPerHour": 7
 }' \
 --job-driver '{
    "sparkSubmit": {
         "entryPoint": "/usr/lib/spark/examples/jars/spark-examples-does-not-exist.jar",
         "entryPointArguments": ["1"],
         "sparkSubmitParameters": "--class org.apache.spark.examples.SparkPi"
     }
}'
```

您也可以使用其他任務執行 API 操作來取得任務的相關資訊。例如，搭配 `GetJobRun`操作使用 `attempt` 參數，以取得特定任務嘗試的詳細資訊。如果您未包含 `attempt` 參數，操作會傳回最新嘗試的相關資訊。

```
aws emr-serverless get-job-run \
    --job-run-id job-run-id \
    --application-id application-id \
    --attempt 1
```

`ListJobRunAttempts` 操作會傳回與任務執行相關的所有嘗試的相關資訊。

```
aws emr-serverless list-job-run-attempts \
  --application-id application-id \
  --job-run-id job-run-id
```

`GetDashboardForJobRun` 操作會建立並傳回 URL，用來存取任務執行的應用程式 UIs。`attempt` 參數可讓您取得特定嘗試的 URL。如果您未包含 `attempt` 參數，操作會傳回最新嘗試的相關資訊。

```
aws emr-serverless get-dashboard-for-job-run \
    --application-id application-id \
    --job-run-id job-run-id \
    --attempt 1
```

## 使用重試政策監控作業
<a name="SECTION-jobs-resiliency-monitor-retry-policy"></a>

任務彈性支援也會新增事件 **EMR Serverless 任務執行重試**。EMR Serverless 會在任務的每次重試時發佈此事件。您可以使用此通知來追蹤任務的重試。如需事件的詳細資訊，請參閱 [Amazon EventBridge 事件](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-events.html)。

## 使用重試政策記錄
<a name="SECTION-jobs-resiliency-log-retry-policy"></a>

每次 EMR Serverless 重試任務時，嘗試都會產生自己的日誌集。為了確保 EMR Serverless 可以將這些日誌成功交付到 Amazon S3 和 Amazon CloudWatch，而不會覆寫任何日誌，EMR Serverless 會將字首新增至 S3 日誌路徑格式和 CloudWatch 日誌串流名稱，以包含任務的嘗試次數。

以下是 格式的範例。

```
'/applications/<applicationId>/jobs/<jobId>/attempts/<attemptNumber>/'.
```

此格式可確保 EMR Serverless 將每次嘗試任務的所有日誌發佈到 Amazon S3 和 CloudWatch 中自己的指定位置。如需詳細資訊，請參閱[儲存日誌](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/logging.html)。

**注意**  
EMR Serverless 只會將此字首格式用於所有串流任務和任何已啟用重試的批次任務。

# EMR Serverless 的中繼存放區組態
<a name="metastore-config"></a>

*Hive 中繼存放*區是集中位置，可存放資料表的結構資訊，包括結構描述、分割區名稱和資料類型。使用 EMR Serverless， 會將此資料表中繼資料保留在可存取您任務的中繼存放區中。

Hive 中繼存放區有兩個選項：
+  AWS Glue Data Catalog
+ 外部 Apache Hive 中繼存放區

## 使用 AWS Glue Data Catalog 做為中繼存放區
<a name="glue-metastore"></a>

您可以將 Spark 和 Hive 任務設定為使用 AWS Glue Data Catalog 作為其中繼存放區。當您需要持久性中繼存放區或不同應用程式、服務或共用的中繼存放區時，建議您使用此組態 AWS 帳戶。如需 Data Catalog 的詳細資訊，請參閱[填入 AWS Glue Data Catalog](https://docs.aws.amazon.com/glue/latest/dg/populate-data-catalog.html)。如需 AWS Glue 定價的相關資訊，請參閱 [AWS Glue 定價](https://aws.amazon.com/glue/pricing)。

您可以將 EMR Serverless 任務設定為在 AWS 帳戶 與應用程式相同的 或不同的 中使用 AWS Glue Data Catalog AWS 帳戶。

### 設定 AWS Glue Data Catalog
<a name="glue-metastore-configure"></a>

若要設定 Data Catalog，請選擇您要使用的 EMR Serverless 應用程式類型。

------
#### [ Spark ]

當您使用 EMR Studio 搭配 EMR Serverless Spark 應用程式執行任務時， AWS Glue Data Catalog 是預設中繼存放區。

當您使用 SDKs或 時 AWS CLI，請在任務執行的`sparkSubmit`參數`com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory`中將`spark.hadoop.hive.metastore.client.factory.class`組態設定為 。下列範例示範如何使用 設定 Data Catalog AWS CLI。

```
aws emr-serverless start-job-run \
    --application-id application-id \
    --execution-role-arn job-role-arn \
    --job-driver '{
        "sparkSubmit": {
            "entryPoint": "s3://amzn-s3-demo-bucket/code/pyspark/extreme_weather.py",
            "sparkSubmitParameters": "--conf spark.hadoop.hive.metastore.client.factory.class=com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory --conf spark.driver.cores=1 --conf spark.driver.memory=3g --conf spark.executor.cores=4 --conf spark.executor.memory=3g"
        }
    }'
```

或者，您可以在 Spark 程式碼`SparkSession`中建立新的 時設定此組態。

```
from pyspark.sql import SparkSession

spark = (
    SparkSession.builder.appName("SparkSQL")
    .config(
        "spark.hadoop.hive.metastore.client.factory.class",
        "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory",
    )
    .enableHiveSupport()
    .getOrCreate()
)

# we can query tables with SparkSQL
spark.sql("SHOW TABLES").show()

# we can also them with native Spark
print(spark.catalog.listTables())
```

------
#### [ Hive ]

對於 EMR Serverless Hive 應用程式，Data Catalog 是預設中繼存放區。也就是說，當您在 EMR Serverless Hive 應用程式上執行任務時，Hive 會在 AWS 帳戶 與您應用程式相同的 資料目錄中記錄中繼存放區資訊。您不需要虛擬私有雲端 (VPC) 即可使用 Data Catalog 做為中繼存放區。

若要存取 Hive 中繼存放區資料表，請新增設定 AWS Glue [的 IAM 許可中概述的必要 Glue AWS](https://docs.aws.amazon.com/glue/latest/dg/getting-started-access.html)政策。

------

### 設定 EMR Serverless 和 Glue Data Catalog AWS 的跨帳戶存取
<a name="glue-metastore-cross-account"></a>

若要設定 EMR Serverless 的跨帳戶存取權，請先登入以下內容 AWS 帳戶：
+ `AccountA` – 您已在 AWS 帳戶 其中建立 EMR Serverless 應用程式。
+ `AccountB` – AWS 帳戶 包含您希望 EMR Serverless 任務執行存取的 AWS Glue Data Catalog。

1. 確定 中的管理員或其他授權身分將資源政策`AccountB`連接到 中的 Data Catalog`AccountB`。此政策授予`AccountA`特定跨帳戶許可，以對`AccountB`目錄中的資源執行操作。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "glue:GetDatabase",
           "glue:CreateDatabase",
           "glue:GetDataBases",
           "glue:CreateTable",
           "glue:GetTable",
           "glue:UpdateTable",
           "glue:DeleteTable",
           "glue:GetTables",
           "glue:GetPartition",
           "glue:GetPartitions",
           "glue:CreatePartition",
           "glue:BatchCreatePartition",
           "glue:GetUserDefinedFunctions"
         ],
         "Resource": [
           "arn:aws:glue:*:123456789012:catalog"
         ],
         "Sid": "AllowGLUEGetdatabase"
       }
     ]
   }
   ```

------

1. 將 IAM 政策新增至 中的 EMR Serverless 任務執行期角色，`AccountA`讓角色可以存取 中的 Data Catalog 資源`AccountB`。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "glue:GetDatabase",
           "glue:CreateDatabase",
           "glue:GetDataBases",
           "glue:CreateTable",
           "glue:GetTable",
           "glue:UpdateTable",
           "glue:DeleteTable",
           "glue:GetTables",
           "glue:GetPartition",
           "glue:GetPartitions",
           "glue:CreatePartition",
           "glue:BatchCreatePartition",
           "glue:GetUserDefinedFunctions"
         ],
         "Resource": [
           "arn:aws:glue:*:123456789012:catalog"
         ],
         "Sid": "AllowGLUEGetdatabase"
       }
     ]
   }
   ```

------

1.  啟動您的任務執行。此步驟會因 `AccountA`的 EMR Serverless 應用程式類型而略有不同。

------
#### [ Spark ]

   在 中傳遞 `spark.hadoop.hive.metastore.glue.catalogid` 屬性`sparkSubmitParameters`，如下列範例所示。*`AccountB-catalog-id`* 將 取代為 中 Data Catalog 的 ID`AccountB`。

   ```
   aws emr-serverless start-job-run \
   --application-id "application-id" \
   --execution-role-arn "job-role-arn" \
   --job-driver '{
       "sparkSubmit": {
           "entryPoint": "s3://amzn-s3-demo-bucket/scripts/test.py",
            "sparkSubmitParameters": "--conf spark.hadoop.hive.metastore.client.factory.class=com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory --conf spark.hadoop.hive.metastore.glue.catalogid=AccountB-catalog-id --conf spark.executor.cores=1 --conf spark.executor.memory=1g --conf spark.driver.cores=1 --conf spark.driver.memory=1g --conf spark.executor.instances=1"
       }
     }' \
   --configuration-overrides '{
       "monitoringConfiguration": {
       "s3MonitoringConfiguration": {
       "logUri": "s3://amzn-s3-demo-bucket/logs/"
       }
     }
   }'
   ```

------
#### [ Hive ]

   在`hive-site`分類中設定 `hive.metastore.glue.catalogid` 屬性，如下列範例所示。*`AccountB-catalog-id`* 將 取代為 中 Data Catalog 的 ID`AccountB`。

   ```
   aws emr-serverless start-job-run \
   --application-id "application-id" \
   --execution-role-arn "job-role-arn" \
   --job-driver '{
       "hive": {
       "query": "s3://amzn-s3-demo-bucket/hive/scripts/create_table.sql",
       "parameters": "--hiveconf hive.exec.scratchdir=s3://amzn-s3-demo-bucket/hive/scratch --hiveconf hive.metastore.warehouse.dir=s3://amzn-s3-demo-bucket/hive/warehouse"
       }
   }' \
   --configuration-overrides '{
       "applicationConfiguration": [{
           "classification": "hive-site",
           "properties": {
               "hive.metastore.glue.catalogid": "AccountB-catalog-id"
           }
       }]
   }'
   ```

------

### 使用 Glue Data Catalog AWS 時的考量事項
<a name="glue-metastore-considerations"></a>

您可以在 Hive 指令碼`ADD JAR`中使用 新增輔助 JARs。如需其他考量，請參閱[使用 Glue Data Catalog AWS 時的考量](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hive-metastore-glue.html#emr-hive-glue-considerations-hive)。

# 使用外部 Hive 中繼存放區
<a name="external-metastore"></a>

您可以設定 EMR Serverless Spark 和 Hive 任務連線到外部 Hive 中繼存放區，例如 Amazon Aurora 或 Amazon RDS for MySQL。本節說明如何設定 Amazon RDS Hive 中繼存放區、設定 VPC，以及設定 EMR Serverless 任務以使用外部中繼存放區。

## 建立外部 Hive 中繼存放區
<a name="external-metastore-create"></a>

1. 遵循建立 VPC 中的指示，使用私有子網路建立 Amazon Virtual Private Cloud (Amazon VPC)。 [https://docs.aws.amazon.com/vpc/latest/userguide/working-with-vpcs.html#Create-VPC](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-vpcs.html#Create-VPC)

1. 使用新的 Amazon VPC 和私有子網路建立 EMR Serverless 應用程式。當您使用 VPC 設定 EMR Serverless 應用程式時，它會先為您指定的每個子網路佈建彈性網路介面。然後，它會將您指定的安全群組連接到該網路界面。這可讓您的應用程式存取控制。如需如何設定 VPC 的詳細資訊，請參閱 [設定 EMR Serverless 應用程式的 VPC 存取以連線至資料](vpc-access.md)。

1. 在 Amazon VPC 的私有子網路中建立 MySQL 或 Aurora PostgreSQL 資料庫。如需有關如何建立 Amazon RDS 資料庫的資訊，請參閱[建立 Amazon RDS 資料庫執行個體](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreateDBInstance.html)。

1. 依照修改 [Amazon RDS 資料庫執行個體](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Overview.DBInstance.Modifying.html)中的步驟，修改 MySQL 或 Aurora 資料庫的安全群組，以允許來自 EMR Serverless 安全群組的 JDBC 連線。從其中一個 EMR Serverless 安全群組將傳入流量規則新增至 RDS 安全群組。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/emr/latest/EMR-Serverless-UserGuide/external-metastore.html)

## 設定 Spark 選項
<a name="external-metastore-spark"></a>

**使用 JDBC**

若要設定 EMR Serverless Spark 應用程式以根據 Amazon RDS for MySQL 或 Amazon Aurora MySQL 執行個體連線至 Hive 中繼存放區，請使用 JDBC 連線。在任務執行的`spark-submit`參數`--jars`中傳遞 `mariadb-connector-java.jar` 與 。

```
aws emr-serverless start-job-run \
  --application-id "application-id" \
  --execution-role-arn "job-role-arn" \
  --job-driver '{
        "sparkSubmit": {
            "entryPoint": "s3://amzn-s3-demo-bucket/scripts/spark-jdbc.py",
            "sparkSubmitParameters": "--jars s3://amzn-s3-demo-bucket/mariadb-connector-java.jar 
            --conf spark.hadoop.javax.jdo.option.ConnectionDriverName=org.mariadb.jdbc.Driver 
            --conf spark.hadoop.javax.jdo.option.ConnectionUserName=<connection-user-name> 
            --conf spark.hadoop.javax.jdo.option.ConnectionPassword=<connection-password>
            --conf spark.hadoop.javax.jdo.option.ConnectionURL=<JDBC-Connection-string> 
            --conf spark.driver.cores=2
            --conf spark.executor.memory=10G 
            --conf spark.driver.memory=6G 
            --conf spark.executor.cores=4"
        }
    }' \
    --configuration-overrides '{
        "monitoringConfiguration": {
        "s3MonitoringConfiguration": {
            "logUri": "s3://amzn-s3-demo-bucket/spark/logs/"
        }
    }
}'
```

下列程式碼範例是與 Amazon RDS 上的 Hive 中繼存放區互動的 Spark 進入點指令碼。

```
from os.path import expanduser, join, abspath
from pyspark.sql import SparkSession
from pyspark.sql import Row
# warehouse_location points to the default location for managed databases and tables
warehouse_location = abspath('spark-warehouse')
spark = SparkSession \
    .builder \
    .config("spark.sql.warehouse.dir", warehouse_location) \
    .enableHiveSupport() \
    .getOrCreate()
spark.sql("SHOW DATABASES").show()
spark.sql("CREATE EXTERNAL TABLE `sampledb`.`sparknyctaxi`(`dispatching_base_num` string, `pickup_datetime` string, `dropoff_datetime` string, `pulocationid` bigint, `dolocationid` bigint, `sr_flag` bigint) STORED AS PARQUET LOCATION 's3://<s3 prefix>/nyctaxi_parquet/'")
spark.sql("SELECT count(*) FROM sampledb.sparknyctaxi").show()
spark.stop()
```

**使用 thrift 服務**

您可以設定 EMR Serverless Hive 應用程式，以根據 Amazon RDS for MySQL 或 Amazon Aurora MySQL 執行個體連線至 Hive 中繼存放區。若要這樣做，請在現有 Amazon EMR 叢集的主節點上執行 thrift 伺服器。如果您已經擁有 Amazon EMR 叢集，且具有要用來簡化 EMR Serverless 任務組態的 thrift 伺服器，則此選項是理想的選擇。

```
aws emr-serverless start-job-run \
  --application-id "application-id" \
  --execution-role-arn "job-role-arn" \
  --job-driver '{
        "sparkSubmit": {
            "entryPoint": "s3://amzn-s3-demo-bucket/thriftscript.py",
            "sparkSubmitParameters": "--jars s3://amzn-s3-demo-bucket/mariadb-connector-java.jar 
            --conf spark.driver.cores=2
            --conf spark.executor.memory=10G 
            --conf spark.driver.memory=6G 
            --conf spark.executor.cores=4"
        }
    }' \
    --configuration-overrides '{
        "monitoringConfiguration": {
        "s3MonitoringConfiguration": {
            "logUri": "s3://amzn-s3-demo-bucket/spark/logs/"
        }
    }
}'
```

下列程式碼範例是進入點指令碼 (`thriftscript.py`)，使用 thrift 通訊協定連線到 Hive 中繼存放區。請注意， `hive.metastore.uris` 屬性需要設定為從外部 Hive 中繼存放區讀取。

```
from os.path import expanduser, join, abspath
from pyspark.sql import SparkSession
from pyspark.sql import Row
# warehouse_location points to the default location for managed databases and tables
warehouse_location = abspath('spark-warehouse')
spark = SparkSession \
    .builder \
    .config("spark.sql.warehouse.dir", warehouse_location) \
    .config("hive.metastore.uris","thrift://thrift-server-host:thift-server-port") \
    .enableHiveSupport() \
    .getOrCreate()
spark.sql("SHOW DATABASES").show()
spark.sql("CREATE EXTERNAL TABLE sampledb.`sparknyctaxi`( `dispatching_base_num` string, `pickup_datetime` string, `dropoff_datetime` string, `pulocationid` bigint, `dolocationid` bigint, `sr_flag` bigint) STORED AS PARQUET LOCATION 's3://<s3 prefix>/nyctaxi_parquet/'")
spark.sql("SELECT * FROM sampledb.sparknyctaxi").show()
spark.stop()
```

## 設定 Hive 選項
<a name="external-metastore-hive"></a>

**使用 JDBC**

如果您想要在 Amazon RDS MySQL 或 Amazon Aurora 執行個體上指定外部 Hive 資料庫位置，您可以覆寫預設中繼存放區組態。

**注意**  
在 Hive 中，您可以同時對中繼存放區資料表執行多次寫入。如果您在兩個任務之間共用中繼存放區資訊，請確定您不會同時寫入相同的中繼存放區資料表，除非您寫入相同中繼存放區資料表的不同分割區。

在 `hive-site`分類中設定下列組態，以啟用外部 Hive 中繼存放區。

```
{
    "classification": "hive-site",
    "properties": {
        "hive.metastore.client.factory.class": "org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClientFactory",
        "javax.jdo.option.ConnectionDriverName": "org.mariadb.jdbc.Driver",
        "javax.jdo.option.ConnectionURL": "jdbc:mysql://db-host:db-port/db-name",
        "javax.jdo.option.ConnectionUserName": "username",
        "javax.jdo.option.ConnectionPassword": "password"
    }
}
```

**使用 thrift 伺服器**

您可以設定 EMR Serverless Hive 應用程式，以根據 Amazon RDS for MySQL 或 Amazon Aurora MySQLinstance 連線至 Hive 中繼存放區。若要這樣做，請在現有 Amazon EMR 叢集的主節點上執行 thrift 伺服器。如果您已經有執行 thrift 伺服器的 Amazon EMR 叢集，並且想要使用 EMR Serverless 任務組態，則此選項是理想的選擇。

在 `hive-site`分類中設定下列組態，讓 EMR Serverless 可以存取遠端漂移中繼存放區。請注意，您必須將 `hive.metastore.uris` 屬性設定為從外部 Hive 中繼存放區讀取。

```
{
    "classification": "hive-site",
    "properties": {
        "hive.metastore.client.factory.class": "org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClientFactory",
        "hive.metastore.uris": "thrift://thrift-server-host:thirft-server-port"
    }
}
```

# 在 EMR Serverless 上使用 AWS Glue 多目錄階層
<a name="external-metastore-glue-multi"></a>

您可以設定 EMR Serverless 應用程式以使用 AWS Glue 多目錄階層。下列範例示範如何搭配 AWS Glue 多目錄階層使用 EMR-S Spark。

若要進一步了解多目錄階層，請參閱[使用 Glue Data Catalog with Spark on AWS Amazon EMR 中的多目錄階層](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-multi-catalog.html)。

## 搭配 Iceberg 和 Glue Data Catalog 使用 Redshift 受管儲存 AWS (RMS)
<a name="emr-serverless-lf-enable-spark-session-glue"></a>

以下示範如何設定 Spark 以與 Iceberg AWS 的 Glue Data Catalog 整合：

```
aws emr-serverless start-job-run \
    --application-id application-id \
    --execution-role-arn job-role-arn \
    --job-driver '{
        "sparkSubmit": {
            "entryPoint": "s3://amzn-s3-demo-bucket/myscript.py",
            "sparkSubmitParameters": "--conf spark.sql.catalog.nfgac_rms = org.apache.iceberg.spark.SparkCatalog
             --conf spark.sql.catalog.rms.type=glue 
             --conf spark.sql.catalog.rms.glue.id=Glue RMS catalog ID 
             --conf spark.sql.defaultCatalog=rms
             --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions"
        }
    }'
```

整合後，來自 目錄中資料表的範例查詢：

```
SELECT * FROM my_rms_schema.my_table
```

## 搭配 Iceberg REST API 和 Glue Data Catalog AWS 使用 Redshift 受管儲存 (RMS)
<a name="emr-serverless-lf-enable-spark-session-rest"></a>

以下示範如何設定 Spark 以使用 Iceberg REST 目錄：

```
aws emr-serverless start-job-run \
--application-id application-id \
--execution-role-arn job-role-arn \
--job-driver '{
"sparkSubmit": {
"entryPoint": "s3://amzn-s3-demo-bucket/myscript.py",
    "sparkSubmitParameters": "
    --conf spark.sql.catalog.rms=org.apache.iceberg.spark.SparkCatalog
    --conf spark.sql.catalog.rms.type=rest
    --conf spark.sql.catalog.rms.warehouse=Glue RMS catalog ID
    --conf spark.sql.catalog.rms.uri=Glue endpoint URI/iceberg
    --conf spark.sql.catalog.rms.rest.sigv4-enabled=true
    --conf spark.sql.catalog.rms.rest.signing-name=glue
    --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions"
    }
  }'
```

目錄中資料表的範例查詢：

```
SELECT * FROM my_rms_schema.my_table
```

# 使用外部中繼存放區時的考量事項
<a name="external-metastore-considerations"></a>
+ 您可以設定與 MariaDB JDBC 相容的資料庫做為中繼存放區。這些資料庫的範例包括 RDS for MariaDB、MySQL 和 Amazon Aurora。
+ 中繼存放區不會自動初始化。如果您的中繼存放區未使用 Hive 版本的結構描述初始化，請使用 [Hive 結構描述工具](https://cwiki.apache.org/confluence/display/Hive/Hive+Schema+Tool)。
+ EMR Serverless 不支援 Kerberos 身分驗證。您無法將 thrift 中繼存放區伺服器與 Kerberos 身分驗證搭配 EMR Serverless Spark 或 Hive 任務使用。
+ 您必須設定 VPC 存取以使用多目錄階層。

# 從 EMR Serverless 存取另一個 AWS 帳戶中的 S3 資料
<a name="jobs-s3-access"></a>

您可以從一個 AWS 帳戶執行 Amazon EMR Serverless 任務，並將其設定為存取屬於另一個 AWS 帳戶的 Amazon S3 儲存貯體中的資料。此頁面說明如何從 EMR Serverless 設定 S3 的跨帳戶存取。

在 EMR Serverless 上執行的任務可以使用 S3 儲存貯體政策或擔任的角色，從不同的 AWS 帳戶存取 Amazon S3 中的資料。

## 先決條件
<a name="jobs-s3-access-prerequisites"></a>

若要設定 Amazon EMR Serverless 的跨帳戶存取權，請在登入兩個 AWS 帳戶時完成任務：
+ **`AccountA`** – 這是 AWS 您已建立 Amazon EMR Serverless 應用程式的帳戶。在您設定跨帳戶存取之前，請在此帳戶中備妥下列項目：
  + 您要執行任務的 Amazon EMR Serverless 應用程式。
  + 任務執行角色，具有在應用程式中執行任務所需的許可。如需詳細資訊，請參閱 [Amazon EMR Serverless 的任務執行期角色](security-iam-runtime-role.md)。
+ **`AccountB`** – 這是 AWS 包含您希望 Amazon EMR Serverless 任務存取之 S3 儲存貯體的帳戶。

## 使用 S3 儲存貯體政策來存取跨帳戶 S3 資料
<a name="jobs-s3-access-how-to-s3-bucket-policy"></a>

若要account B從 存取 中的 S3 儲存貯體account A，請將下列政策連接至 中的 S3 儲存貯體account B。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "ExamplePermissions1",
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::my-bucket-name"
      ]
    },
    {
      "Sid": "ExamplePermissions2",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObject"
      ],
      "Resource": [
        "arn:aws:s3:::my-bucket-name/*"
      ]
    }
  ]
}
```

------

如需使用 S3 儲存貯體政策進行 S3 跨帳戶存取的詳細資訊，請參閱《*Amazon Simple Storage Service 使用者指南*》中的[範例 2：授予跨帳戶儲存貯體許可的儲存貯體擁有者](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-walkthroughs-managing-access-example2.html)。

## 使用擔任的角色來存取跨帳戶 S3 資料
<a name="jobs-s3-access-how-to-assumed-role"></a>

設定 Amazon EMR Serverless 跨帳戶存取權的另一種方法是使用 AWS Security Token Service (AWS STS) 中的 `AssumeRole`動作。 AWS STS 是一種全域 Web 服務，可讓您為使用者請求暫時、有限權限的登入資料。您可以使用使用 建立的臨時安全登入資料，對 EMR Serverless 和 Amazon S3 進行 API 呼叫`AssumeRole`。

下列步驟說明如何使用擔任的角色從 EMR Serverless 存取跨帳戶 S3 資料：

1. 在 中建立 Amazon S3 儲存貯體、*cross-account-bucket*體`AccountB`。如需詳細資訊，請參閱《*Amazon Simple Storage Service 使用者指南*》中的[建立儲存貯](https://docs.aws.amazon.com/AmazonS3/latest/gsg/CreatingABucket.html)體。如果您想要跨帳戶存取 DynamoDB，也請在 中建立 DynamoDB 資料表`AccountB`。如需詳細資訊，請參閱《Amazon [ DynamoDB 開發人員指南》中的建立 DynamoDB 資料表](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-1.html)。 * DynamoDB *

1. 在 `Cross-Account-Role-B` 中建立可存取*cross-account-bucket*體的 `AccountB` IAM 角色。

   1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

   1. 選擇**角色**，並建立一個新角色 `Cross-Account-Role-B`。如需如何建立 IAM 角色的詳細資訊，請參閱《[IAM 使用者指南》中的建立 IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create.html)。

   1. 建立 IAM 政策，指定 `Cross-Account-Role-B`存取*cross-account-bucket* S3 儲存貯體的許可，如下列政策陳述式所示。然後，將 IAM 政策附接至 `Cross-Account-Role-B`。如需詳細資訊，請參閱《[IAM 使用者指南》中的建立 IAM 政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。 **

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "s3:*"
         ],
         "Resource": [
           "arn:aws:s3:::cross-account-bucket",
           "arn:aws:s3:::cross-account-bucket/*"
         ],
         "Sid": "AllowS3"
       }
     ]
   }
   ```

------

   如果您需要 DynamoDB 存取，請建立 IAM 政策，指定存取跨帳戶 DynamoDB 資料表的許可。然後，將 IAM 政策附接至 `Cross-Account-Role-B`。如需詳細資訊，請參閱《*IAM 使用者指南*》中的 [Amazon DynamoDB：允許存取特定資料表](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_dynamodb_specific-table.html)。

   以下是允許存取 DynamoDB 資料表 的政策`CrossAccountTable`。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "dynamodb:*"
         ],
         "Resource": [
           "arn:aws:dynamodb:*:123456789012:table/CrossAccountTable"
         ],
         "Sid": "AllowDYNAMODB"
       }
     ]
   }
   ```

------

1. 編輯 `Cross-Account-Role-B` 角色的信任關係。

   1. 若要設定角色的信任關係，請在 IAM 主控台中為您在步驟 2 中`Cross-Account-Role-B`建立的角色選擇**信任關係**索引標籤。

   1. 選取**編輯信任關係**。

   1. 新增下列政策文件。這可讓 `Job-Execution-Role-A`中的 `AccountA` 擔任該`Cross-Account-Role-B`角色。

------
#### [ JSON ]

****  

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "sts:AssumeRole"
            ],
            "Resource": "arn:aws:iam::123456789012:role/Job-Execution-Role-A",
            "Sid": "AllowSTSAssumerole"
          }
        ]
      }
      ```

------

1. 在 `Job-Execution-Role-A``AccountA`中 AWS STS 授予擔任 的`AssumeRole`許可`Cross-Account-Role-B`。

   1. 在 AWS 帳戶 的 IAM 主控台中`AccountA`，選取 `Job-Execution-Role-A`。

   1. 將以下政策陳述式新增至 `Job-Execution-Role-A` 以允許 `Cross-Account-Role-B` 角色的 `AssumeRole` 動作。

------
#### [ JSON ]

****  

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "sts:AssumeRole"
            ],
            "Resource": [
              "arn:aws:iam::123456789012:role/Cross-Account-Role-B"
            ],
            "Sid": "AllowSTSAssumerole"
          }
        ]
      }
      ```

------

## 擔任的角色範例
<a name="jobs-s3-access-how-to-assumed-role-examples"></a>

使用單一擔任角色存取帳戶中的所有 S3 資源，或使用 Amazon EMR 6.11 及更高版本，設定多個 IAM 角色，以便在您存取不同的跨帳戶 S3 儲存貯體時擔任。

**Topics**
+ [使用一個擔任的角色存取 S3 資源](#jobs-s3-access-how-to-assumed-role-single)
+ [使用多個擔任的角色存取 S3 資源](#jobs-s3-access-how-to-assumed-role-multiple)

### 使用一個擔任的角色存取 S3 資源
<a name="jobs-s3-access-how-to-assumed-role-single"></a>

**注意**  
當您將任務設定為使用單一擔任角色時，整個任務的所有 S3 資源都會使用該角色，包括`entryPoint`指令碼。

如果您想要使用單一擔任的角色來存取帳戶 B 中的所有 S3 資源，請指定下列組態：

1. 將 EMRFS 組態指定`fs.s3.customAWSCredentialsProvider`給 `com.amazonaws.emr.AssumeRoleAWSCredentialsProvider`。

1. 針對 Spark，使用 `spark.emr-serverless.driverEnv.ASSUME_ROLE_CREDENTIALS_ROLE_ARN`和 `spark.executorEnv.ASSUME_ROLE_CREDENTIALS_ROLE_ARN` 在驅動程式和執行器上指定環境變數。

1. 針對 Hive，使用 `hive.emr-serverless.launch.env.ASSUME_ROLE_CREDENTIALS_ROLE_ARN`、 `tez.am.emr-serverless.launch.env.ASSUME_ROLE_CREDENTIALS_ROLE_ARN`和 `tez.task.emr-serverless.launch.env.ASSUME_ROLE_CREDENTIALS_ROLE_ARN` 在 Hive 驅動程式、Tez 應用程式主要容器和 Tez 任務容器上指定環境變數。

下列範例示範如何使用 擔任的角色來啟動具有跨帳戶存取的 EMR Serverless 任務執行。

------
#### [ Spark ]

下列範例示範如何使用 擔任的角色啟動具有 S3 跨帳戶存取權的 EMR Serverless Spark 任務執行。

```
aws emr-serverless start-job-run \
    --application-id application-id \
    --execution-role-arn job-role-arn \
    --job-driver '{
        "sparkSubmit": {
            "entryPoint": "entrypoint_location",
            "entryPointArguments": [":argument_1:", ":argument_2:"],
            "sparkSubmitParameters": "--conf spark.executor.cores=4 --conf spark.executor.memory=20g --conf spark.driver.cores=4 --conf spark.driver.memory=8g --conf spark.executor.instances=1"
        }
    }' \
     --configuration-overrides '{
        "applicationConfiguration": [{
            "classification": "spark-defaults",
            "properties": {
                "spark.hadoop.fs.s3.customAWSCredentialsProvider": "com.amazonaws.emr.AssumeRoleAWSCredentialsProvider",
                "spark.emr-serverless.driverEnv.ASSUME_ROLE_CREDENTIALS_ROLE_ARN": "arn:aws:iam::AccountB:role/Cross-Account-Role-B",
                "spark.executorEnv.ASSUME_ROLE_CREDENTIALS_ROLE_ARN": "arn:aws:iam::AccountB:role/Cross-Account-Role-B"
            }
        }]
    }'
```

------
#### [ Hive ]

下列範例示範如何使用 擔任的角色啟動具有 S3 跨帳戶存取權的 EMR Serverless Hive 任務執行。

```
aws emr-serverless start-job-run \
    --application-id application-id \
    --execution-role-arn job-role-arn \
    --job-driver '{
        "hive": {
            "query": "query_location",
            "parameters": "hive_parameters"
        }
    }' \
    --configuration-overrides '{
        "applicationConfiguration": [{
            "classification": "hive-site",
            "properties": {
                "fs.s3.customAWSCredentialsProvider": "com.amazonaws.emr.serverless.credentialsprovider.AssumeRoleAWSCredentialsProvider",
                "hive.emr-serverless.launch.env.ASSUME_ROLE_CREDENTIALS_ROLE_ARN": "arn:aws:iam::AccountB:role/Cross-Account-Role-B",
                "tez.am.emr-serverless.launch.env.ASSUME_ROLE_CREDENTIALS_ROLE_ARN": "arn:aws:iam::AccountB:role/Cross-Account-Role-B",
                "tez.task.emr-serverless.launch.env.ASSUME_ROLE_CREDENTIALS_ROLE_ARN": "arn:aws:iam::AccountB:role/Cross-Account-Role-B"
            }
        }]
    }'
```

------

### 使用多個擔任的角色存取 S3 資源
<a name="jobs-s3-access-how-to-assumed-role-multiple"></a>

使用 EMR Serverless 6.11.0 版和更新版本，設定多個 IAM 角色，以便在您存取不同的跨帳戶儲存貯體時擔任。如果您想要存取帳戶 B 中具有不同擔任角色的不同 S3 資源，請在開始任務執行時使用下列組態：

1. 將 EMRFS 組態指定`fs.s3.customAWSCredentialsProvider`給 `com.amazonaws.emr.serverless.credentialsprovider.BucketLevelAssumeRoleCredentialsProvider`。

1. 指定 EMRFS 組態`fs.s3.bucketLevelAssumeRoleMapping`，以定義從 S3 儲存貯體名稱到帳戶 B 中 IAM 角色的映射。值的格式應該為 `bucket1->role1;bucket2->role2`。

例如，使用 `arn:aws:iam::AccountB:role/Cross-Account-Role-B-1`存取儲存貯體 `bucket1`，並使用 `arn:aws:iam::AccountB:role/Cross-Account-Role-B-2` 存取儲存貯體 `bucket2`。下列範例示範如何透過多個擔任的角色，透過跨帳戶存取啟動 EMR Serverless 任務執行。

------
#### [ Spark ]

下列範例示範如何使用多個擔任的角色來建立 EMR Serverless Spark 任務執行。

```
aws emr-serverless start-job-run \
    --application-id application-id \
    --execution-role-arn job-role-arn \
    --job-driver '{
        "sparkSubmit": {
            "entryPoint": "entrypoint_location",
            "entryPointArguments": [":argument_1:", ":argument_2:"],
            "sparkSubmitParameters": "--conf spark.executor.cores=4 --conf spark.executor.memory=20g --conf spark.driver.cores=4 --conf spark.driver.memory=8g --conf spark.executor.instances=1"
        }
    }' \
     --configuration-overrides '{
        "applicationConfiguration": [{
            "classification": "spark-defaults",
            "properties": {
                "spark.hadoop.fs.s3.customAWSCredentialsProvider": "com.amazonaws.emr.serverless.credentialsprovider.BucketLevelAssumeRoleCredentialsProvider",
                "spark.hadoop.fs.s3.bucketLevelAssumeRoleMapping": "bucket1->arn:aws:iam::AccountB:role/Cross-Account-Role-B-1;bucket2->arn:aws:iam::AccountB:role/Cross-Account-Role-B-2"
            }
        }]
    }'
```

------
#### [ Hive ]

下列範例示範如何使用多個擔任的角色來建立 EMR Serverless Hive 任務執行。

```
aws emr-serverless start-job-run \
    --application-id application-id \
    --execution-role-arn job-role-arn \
    --job-driver '{
        "hive": {
            "query": "query_location",
            "parameters": "hive_parameters"
        }
    }' \
    --configuration-overrides '{
        "applicationConfiguration": [{
            "classification": "hive-site",
            "properties": {
                "fs.s3.customAWSCredentialsProvider": "com.amazonaws.emr.serverless.credentialsprovider.AssumeRoleAWSCredentialsProvider",
                "fs.s3.bucketLevelAssumeRoleMapping": "bucket1->arn:aws:iam::AccountB:role/Cross-Account-Role-B-1;bucket2->arn:aws:iam::AccountB:role/Cross-Account-Role-B-2"
            }
        }]
    }'
```

------

# 故障診斷 EMR Serverless 中的錯誤
<a name="jobs-troubleshoot"></a>

使用以下資訊來協助診斷和修正使用 Amazon EMR Serverless 時發生的常見問題。

**Topics**
+ [錯誤：任務失敗，因為帳戶已達到可同時使用的最大 vCPU 服務限制。](#jobs-troubleshoot-allowed-capacity-vcpu)
+ [錯誤：任務失敗，因為應用程式已超過maximumCapacity設定。](#jobs-troubleshoot-maxcapacity)
+ [錯誤：由於無法配置工作者而導致任務失敗，因為應用程式已超過maximumCapacity。](#jobs-troubleshoot-worker-allocated)
+ [錯誤：S3 存取遭拒。請檢查所需 S3 資源上任務執行時間角色的 S3 存取許可。](#jobs-troubleshoot-s3)
+ [錯誤：ModuleNotFoundError：沒有名為 <module> 的模組。請參閱 使用者指南，了解如何搭配 EMR Serverless 使用 python 程式庫。](#jobs-troubleshoot-module)
+ [錯誤：無法擔任執行角色 <role name>，因為它不存在或未設定所需的信任關係。](#jobs-troubleshoot-runtime-role)

## 錯誤：任務失敗，因為帳戶已達到可同時使用的最大 vCPU 服務限制。
<a name="jobs-troubleshoot-allowed-capacity-vcpu"></a>

此錯誤表示由於帳戶已超過最大容量，EMR Serverless 無法提交任務。增加帳戶的最大容量。檢查 [EMR Serverless 服務配額](https://console.aws.amazon.com/servicequotas/home/services/emr-serverless/quotas)的服務限制。

## 錯誤：任務失敗，因為應用程式已超過maximumCapacity設定。
<a name="jobs-troubleshoot-maxcapacity"></a>

此錯誤表示 EMR Serverless 無法提交任務，因為應用程式已超過設定的最大容量。增加應用程式的最大容量。

## 錯誤：由於無法配置工作者而導致任務失敗，因為應用程式已超過maximumCapacity。
<a name="jobs-troubleshoot-worker-allocated"></a>

此錯誤表示任務無法完成。無法配置工作者，因為應用程式已超過maximumCapacity設定。

## 錯誤：S3 存取遭拒。請檢查所需 S3 資源上任務執行時間角色的 S3 存取許可。
<a name="jobs-troubleshoot-s3"></a>

此錯誤表示您的任務無法存取您的 S3 資源。確認任務執行時間角色具有存取任務需要使用之 S3 資源的許可。若要進一步了解執行期角色，請參閱 [Amazon EMR Serverless 的任務執行期角色](security-iam-runtime-role.md)。

## 錯誤：ModuleNotFoundError：沒有名為 <module> 的模組。請參閱 使用者指南，了解如何搭配 EMR Serverless 使用 python 程式庫。
<a name="jobs-troubleshoot-module"></a>

此錯誤表示 Python 模組不適用於 Spark 任務。檢查相依 Python 程式庫是否可供任務使用。如需如何封裝 Python 程式庫的詳細資訊，請參閱 [搭配 EMR Serverless 使用 Python 程式庫](using-python-libraries.md)。

## 錯誤：無法擔任執行角色 <role name>，因為它不存在或未設定所需的信任關係。
<a name="jobs-troubleshoot-runtime-role"></a>

此錯誤表示您為任務指定的任務執行期角色不存在，或該角色沒有 EMR Serverless 許可的信任關係。若要驗證 IAM 角色是否存在，並驗證您已正確設定角色的信任政策，請參閱 中的說明[Amazon EMR Serverless 的任務執行期角色](security-iam-runtime-role.md)。

# 啟用任務層級成本分配
<a name="jobs-job-level-cost-allocation"></a>

任務層級成本分配可在個別任務執行層級啟用 EMR Serverless 的精細計費屬性，而不是彙總應用程式層級的所有成本。啟用時，您可以依與任務執行相關聯的特定任務執行 IDs 和標籤，篩選和追蹤 AWS Cost Explorer和成本和用量報告，以便更清楚地了解提交的任務執行費用。

## 預設行為
<a name="jobs-job-level-cost-allocation-default"></a>

預設不會啟用任務層級成本分配。

## 如何啟用或停用此功能
<a name="jobs-job-level-cost-allocation-enable"></a>

您可以在應用程式建立期間設定任務層級成本分配，或更新現有應用程式的任務層級成本分配。

建立新應用程式時指定 `jobLevelCostAllocation` 參數：

```
# Enable job-level cost allocation:
aws emr-serverless create-application \
    --name "my-application" \
    --release-label "emr-7.12.0" \
    --type "SPARK" \
    --job-level-cost-allocation-configuration '{
        "enabled": true
    }'

# Disable job-level cost allocation:
aws emr-serverless create-application \
    --name "my-application" \
    --release-label "emr-7.12.0" \
    --type "SPARK" \
    --job-level-cost-allocation-configuration '{
        "enabled": false
    }'
```

更新現有應用程式的 `jobLevelCostAllocationConfiguration` 參數：

```
# Enable job-level cost allocation:
aws emr-serverless update-application \
    --application-id <application-id> \
    --job-level-cost-allocation-configuration '{
        "enabled": true
    }'

# Disable job-level cost allocation:
aws emr-serverless update-application \
    --application-id <application-id> \
    --job-level-cost-allocation-configuration '{
        "enabled": false
    }'
```

## 考量事項與限制
<a name="jobs-job-level-cost-allocation-considerations"></a>
+ 啟用任務層級成本分配不會追溯啟用功能之前完成的任務執行成本。啟用此功能後開始的任務執行會有精細的成本歸因。
+ 只有在應用程式處於 CREATED 或 STOPPED 狀態時，才能更新任務層級成本分配參數。
+ 啟用任務層級成本分配時，成本會歸因於個別任務執行，而非應用程式。若要在應用程式層級檢視彙總成本，您必須將一致的標籤 （例如 application-name 或 application-id) 套用至該應用程式內的所有任務執行，並在 Cost Explorer 或 Cost and Usage Reports 中依這些標籤進行篩選。