

# 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로 셔플링할 수 있습니다. 자세한 내용을 보려면 [Amazon S3의 AWS Glue Spark 셔플 클러그인](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`: Shuffle IO에 이 플러그인을 사용하도록 Spark에 알려줍니다.
+ `--conf spark.shuffle.storage.path=s3://bucket-name/shuffle-file-dir`: 셔플 파일이 저장되는 경로입니다.

**참고**  
플러그인은 Spark 코어 클래스 하나를 덮어씁니다. 따라서 플러그인 jar을 Spark 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>

이 플러그인은 각 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 라이선스에 따라 사용이 허가됩니다.