SQL Server ビッグ データ クラスター Spark 3 のアップグレード ガイド

適用対象: SQL Server 2019 (15.x)

重要

Microsoft SQL Server 2019 ビッグ データ クラスターのアドオンは廃止されます。 SQL Server 2019 ビッグ データ クラスターのサポートは、2025 年 2 月 28 日に終了します。 ソフトウェア アシュアランス付きの SQL Server 2019 を使用する既存の全ユーザーはプラットフォームで完全にサポートされ、ソフトウェアはその時点まで SQL Server の累積更新プログラムによって引き続きメンテナンスされます。 詳細については、お知らせのブログ記事と「Microsoft SQL Server プラットフォームのビッグ データ オプション」を参照してください。

この記事には、Apache Spark 2.4 ワークロードを Spark バージョン 3.1 に移行するための重要な情報とガイダンスが含まれています。 これは、SQL Server ビッグ データ クラスター CU12 から CU13 以降へのアップグレードを行うために必要です。

SQL Server ビッグ データ クラスター での Apache Spark 3 の概要

累積的な更新プログラム 12 (CU12) までは、ビッグ データ クラスターは 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% です。

ダッシュボードをクリックした [Submit]\(送信\) メニュー

アップグレードのガイダンス

Spark 3 はメジャー リリースであり、破壊的変更が含まれています。 SQL Server universe で確立されたのと同じベスト プラクティスに従うことをお勧めします。

  1. この記事全体を確認します。
  2. 公式の「Apache Spark 3 Migration Guide」(Apache Spark 3 移行ガイド) を確認します。
  3. 現在の環境で、新しいビッグ データ クラスター バージョン CU13 の並列デプロイを実行します。
  4. (省略可能) 新しい azdata HDFS 分散コピー機能を活用して、検証に必要なデータのサブセットを作成します。
  5. アップグレードする前に、Spark 3 で現在のワークロードを検証します。
  6. コードとテーブル定義の戦略で適用される Spark の最適化を再評価します。 Spark 3 では、新しいシャッフル、パーティション分割、およびアダプティブ クエリの実行の拡張機能が導入されています。 これは、以前の意思決定を再評価し、より新しいエンジンのすぐに使える機能を活用してみる絶好の機会です。

クラスターのアップグレード中の動作

クラスターのアップグレード プロセスでは、新しいバージョンと更新された Apache Spark のランタイムを使用して Spark ポッドをデプロイします。 アップグレード後は、Spark 2.4 コンポーネントが不要になります。

構成フレームワークを通じて行われた永続的な構成変更は保持されます。

HDFS に直接読み込まれたユーザー ライブラリと成果物は保持されます。 それでも、これらのライブラリと成果物が Spark 3 と互換性があることを確認してください。

警告

ポッドに直接行われたカスタマイズは失われます。引き続き Spark 3 に適用可能な場合は、必ずそれらを検証して再適用してください。

重大な変更

Spark 3 には 2.4 との完全な下位互換性がなく、破壊的変更は主に次の 3 つのことが原因で発生します。

  • 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 jars に基づいて 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 Migration Guide」(Apache Spark 3 移行ガイド) を確認します。

特に注目すべき点をいくつか以下に示します。

互換性に影響する変更点 アクション
Spark 3 では、spark-submit パラメーターの yarn-clientyarn-clustermodes が削除されました 代わりに、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 ビッグ データ クラスターの概要」を参照してください。