

# 제한된 실행을 통한 워크로드 분할
<a name="bounded-execution"></a>

Spark 애플리케이션의 오류는 일반적으로 비효율적인 Spark 스크립트, 대규모 트랜스포메이션의 분산된 인메모리 실행 및 데이터 집합 이상으로 인해 발생합니다. 드라이버 또는 실행기의 메모리 부족 문제를 일으킬 수 있는 많은 이유가 있습니다(예: 데이터 왜곡, 너무 많은 객체 나열 또는 큰 데이터 셔플). 이러한 문제는 Spark로 엄청난 양의 백로그 데이터를 처리할 때 자주 발생합니다.

AWS Glue를 사용하면 OOM 문제를 해결하고 워크로드 분할을 통해 ETL 처리를 더 쉽게 할 수 있습니다. 워크로드 분할이 활성화되면 각 ETL 작업 실행은 처리되지 않은 데이터만 선택하며, 이 작업 실행으로 처리할 파일 수 또는 데이터 집합 크기에 대한 상한이 있습니다. 향후 작업 실행은 나머지 데이터를 처리합니다. 예를 들어 1,000개의 파일을 처리해야 하는 경우 파일 수를 500으로 설정하고 2개의 작업 실행으로 분리할 수 있습니다.

워크로드 분할은 Amazon S3 데이터 원본에 대해서만 지원됩니다.

## 워크로드 분할 사용
<a name="bounded-execution-enable"></a>

스크립트에서 수동으로 옵션을 설정하거나 카탈로그 테이블 속성을 추가하여 제한된 실행을 사용할 수 있습니다.

**스크립트에서 제한된 실행으로 워크로드 분할을 사용하려면**

1. 데이터를 다시 처리하지 않으려면 새 작업 또는 기존 작업에서 작업 북마크를 사용합니다. 자세한 내용은 [작업 북마크를 사용하여 처리된 데이터 추적](https://docs.aws.amazon.com/glue/latest/dg/monitor-continuations.html)을 참조하세요.

1. 스크립트를 수정하고 AWS Glue `getSource` API의 추가 옵션에서 경계 제한을 설정합니다. `state` 요소를 저장하기 위해 작업 북마크에 대한 트랜스포메이션 컨텍스트도 설정해야 합니다. 예:

   Python

   ```
   glueContext.create_dynamic_frame.from_catalog(
       database = "database",
       table_name = "table_name",
       redshift_tmp_dir = "",
       transformation_ctx = "datasource0",
       additional_options = {
           "boundedFiles" : "500", # need to be string
         # "boundedSize" : "1000000000" unit is byte
       }
   )
   ```

   Scala

   ```
   val datasource0 = glueContext.getCatalogSource(
       database = "database", tableName = "table_name", redshiftTmpDir = "", 
       transformationContext = "datasource0",
       additionalOptions = JsonOptions(
           Map("boundedFiles" -> "500") // need to be string
         //"boundedSize" -> "1000000000" unit is byte
       ) 
   ).getDynamicFrame()
   ```

   ```
   val connectionOptions = JsonOptions(
       Map("paths" -> List(baseLocation), "boundedFiles" -> "30")
   )
   val source = glueContext.getSource("s3", connectionOptions, "datasource0", "")
   ```

**Data Catalog 테이블에서 제한된 실행으로 워크로드 분할을 사용하려면**

1. Data Catalog에서 테이블 구조의 `parameters` 필드에 키-값 페어를 설정합니다. 자세한 내용은 [테이블 세부 정보 보기 및 편집](https://docs.aws.amazon.com/glue/latest/dg/console-tables.html#console-tables-details)을 참조하세요.

1. 데이터 집합 크기 또는 처리되는 파일 수의 상한을 설정합니다.
   + `boundedSize`를 데이터 집합의 대상 크기(바이트)로 설정합니다. 테이블에서 대상 크기에 도달하면 작업 실행이 중지됩니다.
   + `boundedFiles`를 대상 파일 수로 설정합니다. 대상 파일 수를 처리한 후 작업 실행이 중지됩니다.
**참고**  
하나의 경계만 지원되므로 `boundedSize` 또는 `boundedFiles` 중 하나만 설정해야 합니다.

## 작업을 자동으로 실행하도록 AWS Glue 트리거 설정
<a name="bounded-execution-trigger"></a>

제한된 실행을 사용하면 작업을 자동으로 실행하고 순차적 실행에서 데이터를 증분적으로 로드하도록 AWS Glue 트리거를 설정할 수 있습니다. AWS Glue 콘솔로 이동하여 트리거를 생성하고 일정 시간을 설정하고 작업에 연결합니다. 그런 다음 자동으로 다음 작업 실행을 트리거하고 새 데이터 배치를 처리합니다.

또한 AWS Glue 워크플로로 여러 작업을 오케스트레이션하여 서로 다른 파티션의 데이터를 병렬로 처리할 수 있습니다. 자세한 내용은 [AWS Glue 트리거](https://docs.aws.amazon.com/glue/latest/dg/about-triggers.html) 및 [AWS Glue 워크플로](https://docs.aws.amazon.com/glue/latest/dg/workflows_overview.html)를 참조하세요.

사용 사례 및 옵션에 대한 자세한 내용은 [AWS Glue에서 워크로드 분할로 Spark 애플리케이션 최적화](https://aws.amazon.com/blogs/big-data/optimizing-spark-applications-with-workload-partitioning-in-aws-glue/)를 참조하세요.