AWS Glue 버전 3.0으로 AWS Glue for Spark 작업 마이그레이션 - AWS Glue

AWS Glue 버전 3.0으로 AWS Glue for Spark 작업 마이그레이션

이 주제에서는 Spark 애플리케이션 및 ETL 작업을 AWS Glue 3.0으로 마이그레이션할 수 있도록 하는 AWS Glue 버전 0.9, 1.0, 2.0 및 3.0 간의 변경 사항에 대해 설명합니다.

AWS Glue ETL 작업에 이 기능을 사용하려면 작업 생성 시 Glue version으로 3.0을 선택합니다.

지원되는 새로운 기능

이 섹션에서는 AWS Glue 버전 3.0의 새로운 기능과 장점에 대해 설명합니다.

  • 오픈 소스 Spark에서 최적화되고 적응형 쿼리 실행, 벡터화된 리더, 최적화된 셔플 및 파티션 병합과 같은 AWS Glue 및 EMR 서비스에 의해 개발된 Apache Spark 3.1.1을 기반으로 합니다.

  • MySQL, Microsoft SQL Server, Oracle, PostgreSQL, MongoDB 및 Spark 3.1.1에서 가져온 업그레이드된 Spark 라이브러리 및 종속성을 포함한 모든 Glue 기본 소스용 JDBC 드라이버가 업그레이드되었습니다.

  • 업그레이드된 EMRFS로 Amazon S3 액세스가 최적화되었으며 Amazon S3 최적화 출력 커미터가 기본적으로 사용됩니다.

  • 파티션 인덱스, 푸시다운 조건자, 파티션 목록 및 업그레이드된 Hive 메타스토어 클라이언트로 Data Catalog 액세스가 최적화되었습니다.

  • 셀 수준 필터링 및 데이터 레이크 트랜잭션이 있는 관리되는 카탈로그 테이블을 위해 Lake Formation과 통합됩니다.

  • 새로운 Spark 실행기 메모리 지표 및 Spark 정형 스트리밍 지표를 사용하여 Spark 3.1.1의 Spark UI 환경이 개선되었습니다.

  • AWS Glue 2.0과 유사하게 시작 대기 시간이 단축되어 전반적인 작업 완료 시간과 상호 작용성이 개선되었습니다.

  • Spark 작업은 AWS Glue 2.0과 유사하게 최소 10분에서 1분으로 10배 더 짧은 최소 청구 기간으로 1초 단위로 청구됩니다.

AWS Glue 3.0으로 마이그레이션할 작업

기존 작업의 경우 작업 구성에서 Glue version을 이전 버전에서 Glue 3.0으로 변경합니다.

  • 콘솔의 Glue version에서 Spark 3.1, Python 3 (Glue Version 3.0) or Spark 3.1, Scala 2 (Glue Version 3.0)를 선택합니다.

  • AWS Glue Studio의 Glue version에서 Glue 3.0 - Supports spark 3.1, Scala 2, Python 3을 선택합니다.

  • UpdateJob API의 GlueVersion 파라미터에서 3.0을 선택합니다.

새 작업의 경우 작업을 생성할 때 Glue 3.0을 선택합니다.

  • 콘솔의 Glue version에서 Spark 3.1, Python 3 (Glue Version 3.0) or Spark 3.1, Scala 2 (Glue Version 3.0)를 선택합니다.

  • AWS Glue Studio의 Glue version에서 Glue 3.0 - Supports spark 3.1, Scala 2, Python 3을 선택합니다.

  • CreateJob API의 GlueVersion 파라미터에서 3.0을 선택합니다.

AWS Glue 3.0의 Spark 이벤트 로그를 보려면 CloudFormation 또는 Docker를 사용하여 Glue 3.0용으로 업그레이드된 Spark 기록 서버를 시작합니다.

마이그레이션 체크리스트

마이그레이션을 위해 이 체크리스트를 검토합니다.

  • 작업이 HDFS에 종속되나요? 그렇다면 HDFS를 S3로 교체해 봅니다.

    • 작업 스크립트 코드에서 DFS 경로로 hdfs:// 또는 /로 시작하는 파일 시스템 경로를 검색합니다.

    • 기본 파일 시스템이 HDFS로 구성되어 있지 않은지 확인합니다. 명시적으로 구성된 경우 fs.defaultFS 구성을 제거해야 합니다.

    • 작업에 dfs.* 파라미터가 포함되어 있는지 확인합니다. 포함된 경우 파라미터를 사용 중지해도 괜찮은지 확인해야 합니다.

  • 작업이 YARN에 종속되나요? 그렇다면 작업에 다음 파라미터가 포함되어 있는지 확인하여 영향을 확인합니다. 포함된 경우 파라미터를 사용 중지해도 괜찮은지 확인해야 합니다.

    • spark.yarn.*

      예:

      spark.yarn.executor.memoryOverhead spark.yarn.driver.memoryOverhead spark.yarn.scheduler.reporterThread.maxFailures
    • yarn.*

      예:

      yarn.scheduler.maximum-allocation-mb yarn.nodemanager.resource.memory-mb
  • 작업이 Spark 2.2.1 또는 Spark 2.4.3에 종속되나요? 그렇다면 작업이 Spark 3.1.1에서 변경된 기능을 사용하는지 확인하여 영향을 확인합니다.

    • https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-22-to-23

      예를 들어 percentile_approx 함수 또는 기존 SparkContext가 있는 경우 SparkSessionSparkSession.builder.getOrCreate()이 있습니다.

    • https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-23-to-24

      예를 들어 array_contains 함수 또는 spark.sql.caseSensitive=true가 있는 CURRENT_DATE, CURRENT_TIMESTAMP 함수입니다.

  • 작업의 추가 jar가 Glue 3.0에서 충돌합니까?

    • AWS Glue 0.9/1.0부터: 기존 AWS Glue 0.9/1.0 작업에 제공된 추가 jar는 Glue 3.0에서 사용할 수 있는 업그레이드된 종속성이나 새로운 종속성으로 인해 클래스 경로 충돌을 일으킬 수 있습니다. AWS Glue 3.0에서 --user-jars-first AWS Glue 작업 파라미터를 사용하거나 종속성을 셰이딩하여 클래스 경로 충돌을 피할 수 있습니다.

    • AWS Glue 2.0부터: AWS Glue 3.0에서 --user-jars-first AWS Glue 작업 파라미터를 사용하거나 종속성을 셰이딩하여 클래스 경로 충돌을 피할 수 있습니다.

  • 작업이 Scala 2.11에 종속되나요?

    • AWS Glue 3.0은 Scala 2.12를 사용하므로 라이브러리가 Scala 2.11에 종속되는 경우 Scala 2.12로 라이브러리를 다시 구축해야 합니다.

  • 작업의 외부 Python 라이브러리가 Python 2.7/3.6에 종속되나요?

    • Python 라이브러리 경로에 egg/wheel/zip 파일을 설정하는 대신 --additional-python-modules 파라미터를 사용합니다.

    • Spark 3.1.1에서 Python 2.7 지원이 제거되었으므로 종속 라이브러리를 Python 2.7/3.6에서 Python 3.7로 업데이트합니다.

AWS Glue 0.9에서 AWS Glue 3.0으로 마이그레이션

마이그레이션할 때 다음 변경 사항에 유의합니다.

  • AWS Glue 0.9은 오픈 소스 Spark 2.2.1을 사용하고 AWS Glue 3.0은 EMR 최적화 Spark 3.1.1을 사용합니다.

    • 몇 가지 Spark 변경만으로도 제거된 기능이 참조되지 않도록 스크립트를 수정해야 할 수 있습니다.

    • 예를 들어 Spark 3.1.1은 Scala 유형이 지정되지 않은 UDF를 사용하지 않지만 Spark 2.2는 이를 허용합니다.

  • AWS Glue 3.0의 모든 작업은 시작 시간이 크게 개선되어 실행됩니다. Spark 작업은 시작 대기 시간이 최대 10분에서 1분으로 단축되어 최소 청구 기간이 10배 더 짧으며 1초 단위로 청구됩니다.

  • AWS Glue 2.0부터 로깅 동작이 변경되었습니다.

  • 부록 A: 중요한 종속성 업그레이드에서 강조 표시된 여러 종속성 업데이트

  • Scala도 2.11에서 2.12로 업데이트되었으며 Scala 2.12는 Scala 2.11과 역호환되지 않습니다.

  • Python 3.7은 Python 스크립트에 사용되는 기본 버전이기도 합니다. AWS Glue 0.9는 Python 2만 사용했기 때문입니다.

    • Python 2.7은 Spark 3.1.1에서 지원되지 않습니다.

    • 추가 Python 모듈을 설치하는 새로운 메커니즘을 사용할 수 있습니다.

  • AWS Glue 3.0은 Apache YARN에서 실행되지 않으므로 YARN 설정이 적용되지 않습니다.

  • AWS Glue 3.0에는 Hadoop 분산 파일 시스템(HDFS)이 없습니다.

  • 기존 AWS Glue 0.9 작업에 제공된 추가 jar는 0.9에서 3.0의 여러 종속성에서 업그레이드가 있었기 때문에 종속성 충돌을 일으킬 수 있습니다. AWS Glue 3.0에서 --user-jars-first AWS Glue 작업 파라미터를 사용하여 클래스 경로 충돌을 피할 수 있습니다.

  • AWS Glue 3.0은 동적 할당을 사용하지 않으므로 ExecutorAllocationManager 지표를 사용할 수 없습니다.

  • AWS Glue 버전 3.0 작업에서는 작업자 수와 작업자 유형을 지정하지만 maxCapacity를 지정하지 않습니다.

  • AWS Glue 3.0은 아직 기계 학습 변환을 지원하지 않습니다.

  • AWS Glue 3.0은 아직 개발 엔드포인트를 지원하지 않습니다.

Spark 마이그레이션 설명서를 참조하세요.

AWS Glue 1.0에서 AWS Glue 3.0으로 마이그레이션

마이그레이션할 때 다음 변경 사항에 유의합니다.

  • AWS Glue 1.0은 오픈 소스 Spark 2.4를 사용하고 AWS Glue 3.0은 EMR 최적화 Spark 3.1.1을 사용합니다.

    • 몇 가지 Spark 변경만으로도 제거된 기능이 참조되지 않도록 스크립트를 수정해야 할 수 있습니다.

    • 예를 들어 Spark 3.1.1은 Scala 유형이 지정되지 않은 UDF를 사용하지 않지만 Spark 2.4는 이를 허용합니다.

  • AWS Glue 3.0의 모든 작업은 시작 시간이 크게 개선되어 실행됩니다. Spark 작업은 시작 대기 시간이 최대 10분에서 1분으로 단축되어 최소 청구 기간이 10배 더 짧으며 1초 단위로 청구됩니다.

  • AWS Glue 2.0부터 로깅 동작이 변경되었습니다.

  • 에서 강조 표시된 여러 종속성 업데이트

  • Scala도 2.11에서 2.12로 업데이트되었으며 Scala 2.12는 Scala 2.11과 역호환되지 않습니다.

  • Python 3.7은 Python 스크립트에 사용되는 기본 버전이기도 합니다. AWS Glue 0.9는 Python 2만 사용했기 때문입니다.

    • Python 2.7은 Spark 3.1.1에서 지원되지 않습니다.

    • 추가 Python 모듈을 설치하는 새로운 메커니즘을 사용할 수 있습니다.

  • AWS Glue 3.0은 Apache YARN에서 실행되지 않으므로 YARN 설정이 적용되지 않습니다.

  • AWS Glue 3.0에는 Hadoop 분산 파일 시스템(HDFS)이 없습니다.

  • 기존 AWS Glue 1.0 작업에 제공된 추가 jar는 1.0에서 3.0의 여러 종속성에서 업그레이드가 있었기 때문에 종속성 충돌을 일으킬 수 있습니다. AWS Glue 3.0에서 --user-jars-first AWS Glue 작업 파라미터를 사용하여 클래스 경로 충돌을 피할 수 있습니다.

  • AWS Glue 3.0은 동적 할당을 사용하지 않으므로 ExecutorAllocationManager 지표를 사용할 수 없습니다.

  • AWS Glue 버전 3.0 작업에서는 작업자 수와 작업자 유형을 지정하지만 maxCapacity를 지정하지 않습니다.

  • AWS Glue 3.0은 아직 기계 학습 변환을 지원하지 않습니다.

  • AWS Glue 3.0은 아직 개발 엔드포인트를 지원하지 않습니다.

Spark 마이그레이션 설명서를 참조하세요.

AWS Glue 2.0에서 AWS Glue 3.0으로 마이그레이션

마이그레이션할 때 다음 변경 사항에 유의합니다.

  • AWS Glue 2.0에 존재하는 모든 기존 작업 파라미터와 주요 기능은 AWS Glue 3.0에 존재합니다.

    • AWS Glue 3.0에서는 Amazon S3에 Parquet 데이터를 쓰기 위한 EMRFS S3 최적화 커미터가 기본값으로 사용됩니다. 그러나 --enable-s3-parquet-optimized-committerfalse로 설정하여 사용하지 않을 수도 있습니다.

  • AWS Glue 2.0은 오픈 소스 Spark 2.4를 사용하고 AWS Glue 3.0은 EMR 최적화 Spark 3.1.1을 사용합니다.

    • 몇 가지 Spark 변경만으로도 제거된 기능이 참조되지 않도록 스크립트를 수정해야 할 수 있습니다.

    • 예를 들어 Spark 3.1.1은 Scala 유형이 지정되지 않은 UDF를 사용하지 않지만 Spark 2.4는 이를 허용합니다.

  • AWS Glue 3.0에는 EMRFS 업데이트, JDBC 드라이버 업데이트, AWS Glue에서 제공하는 Spark 자체에 대한 추가 최적화 기능도 포함되어 있습니다.

  • AWS Glue 3.0의 모든 작업은 시작 시간이 크게 개선되어 실행됩니다. Spark 작업은 시작 대기 시간이 최대 10분에서 1분으로 단축되어 최소 청구 기간이 10배 더 짧으며 1초 단위로 청구됩니다.

  • Python 2.7은 Spark 3.1.1에서 지원되지 않습니다.

  • 부록 A: 중요한 종속성 업그레이드에서 강조 표시된 여러 종속성 업데이트

  • Scala도 2.11에서 2.12로 업데이트되었으며 Scala 2.12는 Scala 2.11과 역호환되지 않습니다.

  • 기존 AWS Glue 2.0 작업에 제공된 추가 jar는 2.0에서 3.0의 여러 종속성에서 업그레이드가 있었기 때문에 종속성 충돌을 일으킬 수 있습니다. AWS Glue 3.0에서 --user-jars-first AWS Glue 작업 파라미터를 사용하여 클래스 경로 충돌을 피할 수 있습니다.

  • AWS Glue 3.0에서는 드라이버/실행기 구성에 대한 Spark 태스크 병렬 처리가 AWS Glue 2.0과는 다른 방식으로 수행되며 성능이 향상되고 사용 가능한 리소스가 더 효율적으로 활용됩니다. AWS Glue 3.0에서는 spark.driver.coresspark.executor.cores가 모두 코어 수로 구성됩니다(표준 및 G.1X 작업자의 경우 4개, G.2X 작업자의 경우 8개). 이러한 구성은 AWS Glue 작업의 작업자 유형이나 하드웨어를 변경하지 않습니다. 이 구성을 사용하여 Spark 애플리케이션의 Spark 태스크 병렬 처리에 맞는 파티션 또는 분할 수를 계산할 수 있습니다.

    일반적으로 작업 성능은 AWS Glue 2.0과 비슷하거나 개선됩니다. 작업 실행 속도가 느린 경우 다음 작업 인수를 전달하여 작업 병렬 처리 성능을 높일 수 있습니다.

    • key: --executor-cores value: <desired number of tasks that can run in parallel>

    • 값은 작업자 유형에 있는 vCPU 수의 2배(G.1X의 경우 8, G.2X의 경우 16, G.4X의 경우 32, G.8X의 경우 64)를 초과해서는 안 됩니다. 이 구성을 업데이트할 때는 주의해야 합니다. 병렬 처리 성능을 높이면 메모리 및 디스크 부담이 커질 뿐 아니라 소스 및 대상 시스템에서 제한이 발생할 수 있으므로 작업 성능에 영향을 미칠 수 있습니다.

  • AWS Glue 3.0에서는 Spark 3.1을 사용하므로 parquet 파일에서 타임스탬프를 로드/저장하는 동작이 변경됩니다. 자세한 내용은 Spark SQL 3.0에서 3.1로 업그레이드를 참조하세요.

    타임스탬프 열이 포함된 parquet 데이터를 읽거나 쓸 때는 다음 파라미터를 설정하는 것이 좋습니다. 이러한 파라미터를 설정하면 Spark 2에서 Spark 3으로 업그레이드하는 동안 AWS Glue 동적 프레임과 Spark 데이터 프레임 둘 다에서 발생하는 달력 비호환성 문제를 해결할 수 있습니다. datetime 값을 있는 그대로 읽으려면 CORRECTED 옵션을 사용하고, 읽는 동안 달력 차이를 기준으로 datetime 값을 다시 지정하려면 LEGACY 옵션을 사용합니다.

    - Key: --conf - Value: spark.sql.legacy.parquet.int96RebaseModeInRead=[CORRECTED|LEGACY] --conf spark.sql.legacy.parquet.int96RebaseModeInWrite=[CORRECTED|LEGACY] --conf spark.sql.legacy.parquet.datetimeRebaseModeInRead=[CORRECTED|LEGACY]

Spark 마이그레이션 설명서를 참조하세요.

부록 A: 중요한 종속성 업그레이드

다음은 종속성 업그레이드입니다.

종속성 AWS Glue 0.9 버전 AWS Glue 1.0 버전 AWS Glue 2.0 버전 AWS Glue 3.0 버전
Spark 2.2.1 2.4.3 2.4.3 3.1.1-amzn-0
Hadoop 2.7.3-amzn-6 2.8.5-amzn-1 2.8.5-amzn-5 3.2.1-amzn-3
Scala 2.11 2.11 2.11 2.12
Jackson 2.7.x 2.7.x 2.7.x 2.10.x
Hive 1.2 1.2 1.2 2.3.7-amzn-4
EMRFS 2.20.0 2.30.0 2.38.0 2.46.0
Json4s 3.2.x 3.5.x 3.5.x 3.6.6
화살표 N/A 0.10.0 0.10.0 2.0.0
AWS Glue 카탈로그 클라이언트 N/A N/A 1.10.0 3.0.0

부록 B: JDBC 드라이버 업그레이드

다음은 JDBC 드라이버 업그레이드입니다.

드라이버 과거 AWS Glue 버전의 JDBC 드라이버 버전 AWS Glue 3.0의 JDBC 드라이버 버전
MySQL 5.1 8.0.23
Microsoft SQL Server 6.1.0 7.0.0
Oracle Database 11.2 21.1
PostgreSQL 42.1.0 42.2.18
MongoDB 2.0.0 4.0.0