

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 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 버킷 또는 접두사로 로그 쓰기
+ S3 버킷의 데이터를 암호화하기 위해 KMS 키를 사용하는 경우 KMS 키에 대한 액세스
+ SparkSQL을 사용하는 경우 AWS Glue 데이터 카탈로그에 액세스

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을 실행하는 경우 `--class` 인수를 `SparkSubmitParameters`에서 기본 항목 클래스를 지정합니다.

자세한 내용은 [Launching Applications with 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 제출 파라미터가 우선합니다. 구성의 우선순위는 다음과 같습니다(최상위부터 최하위의 순서).
+ `SparkSession`을 생성하는 경우 EMR Serverless에서 제공하는 구성.
+ `--conf` 인수와 함께 `sparkSubmitParameters`의 일부로 제공하는 구성.
+ 작업을 시작하는 경우 애플리케이션 재정의의 일부로 제공하는 구성.
+ 애플리케이션을 생성하는 경우 `runtimeConfiguration`의 일부로 제공하는 구성.
+ 해당 릴리스에 대해 Amazon EMR에서 사용하는 최적화된 구성.
+ 애플리케이션의 기본 오픈 소스 구성.

애플리케이션 수준에서 구성을 선언하고 작업 실행 중에 구성을 재정의하는 방법에 대한 자세한 내용은 [EMR Serverless에 대한 기본 애플리케이션 구성](default-configs.md) 섹션을 참조하세요.

### Spark 동적 리소스 할당 최적화
<a name="spark-defaults-dynamicResourceAllocation"></a>

`dynamicAllocationOptimization`을 사용하여 EMR Serverless에서 리소스 사용을 최적화합니다. Spark 구성 분류에서 이 속성을 `true`로 설정하면 EMR Serverless가 실행기 리소스 할당을 최적화하여 EMR Serverless에서 작업자를 생성하고 릴리스하는 속도에 맞게 Spark에서 실행기를 요청하고 취소하는 속도를 조정할 수 있습니다. 이렇게 하면 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 속성 및 기본값**  

| Key(키) | 설명 | 기본값  | 
| --- | --- | --- | 
| 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 | 실행기 할당의 각 주기에서 요청할 컨테이너 수. 각 할당 주기 사이 간격은 1초입니다. | 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 | 드라이버 및 실행기의 런타임 클래스 경로에 추가할 추가 jar. | NULL | 
| spark.network.crypto.enabled | AES 기반 RPC 암호화를 켜는 옵션. 여기에는 Spark 2.2.0에 추가된 인증 프로토콜이 포함됩니다. | FALSE | 
| spark.sql.warehouse.dir | 관리형 데이터베이스 및 테이블의 기본 위치. | \$1PWD/spark-warehouse의 값 | 
| spark.submit.pyFiles | Python 앱에 대한 PYTHONPATH에 배치할 .zip, .egg 또는  .py 파일의 쉼표로 구분된 목록. | NULL | 

다음 표에는 기본 Spark 제출 파라미터가 나와 있습니다.


**기본 Spark 제출 파라미터**  

| Key(키) | 설명 | 기본값  | 
| --- | --- | --- | 
| 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 | 드라이버 및 실행기 클래스 경로에 포함할 jar의 쉼표로 구분된 목록. | NULL | 
| num-executors | 실행할 실행기 수. | 3 | 
| py-files | Python 앱에 대한 PYTHONPATH에 배치할 .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: spark-defaults 분류에 configurationOverrides 사용
<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 스크립트를 실행하는 방법을 보여줍니다. 이 예제를 사용하는 엔드투엔드 자습서는 [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"
        }
    }'
```