Spark ジョブの AWS Glue の AWS Glue バージョン 3.0 への移行 - AWS Glue

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Spark ジョブの AWS Glue の AWS Glue バージョン 3.0 への移行

このトピックでは、AWS Glue バージョン 0.9、1.0、2.0、および 3.0 の間の変更について説明し、Spark アプリケーションと ETL ジョブを AWS Glue 3.0 に移行できるようにします。

この機能を AWS Glue ETL ジョブに使用するには、ジョブを作成するとき、Glue version として 3.0 を選択します。

サポートされる新機能

このセクションでは、AWS Glue バージョン 3.0 の新機能と利点について説明します。

  • Apache Spark 3.1.1 に基づいており、オープンソースの Spark より最適化されています。また、AWS Glue および EMR サービス (アダプティブクエリ実行、ベクトル化されたリーダー、最適化されたシャッフルとパーティション結合など) によって開発されています。

  • MySQL、Microsoft SQL Server、Oracle、PostgreSQL、MongoDB、アップグレードされた Spark ライブラリなど、すべての Glue ネイティブソース用に JDBC ドライバーをアップグレードしました。依存関係は Spark 3.1.1 によって取り込まれています。

  • EMRFS をアップグレードして Amazon S3 アクセスを最適化し、デフォルトで Amazon S3 最適化出力コミッターを有効にしました。

  • パーティションインデックス、プッシュダウン述語、パーティションリスト、アップグレードされた Hive メタストアクライアントにより、Data Catalog アクセスを最適化しました。

  • セルレベルのフィルタリングとデータレイクトランザクションを備えた管理されたカタログテーブル用の Lake Formation と統合しました。

  • Spark 3.1.1 では、Spark エグゼキュターのメモリメトリクスと Spark 構造化ストリーミングメトリクスを含む新しい Spark UI が使用できます。

  • スタートアップレイテンシーが短縮され、AWS Glue 2.0 と同様に、ジョブ全体の完了時間と対話性が改善されます。

  • Spark ジョブは、1 秒単位で課金され、最小課金時間は 1/10 になります。例えば、AWS Glue 2.0 と同様、最小 10 分が最小 1 分になります。

AWS Glue 3.0 に移行するためのアクション

既存のジョブについては、ジョブ設定で、Glue version を以前のバージョンから Glue 3.0 に変更します。

  • コンソールでは、Glue versionSpark 3.1, Python 3 (Glue Version 3.0) or Spark 3.1, Scala 2 (Glue Version 3.0) を選択します。

  • AWS Glue Studio では、Glue versionGlue 3.0 - Supports spark 3.1, Scala 2, Python 3 を選択します。

  • API では、UpdateJob API の GlueVersion パラメータで 3.0 を選択します。

新しいジョブについては、ジョブを作成するときに Glue 3.0 を選択します。

  • コンソールでは、Glue versionSpark 3.1, Python 3 (Glue Version 3.0) or Spark 3.1, Scala 2 (Glue Version 3.0) を選択します。

  • AWS Glue Studio では、Glue versionGlue 3.0 - Supports spark 3.1, Scala 2, Python 3 を選択します。

  • API では、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 が存在する場合、SparkSession.builder.getOrCreate() を使用した SparkSession

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

      例えば、array_contains 関数、または spark.sql.caseSensitive=true の場合の CURRENT_DATECURRENT_TIMESTAMP 関数。

  • ジョブの追加の jar に Glue 3.0 で競合がありますか。

    • AWS Glue 0.9/1.0 から: 既存の AWS Glue 0.9/1.0 ジョブに追加の jar が使用されていると、Glue 3.0 で利用可能なアップグレードまたは新しい依存関係により、クラスパスの競合が発生する可能性があります。--user-jars-first AWS Glue ジョブパラメータを使用するか、依存関係をシェーディングすることによって、AWS Glue 3.0 でのクラスパスの競合を避けることができます。

    • AWS Glue 2.0 から: この場合も、 --user-jars-first AWS Glue ジョブパラメータを使用するか、依存関係をシェーディングすることによって、AWS Glue 3.0 でのクラスパスの競合を避けることができます。

  • ジョブが 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 のすべてのジョブの実行におけるスタートアップ時間は、大幅に改善されています。スタートアップのレイテンシーが最大 10 分から最大 1 分になるため、Spark ジョブは 1 秒単位で課金され、最小課金時間は 1/10 になります。

  • AWS Glue 2.0 以降、ログ記録の動作が変更されています。

  • 依存関係の更新については、付録 A: 注目すべき依存関係のアップグレード を参照してください。

  • Scala も 2.11 から 2.12 に更新されており、Scala 2.12 には Scala 2.11 との下位互換性がありません。

  • また、AWS Glue 0.9 は Python 2 しか利用していませんでしたが、Python スクリプトで使用されるデフォルトのバージョン は Python 3.7 になりました。

    • Python 2.7 は、Spark 3.1.1 ではサポートされていません。

    • 追加の Python モジュールをインストールする新しいメカニズムが利用可能です。

  • AWS Glue 3.0 は Apache YARN では実行されないため、YARN の設定は適用されません。

  • AWS Glue 3.0 には、Hadoop Distributed File System (HDFS) はありません。

  • 既存の AWS Glue 0.9 ジョブで使用されている追加の jar は、3.0 でいくつかの依存関係が 0.9 からアップグレードされたため、依存関係の競合を引き起こす可能性があります。--user-jars-first AWS Glue ジョブパラメータによって、AWS Glue 3.0 でのクラスパスの競合を避けることができます。

  • 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 のすべてのジョブの実行におけるスタートアップ時間は、大幅に改善されています。スタートアップのレイテンシーが最大 10 分から最大 1 分になるため、Spark ジョブは 1 秒単位で課金され、最小課金時間は 1/10 になります。

  • AWS Glue 2.0 以降、ログ記録の動作が変更されています。

  • いくつかの依存関係の更新の要点については、次を参照してください。

  • Scala も 2.11 から 2.12 に更新されており、Scala 2.12 には Scala 2.11 との下位互換性がありません。

  • また、AWS Glue 0.9 は Python 2 しか利用していませんでしたが、Python スクリプトで使用されるデフォルトのバージョン は Python 3.7 になりました。

    • Python 2.7 は、Spark 3.1.1 ではサポートされていません。

    • 追加の Python モジュールをインストールする新しいメカニズムが利用可能です。

  • AWS Glue 3.0 は Apache YARN では実行されないため、YARN の設定は適用されません。

  • AWS Glue 3.0 には、Hadoop Distributed File System (HDFS) はありません。

  • 既存の AWS Glue 1.0 ジョブで使用されている追加の jar は、3.0 でいくつかの依存関係が 1.0 からアップグレードされたため、依存関係の競合を引き起こす可能性があります。--user-jars-first AWS Glue ジョブパラメータによって、AWS Glue 3.0 でのクラスパスの競合を避けることができます。

  • 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 に存在します。

    • Parquet データを Amazon S3 に書き込むための EMRFS S3 最適化コミッターは、AWS Glue 3.0 ではデフォルトで有効になっています。ただし、--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 のすべてのジョブの実行におけるスタートアップ時間は、大幅に改善されています。スタートアップのレイテンシーが最大 10 分から最大 1 分になるため、Spark ジョブは 1 秒単位で課金され、最小課金時間は 1/10 になります。

  • Python 2.7 は、Spark 3.1.1 ではサポートされていません。

  • 依存関係の更新については、付録 A: 注目すべき依存関係のアップグレード を参照してください。

  • Scala も 2.11 から 2.12 に更新されており、Scala 2.12 には Scala 2.11 との下位互換性がありません。

  • 既存の AWS Glue 2.0 ジョブで使用されている追加の jar は、3.0 でいくつかの依存関係が 2.0 からアップグレードされたため、依存関係の競合を引き起こす可能性があります。--user-jars-first AWS Glue ジョブパラメータによって、AWS Glue 3.0 でのクラスパスの競合を避けることができます。

  • AWS Glue 3.0 は AWS Glue 2.0 と比較すると、ドライバー/エグゼキューターの設定に対して Sparkタスクの並列処理が異なり、パフォーマンス向上と利用可能なリソースをより有効に活用できます。spark.driver.coresspark.executor.cores の両方とも、AWS Glue 3.0 のコア数 (スタンダードで4、および G.1X ワーカー、G.2X ワーカーで 8) に設定されています。これらの構成は、AWS Glue ジョブのためのワーカータイプやハードウェアを変更するものではありません。これらの構成を利用して、Spark アプリケーションの Spark タスク並列性と一致するパーティションまたは分割の数を計算できます。

    一般的に、ジョブのパフォーマンスは AWS Glue 2.0 と同等かそれ以上になります。ジョブの実行速度が遅い場合は、次のジョブ引数を渡すことでタスクの並列処理を増やすことができます。

    • キー: --executor-cores 値: <並列に実行可能な目的のタスク数>

    • この値は、ワーカータイプの vCPU の数の 2 倍を超えないようにします。G.1X では 8、G.2X では 16、G.4X では 32、G.8X では 64 です。並列処理が増えるとメモリとディスクに負荷がかかり、ソースシステムとターゲットシステムがスロットリングされ、ジョブのパフォーマンスに影響する可能性があるため、この構成を更新する場合は注意が必要です。

  • AWS Glue 3.0は Spark 3.1 を使用しており、パーケットファイルから、またはパーケットファイルへのタイムスタンプの読み込み/保存に、動作が変更されています。詳細は「Upgrading from Spark SQL 3.0 to 3.1」を参照してください。

    タイムスタンプ列を含むパーケットデータを読み書きする場合は、次のパラメータを設定することをお勧めします。これらのパラメータを設定すると、Spark 2 から Spark 3 へのアップグレード中に発生するカレンダーの非互換性の問題を、AWS Glue ダイナミックフレームとパークデータフレームの両方で解決することができます。CORRECTED オプションは、datetime 値をそのまま読み込むために使用し、LEGACY オプションは読み込む際にカレンダーの違いを考慮して datetime 値をリベースするために使用します。

    - 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
Arrow 該当なし 0.10.0 0.10.0 2.0.0
AWS Glue カタログクライアント 該当なし 該当なし 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