

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

# 儲存 Spark 隨機資料
<a name="monitor-spark-shuffle-manager"></a>

隨機排序是每當資料分割區之間重新排列 Spark 任務的重要步驟。這是必需的，因為諸如 `join`、` groupByKey`、`reduceByKey` 以及 `repartition` 等廣泛轉換需要來自其他分割區的資訊才能完成處理。Spark 會從每個分割區收集所需的資料，並將其結合成一個新的分割區。在隨機排序期間，資料會寫入磁碟並透過網路傳輸。因此，隨機排序操作與本機磁碟容量密切相關。當執行器沒有足夠的磁碟空間並且沒有復原時，Spark 擲出 `No space left on device` 或 ` MetadataFetchFailedException` 錯誤。

**注意**  
 AWS Glue 僅 AWS Glue ETL 任務支援具有 Amazon S3 的 Spark 隨機播放外掛程式。

**解決方案**  
透過 AWS Glue，您現在可以使用 Amazon S3 來存放 Spark 隨機排序資料。Amazon S3 是一項物件儲存服務，提供領先業界的可擴展性、資料可用性、安全性和效能。此解決方案可為您的 Spark 任務分解運算和儲存，並提供完整的彈性和低成本的隨機排序儲存，讓您可靠地執行最密集的隨機排序工作負載。

![\[Spark workflow showing Map and Reduce stages using Amazon S3 for shuffle data storage.\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/gs-s3-shuffle-diagram.png)


我們正推出新的 Apache Spark 雲端隨機排序儲存外掛程式，以便您有效地使用 Amazon S3。如果已知任務受到大型隨機操作的本機磁碟容量限制，您可以開啟 Amazon S3 隨機排序來可靠地執行您的 AWS Glue 任務，而不會失敗。在某些情況下，如果您有大量的小分割區或隨機排序檔案已寫入 Amazon S3，則隨機排序到 Amazon S3 會比本機磁碟 (或 EBS) 稍慢一些。

## 使用雲端隨機排序儲存外掛程式的先決條件
<a name="monitor-spark-shuffle-manager-prereqs"></a>

 若要搭配 AWS Glue ETL 任務使用 Cloud Shuffle Storage Plugin，您需要下列項目：
+ 與任務執行位於相同區域的 Amazon S3 儲存貯體，用於存放中繼隨機排序和溢出的資料。您可以使用 `--conf spark.shuffle.glue.s3ShuffleBucket=s3://shuffle-bucket/prefix/` 指定隨機排序儲存的 Amazon S3 字首，如下列範例所示：

  ```
  --conf spark.shuffle.glue.s3ShuffleBucket=s3://glue-shuffle-123456789-us-east-1/glue-shuffle-data/
  ```
+  在*字首*上設定 Amazon S3 儲存生命週期政策 (如 `glue-shuffle-data`)，因為隨機排序管理器在任務完成後不會清除檔案。任務完成後，應刪除中繼隨機排序和溢出的資料。使用者可以在字首上設定簡短的生命週期政策。如需設定 Amazon S3 生命週期政策的說明，請參閱《Amazon Simple Storage Service 使用者指南》中的[設定儲存貯體的生命週期組態](https://docs.aws.amazon.com//AmazonS3/latest/userguide/how-to-set-lifecycle-configuration-intro.html)。

## 從 AWS 主控台使用 AWS Glue Spark 隨機播放管理員
<a name="monitor-spark-shuffle-manager-using-console"></a>

若要在設定任務時，使用 AWS Glue 主控台或 AWS Glue Studio 設定 AWS Glue Spark 隨機排序管理器：選擇 **--write-shuffle-files-to-s3** 任務參數以開啟該任務的 Amazon S3 隨機排序。

![\[Job parameters interface showing --write-shuffle-files- parameter and option to add more.\]](http://docs.aws.amazon.com/zh_tw/glue/latest/dg/images/gs-s3-shuffle.png)


## 使用 AWS Glue Spark 隨機排序外掛程式
<a name="monitor-spark-shuffle-manager-using"></a>

下列任務參數會開啟並微調 AWS Glue 隨機排序管理器。這些參數是旗標，因此不會考慮提供的任何值。
+ `--write-shuffle-files-to-s3`：主要旗標，啟用 AWS Glue Spark 隨機排序管理器以使用 Amazon S3 儲存貯體來寫入和讀取隨機排序資料。當未指定旗標時不使用隨機排序管理器。
+ `--write-shuffle-spills-to-s3` – (僅對 AWS Glue 2.0 版本提供支援)。此為選用旗標，可讓您將溢出檔案卸載到 Amazon S3 儲存貯體，這可為 Spark 任務提供額外的彈性。只有將大量資料溢出到磁碟的大型工作負載才需要它。如果未指定旗標，則不會寫入中繼溢出檔案。
+ ` --conf spark.shuffle.glue.s3ShuffleBucket=s3://<shuffle-bucket>` — 另一個可選標記，它指定您在其中寫入隨機排序檔案的 Amazon S3 儲存貯體。根據預設，`--TempDir`/shuffle-data. AWS Glue 3.0\$1 支援將隨機播放檔案寫入多個儲存貯體，方法是使用逗號分隔符號指定儲存貯體，如 所示`--conf spark.shuffle.glue.s3ShuffleBucket=s3://shuffle-bucket-1/prefix,s3://shuffle-bucket-2/prefix/`。使用多個儲存貯體可改善效能。

您需要提供安全組態設定，才能為隨機資料啟用靜態加密。如需安全組態的詳細資訊，請參閱 [設定 AWS Glue 中的加密](set-up-encryption.md)。AWS Glue 支援 Spark 提供的所有其他隨機顯示相關組態。

**雲端隨機排序儲存外掛程式的軟體二進位檔**  
您也可以依據 Apache 2.0 許可證下載 Apache Spark 雲端隨機排序儲存外掛程式的軟體二進位檔，並在任何 Spark 環境中執行該二進位檔。這個新的外掛程式隨附對 Amazon S3 的立即支援，也可以輕鬆設定為使用其他形式的雲端儲存，例如 [Google Cloud Storage 和 Microsoft Azure Blob 儲存體](https://github.com/aws-samples/aws-glue-samples/blob/master/docs/cloud-shuffle-plugin/README.md)。如需詳細資訊，請參閱 [Apache Spark 雲端隨機排序儲存外掛程式](https://docs.aws.amazon.com/glue/latest/dg/cloud-shuffle-storage-plugin.html)。

**備註與限制**  
以下是 AWS Glue 隨機排序管理器的備註或限制：
+  AWS Glue 隨機播放管理員不會在任務完成後自動刪除存放在 Amazon S3 儲存貯體中的 （暫時） 隨機播放資料檔案。若要確保資料保護，請在啟用雲端隨機排序儲存外掛程式之前遵循 [使用雲端隨機排序儲存外掛程式的先決條件](#monitor-spark-shuffle-manager-prereqs) 中的說明進行操作。
+ 如果資料偏斜，您可以使用此功能。

# Apache Spark 雲端隨機排序儲存外掛程式
<a name="cloud-shuffle-storage-plugin"></a>

雲端隨機排序儲存外掛程式是與 [`ShuffleDataIO` API](https://github.com/apache/spark/blob/master/core/src/main/java/org/apache/spark/shuffle/api/ShuffleDataIO.java) 相容的 Apache Spark 外掛程式，允許在雲端儲存系統 (如 Amazon S3) 上儲存隨機排序資料。此外掛程式可以幫助您補充或更換本機磁碟儲存容量，以進行大型隨機排序操作，此類操作通常由 Spark 應用程式中的轉換 (例如 `join`、`reduceByKey`、`groupByKey` 和 `repartition`) 觸發，從而減少無伺服器資料分析任務和管道的常見故障或對價格/效能的負面影響。

**AWS Glue**  
AWS Glue 3.0 和 4.0 版本隨附預先安裝的外掛程式，並可啟用對 Amazon S3 的隨機排序，而無需任何額外的步驟。如需詳細資訊，請參閱 [AWS Glue Spark 隨機排序外掛程式與 Amazon S3](https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-shuffle-manager.html)，以啟用 Spark 應用程式的功能。

**其他 Spark 環境**  
該外掛程式需要在其他 Spark 環境中設定以下 Spark 組態：
+ `--conf spark.shuffle.sort.io.plugin.class=com.amazonaws.spark.shuffle.io.cloud.ChopperPlugin`：這會通知 Spark 使用此外掛程式對 IO 進行隨機排序。
+ `--conf spark.shuffle.storage.path=s3://bucket-name/shuffle-file-dir`：隨機排序檔案的存放路徑。

**注意**  
該外掛程式會覆寫一個 Spark 核心類別。因此，需要在 Spark jar 之前載入外掛程式 jar。如果在 AWS Glue 外部使用此外掛程式，您可以在內部部署 YARN 環境中使用 `userClassPathFirst` 來達成此目的。

## 將外掛程式與 Spark 應用程式綁定在一起
<a name="cloud-shuffle-storage-plugin-bundling"></a>

您可以在本機開發 Spark 應用程式時，透過在 Maven `pom.xml` 中新增外掛程式相依性，將外掛程式與 Spark 應用程式和 Spark 發行版本 (3.1 及更高版本) 綁定在一起。如需有關此外掛程式和 Spark 版本的詳細資訊，請參閱[外掛程式版本](#cloud-shuffle-storage-plugin-versions)。

```
<repositories>
   ...
    <repository>
        <id>aws-glue-etl-artifacts</id>
        <url>https://aws-glue-etl-artifacts.s3.amazonaws.com/release/ </url>
    </repository>
</repositories>
...
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>chopper-plugin</artifactId>
    <version>3.1-amzn-LATEST</version>
</dependency>
```

或者，您也可以直接從 AWS Glue Maven 成品下載二進位檔，並將其包含在 Spark 應用程式中，如下所示。

```
#!/bin/bash
sudo wget -v https://aws-glue-etl-artifacts.s3.amazonaws.com/release/com/amazonaws/chopper-plugin/3.1-amzn-LATEST/chopper-plugin-3.1-amzn-LATEST.jar -P /usr/lib/spark/jars/
```

spark-submit 範例

```
spark-submit --deploy-mode cluster \
--conf spark.shuffle.storage.s3.path=s3://<ShuffleBucket>/<shuffle-dir> \
--conf spark.driver.extraClassPath=<Path to plugin jar> \ 
--conf spark.executor.extraClassPath=<Path to plugin jar> \
--class <your test class name> s3://<ShuffleBucket>/<Your application jar> \
```

## 選用組態
<a name="cloud-shuffle-storage-plugin-optional"></a>

這些是控制 Amazon S3 隨機排序行為的選用組態值。
+ `spark.shuffle.storage.s3.enableServerSideEncryption`：啟用/停用將檔案隨機排序和溢位的 S3 SSE。預設值為 `true`。
+ `spark.shuffle.storage.s3.serverSideEncryption.algorithm`：要使用的 SSE 演算法。預設值為 `AES256`。
+ `spark.shuffle.storage.s3.serverSideEncryption.kms.key`：啟用 SSE aws:kms 時的 KMS 金鑰 ARN。

除了這些組態之外，您可能需要設定組態，例如 `spark.hadoop.fs.s3.enableServerSideEncryption` 和**其他特定於環境的組態**，以確保針對您的使用案例套用適當加密。

## 外掛程式版本
<a name="cloud-shuffle-storage-plugin-versions"></a>

與每個版本相關聯的 Spark AWS Glue 版本支援此外掛程式。下表顯示 AWS Glue 版本、Spark 版本和相關的外掛程式版本，以及外掛程式軟體二進位檔的 Amazon S3 位置。


| AWS Glue 版本 | Spark 版本 | 外掛程式版本 | Amazon S3 位置 | 
| --- | --- | --- | --- | 
| 3.0 | 3.1 | 3.1-amzn-LATEST |  s3://aws-glue-etl-artifacts/release/com/amazonaws/chopper-plugin/3.1-amzn-0/chopper-plugin-3.1-amzn-LATEST.jar  | 
| 4.0 | 3.3 | 3.3-amzn-LATEST |  s3://aws-glue-etl-artifacts/release/com/amazonaws/chopper-plugin/3.3-amzn-0/chopper-plugin-3.3-amzn-LATEST.jar  | 

## 授權
<a name="cloud-shuffle-storage-plugin-binary-license"></a>

此外掛程式的軟體二進位檔依據 Apache 2.0 許可證獲得授權。