

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

# 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 許可證獲得授權。