SQL Server 빅 데이터 클러스터 Spark 3을 업그레이드하는 방법

적용 대상: SQL Server 2019(15.x)

중요

Microsoft SQL Server 2019 빅 데이터 클러스터 추가 기능이 사용 중지됩니다. SQL Server 2019 빅 데이터 클러스터에 대한 지원은 2025년 2월 28일에 종료됩니다. Software Assurance를 사용하는 SQL Server 2019의 모든 기존 사용자는 플랫폼에서 완전히 지원되며, 소프트웨어는 지원 종료 시점까지 SQL Server 누적 업데이트를 통해 계속 유지 관리됩니다. 자세한 내용은 공지 블로그 게시물Microsoft SQL Server 플랫폼의 빅 데이터 옵션을 참조하세요.

이 문서에는 Apache Spark 2.4 워크로드를 Spark 버전 3.1로 마이그레이션하기 위한 중요한 정보 및 지침이 포함되어 있습니다. 이는 SQL Server 빅 데이터 클러스터 CU12에서 CU13 이상으로 업그레이드하는 데 필요합니다.

SQL Server 빅 데이터 클러스터 Apache Spark 3 소개

CU12(누적 업데이트 12)까지 빅 데이터 클러스터는 Apache Spark 2.4 라인에 의존하였으며 이는 2021년 5월에 수명이 종료되었습니다. Apache Spark 엔진에서 가져온 빅 데이터 및 기계 학습 기능의 지속적인 개선에 대한 노력과 마찬가지로 CU13에서는 Apache Spark 버전 3.1.2의 현재 릴리스를 가져오게 되었습니다.

성능 기준선

이 새 버전의 Apache Spark는 빅 데이터 처리 워크로드에 대한 성능 이점을 제공합니다. 테스트에서는 참조 TCP-DS 10TB 워크로드를 사용하여 런타임을 4.19시간에서 2.96시간으로 줄일 수 있었으며, 추가 애플리케이션 최적화 없이 SQL Server 빅 데이터 클러스터에서 동일한 하드웨어 및 구성 프로필을 사용하여 엔진을 전환함으로써 29.36% 향상되었습니다. 개별 쿼리 런타임의 향상된 평균은 36%입니다.

대시보드를 클릭하여 제출 메뉴

업그레이드 지침

Spark 3은 주요 릴리스이며 주요 변경 내용을 포함합니다. SQL Server Universe에서 수립된 모범 사례와 마찬가지로 다음은 권장사항입니다.

  1. 이 문서를 완전히 검토합니다.
  2. 공식 Apache Spark 3 마이그레이션 가이드를 검토합니다.
  3. 현재 환경으로 새 빅 데이터 클러스터 버전 CU13의 병렬 배포를 수행합니다.
  4. (선택 사항) 새 azdata HDFS 분산 복사 기능을 활용하여 유효성 검사에 필요한 데이터의 하위 집합을 만듭니다.
  5. 업그레이드하기 전에 Spark 3을 사용하여 현재 워크로드를 검증합니다.
  6. 코드 및 테이블 정의 전략에서 적용된 Spark 최적화를 재평가합니다. Spark 3에는 새로운 순서 섞기, 분할 및 적응형 쿼리 실행 기능 향상이 포함되었습니다. 이전 결정을 재평가하고 준비 없이 바로 사용할 수 있는 최신 엔진 기능을 활용할 수 있는 좋은 기회입니다.

클러스터 업그레이드는 어떻게 진행되나요?

클러스터 업그레이드 프로세스는 새 버전과 새로 고친 Apache Spark용 런타임을 사용하여 Spark Pod를 배포합니다. 업그레이드 후에는 Spark 2.4 구성 요소가 더 이상 존재하지 않게 됩니다.

구성 프레임워크를 통해 적용된 영구 구성 변경 내용은 유지됩니다.

HDFS에 직접 로드된 사용자 라이브러리 및 아티팩트는 유지됩니다. 그러나 해당 라이브러리 및 아티팩트와 Spark 3이 호환되는지 확인해야 합니다.

Warning

Pod에 직접 수행한 사용자 지정은 손실되며, Spark 3에 계속 적용되는 경우 유효성을 검사하고 다시 적용해야 합니다.

호환성이 손상되는 변경

Spark 3은 2.4와 이전 버전까지 완전히 호환되지는 않으며, 호환성이 손상되는 변경은 기본적으로 다음 세 부분으로 인해 발생합니다.

  • Spark 3에서 사용하는 Scala 2.12는 Spark 2.4에서 사용하는 Scala 2.11과 호환되지 않습니다.
  • Spark 3 API 변경 및 사용 중단
  • Apache Spark용 SQL Server 빅 데이터 클러스터 런타임 라이브러리 업데이트

Spark 3에서 사용하는 Scala 2.12는 Scala 2.11과 호환되지 않습니다.

Scala 2.11 jar를 기반으로 Spark 작업을 실행하는 경우 Scala 2.12를 사용하여 다시 빌드해야 합니다. Scala 2.11 및 2.12는 대부분 원본과 호환되지만 이진 호환되지는 않습니다. 자세한 내용은 Scala 2.12.0을 참조하세요.

다음과 같은 변경이 필요합니다.

  1. 모든 Scala 종속성에 대해 Scala 버전을 변경합니다.
  2. 모든 Spark 종속성에 대해 Spark 버전을 변경합니다.
  3. spark-sql-kafka-0-10 등의 외부 종속성을 제외하고 범위를 제공한 모든 Spark 종속성을 변경합니다.

다음은 아래와 같은 샘플 pom.xml입니다.

  <properties>
    <spark.version>3.1.2</spark.version>
    <scala.version.major>2.12</scala.version.major>
    <scala.version.minor>10</scala.version.minor>
    <scala.version>${scala.version.major}.${scala.version.minor}</scala.version>
  </properties>
 
  <dependencies>
 
    <dependency>
      <groupId>org.scala-lang</groupId>
      <artifactId>scala-library</artifactId>
      <version>${scala.version}</version>
      <scope>provided</scope>
    </dependency>
 
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-core_${scala.version.major}</artifactId>
      <version>${spark.version}</version>
     <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-sql_${scala.version.major}</artifactId>
      <version>${spark.version}</version>
      <scope>provided</scope>
    </dependency>
 
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-sql-kafka-0-10_${scala.version.major}</artifactId>
      <version>${spark.version}</version>
    </dependency>
    
  </dependencies>

Spark 3 API 변경 및 사용 중단

모든 API 변경 내용을 자세히 설명하는 공식 Apache Spark 3 마이그레이션 가이드를 검토하세요.

캡처된 몇 가지 하이라이트는 다음과 같습니다.

주요 변경 내용 작업
spark-submit 매개 변수 yarn-clientyarn-clustermodes가 Spark 3에서 제거됨 대신 spark-submit --master yarn --deploy-mode client 또는 --deploy-mode cluster를 사용하십시오.
자세한 내용은 https://spark.apache.org/docs/latest/running-on-yarn.html 참조
HiveContext 클래스가 제거됨 대신 SparkSession.builder.enableHiveSupport()를 사용하세요.
TRIM 메서드에서 인수 순서가 반대로 바뀜 TRIM(trimStr, str) 대신 TRIM(str, trimStr) 사용
Scala 2.12로의 업그레이드로 인해 DataStreamWriter.foreachBatch는 Scala 프로그램과 호환되는 원본이 아닙니다. Scala 함수와 Java 람다를 구분하도록 Scala 소스 코드를 업데이트합니다.

Apache Spark용 SQL Server 빅 데이터 클러스터 런타임 라이브러리 업데이트

Apache Spark 사양에 대한 SQL Server 빅 데이터 클러스터 런타임에서 설명한 대로 CU13 릴리스에서 모든 기본 Python, R 및 Scala 라이브러리가 업데이트되었습니다. 또한 준비 없이 사용할 수 있는 환경을 제공하기 위해 많은 라이브러리가 추가되었습니다.

  1. 워크로드가 최신 라이브러리 집합에서 작동하는지 확인합니다.
  2. 사용자 지정 로드된 라이브러리가 이제 기본 패키지 기준의 일부인지 검토하고, 작업 사양을 조정하여 작업에서 제공된 라이브러리를 사용할 수 있도록 사용자 지정 라이브러리를 제거합니다.

질문과 대답

이상한 java.lang.NoSuchMethodError 또는 java.lang.ClassNotFoundException을 해결하는 방법

이 오류의 원인은 Spark 또는 Scala 버전 충돌일 가능성이 높습니다. 아래 내용을 다시 확인하고 프로젝트를 다시 빌드합니다.

  1. 모든 Scala 버전이 업데이트되었는지 확인합니다.
  2. 모든 Spark 종속성이 올바른 Scala 버전 및 Spark 버전으로 업데이트되었는지 확인합니다.
  3. spark-sql-kafka-0-10을 제외한 모든 Spark 종속성에 범위가 제공되었는지 확인합니다.

일정 모드 변경으로 인한 SparkUpgradeException

Spark 3.0 일정 모델에 변경 내용이 있습니다. Spark SQL에서 일정 열을 작성할 때 다음과 같은 예외가 표시될 수 있습니다.

Caused by: org.apache.spark.SparkUpgradeException: 
You may get a different result due to the upgrading of Spark 3.0:
writing dates before 1582-10-15 or timestamps before 1900-01-01T00:00:00Z into Parquet INT96 files can be dangerous,
as the files may be read by Spark 2.x or legacy versions of Hive later, 
which uses a legacy hybrid calendar that is different from Spark 3.0+'s Proleptic Gregorian calendar. 
See more details in SPARK-31404.
You can set spark.sql.legacy.parquet.int96RebaseModeInWrite to 'LEGACY' to 
rebase the datetime values w.r.t. the calendar difference during writing, to get maximum interoperability. 
Or set spark.sql.legacy.parquet.int96RebaseModeInWrite to 'CORRECTED' to 
write the datetime values as it is, if you are 100% sure that the written files 
will only be read by Spark 3.0+ or other systems that use Proleptic Gregorian calendar.

해결 방법: 위에서 설명한 대로 spark.sql.legacy.parquet.int96RebaseModeInWrite 구성을 LEGACY 또는 CORRECTED로 설정합니다. 다음은 PySpark 코드에서 가능한 솔루션입니다.

spark.conf.set("spark.sql.legacy.parquet.int96RebaseModeInWrite","CORRECTED")

다음 단계

자세한 내용은 SQL Server 빅 데이터 클러스터 소개를 참조하세요.