本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
將 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
APIGlueVersion
參數中的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
APIGlueVersion
參數中的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
函數,或存在現有SparkContext
時SparkSession
搭配SparkSession.builder.getOrCreate()
。https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-23-to-24
例如
array_contains
函數,或CURRENT_DATE
、CURRENT_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.cores
和spark.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 |