將 AWS Glue for Spark 任務遷移到 AWS Glue 3.0 版 - AWS Glue

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

將 AWS Glue for Spark 任務遷移到 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 服務開發的最佳化,例如調整式查詢執行、向量化讀取器,以及最佳化的隨機和分割區合併。

  • 升級 JDBC 驅動程式的所有 Glue 原生來源,包括 MySQL、Microsoft SQL Server、Oracle、PostgreSQL、MongoDB 和由 Spark 3.1.1 帶來的升級 Spark 程式庫和相依性。

  • 透過升級的 EMRFS 最佳化 Amazon S3 存取,並預設啟用 Amazon S3 最佳化的輸出提交器。

  • 最佳化 Data Catalog 存取與分割區索引、下推述詞、分割區清單,以及升級的 Hive 中繼存放區用戶端。

  • 與 Lake Formation 整合,以控管的目錄資料表具有儲存格層級篩選和資料湖交易。

  • 使用新的 Spark 執行器記憶體指標和 Spark 結構化串流指標,改善 Spark 3.1.1 的 Spark UI 體驗。

  • 減少啟動延遲,可改善整體任務完成時間和互動性,類似於 AWS Glue 2.0。

  • Spark 任務以 1 秒的增量計費,最短計費期間縮短 10 倍,從最短 10 分鐘到最短 1 分鐘,類似於 AWS Glue 2.0。

遷移至 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

  • 在 API 中,選擇 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

  • 在 API 中,選擇 CreateJob API GlueVersion 參數中的 3.0

若要查看 AWS Glue3.0 的 Spark 事件日誌,請使用 CloudFormation 或 Docker 啟動 Glue 3.0 的升級 Spark 歷史伺服器。

遷移檢查清單

檢閱此檢查清單以進行遷移。

  • 您的任務是否依賴於 HDFS ? 如果是,請嘗試用 S3 替換 HDFS。

    • 在任務指令碼程式碼中搜尋以 hdfs:/// 開頭的檔案系統路徑,作為 DFS 路徑。

    • 檢查您的預設檔案系統沒有配置 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 函數,或存在現有 SparkContextSparkSession 搭配 SparkSession.builder.getOrCreate()

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

      例如 array_contains 函數,或 CURRENT_DATECURRENT_TIMESTAMP 函數搭配 spark.sql.caseSensitive=true

  • 您的任務額外的 jars 在 Glue 3.0 中衝突嗎?

    • 從 AWS Glue 0.9/1.0:現有 AWS Glue 0.9/1.0 任務中提供的任何額外 jars 可能會導致 classpath 衝突,因為 Glue 3.0 中的升級或新的相依性。您可以避免 AWS Glue 3.0 與 --user-jars-first AWS Glue 任務參數的 classpath 衝突或透過陰影相依性。

    • 從 AWS Glue 2.0:您仍然可以避免 AWS Glue 3.0 與 --user-jars-first AWS Glue 任務參數的 classpath 衝突或透過陰影相依性。

  • 您的任務是否依賴於 Scala 2.11?

    • AWS Glue 3.0 使用 Scala 2.12,所以如果您的程式庫依賴於 Scala 2.11,您需要用 Scala 2.12 重建您的程式庫。

  • 您任務的外部 Python 程式庫是否依賴於 Python 2.7/3.6?

    • 使用 --additional-python-modules 參數,而不是在 Python 程式庫路徑中設定 egg/wheel/zip 檔案。

    • 將相依程式庫從 Python 2.7/3.6 更新為 Python 3.7,因為 Spark 3.1.1 刪除了 Python 2.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 任務將以 1 秒的增量計費,最小計費持續時間縮短 10 倍,因為啟動延遲將從最大 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 任務中提供的任何額外 jars 可能會帶來衝突的相依性,因為 3.0 中的幾個相依性已從 0.9 升級。您可以避免 AWS Glue 3.0 與 --user-jars-first AWS Glue 任務參數的 classpath 衝突。

  • 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 任務將以 1 秒的增量計費,最小計費持續時間縮短 10 倍,因為啟動延遲將從最大 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 任務中提供的任何額外 jars 可能會帶來衝突的相依性,因為 3.0 中的幾個相依性已從 1.0 升級。您可以避免 AWS Glue 3.0 與 --user-jars-first AWS Glue 任務參數的 classpath 衝突。

  • 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 中啟用將 Parquet 資料寫入 Amazon S3 的 EMRFS S3 最佳化遞交者。不過,您仍然可以透過將 --enable-s3-parquet-optimized-committer 設定為 false 來停用它。

  • 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 任務將以 1 秒的增量計費,最小計費持續時間縮短 10 倍,因為啟動延遲將從最大 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 任務中提供的任何額外 jars 可能會帶來衝突的相依性,因為 3.0 中的幾個相依性已從 2.0 升級。您可以避免 AWS Glue 3.0 與 --user-jars-first AWS Glue 任務參數的 classpath 衝突。

  • 與 AWS Glue 2.0 相比,AWS Glue 3.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,後者將行為變更為從 parquet 檔案載入時間戳記以及將時間戳記儲存至此類檔案。有關更多詳細資訊,請參閱從 Spark SQL 3.0 升級到 3.1

    建議在讀取/寫入包含時間戳記資料行的 parquet 資料時設定以下參數。針對 AWS Glue 動態框架和 Spark 資料框架,設定這些參數可以解決從 Spark 2 升級到 Spark 3 期間發生的行事曆不相容問題。使用「更正」選項原樣讀取 datetime 值;使用「舊式」選項可以在讀取過程中針對行事曆差異重新設定 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 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 資料庫 11.2 21.1
PostgreSQL 42.1.0 42.2.18
MongoDB 2.0.0 4.0.0