

# 适用于 Apache Spark 的 Cloud Shuffle 存储插件
<a name="cloud-shuffle-storage-plugin"></a>

Cloud Shuffle 存储插件是一款与 [`ShuffleDataIO` API](https://github.com/apache/spark/blob/master/core/src/main/java/org/apache/spark/shuffle/api/ShuffleDataIO.java) 兼容的 Apache Spark 插件，它允许在云存储系统（例如 Amazon S3）上存储 shuffle 数据。它可以帮助您补充或替换本地磁盘存储容量以进行大型随机播放，这些操作通常由 Spark 应用程序中的 `join`、`reduceByKey`、`groupByKey` 和 `repartition` 等转换触发，从而减少无服务器数据分析任务和管道的常见故障或性价比/性能失调。

**AWS Glue**  
AWS Glue 版本 3.0 和 4.0 预装了插件，无需任何额外步骤即可在 Amazon S3 上进行重组。有关更多信息，请参阅 [AWS Glue 搭载 Amazon S3 的 Spark shuffle 插件](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 为 Shuffle IO 使用这个插件。
+ `--conf spark.shuffle.storage.path=s3://bucket-name/shuffle-file-dir`：您的随机播放文件的存储路径。

**注意**  
该插件覆盖了一个 Spark 核心类。因此，需要在 Spark jar 之前加载插件 jar。如果在 AWS Glue 外部使用插件，则可以使用 `userClassPathFirst` 在本地 YARN 环境中执行此操作。

## 将插件与您的 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 提交示例

```
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>

与每个 AWS Glue 版本关联的 Spark 版本都支持此插件。下表显示了插件的软件二进制文件的 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 许可证获得许可。