##### 更新日期: 2025-01-23 ## 📌 Airflow DAG 問題排查:spark 多任務同時執行問題 ### ⚪ 問題描述 1. Airflow 排程跑10幾輪(每輪都跑一個月),都沒問題 2. 但突發一個 task 出現 failed, retried 4 times 還是 failed 3. 手動補跑又成功, 清掉 failed status 重跑也成功 ### ⚪ log #### log-1. KerberosAuthException: failure to login LoginException: java.lang.NullPointerException: invalid null input: name at com.sun.security.auth.UnixPrincipal.<init> at UnixLoginModule.login at org.apache.hadoop.security.UserGroupInformation.login #### log-2. Cannot load filesystem: org.apache.hadoop.fs.viewfs.ViewFileSystem ### ⚪ 問題原因 從 log 可觀察到, Errors 都發生在: 1. SparkSession.read() 2. DataFrameReader 初始化 3. 甚至還沒真正連 JDBC 查 SQL Server 出現: 偶爾 Spark / Hadoop 環境: 初始化 FileSystem / Kerberos / Unix user 時炸掉 問題原因出在: 「多」 個 Airflow tasks 幾乎 「同時」 在 spark-master 上啟動 Spark > UnixPrincipal NullPointerException: 當多個 Spark Driver 同時在同一台機器(spark-master)上啟動時, > 它們會同時調用 Hadoop 的 UserGroupInformation 來獲取目前的 Unix user。 > 如果多個進程爭奪系統資源或暫存檔, > 可能導致 Hadoop 無法正確抓到作業系統的使用者名稱 > FileSystem 初始化失敗: > Spark 在啟動時會加載 core-site.xml 等配置 > 如果多個任務同時讀取/寫入相同的緩存路徑, > 會導致 ClassLoader 衝突或路徑鎖定 ## 📌 修正方式 ### ⚪ Modification-1: Airflow CLI ``` airflow pools set spark_submit_pool 1 "Limit concurrent spark-submit tasks" ``` > 原理:限制併發 (Concurrency Control) > 透過將 pool 設為 spark_submit_pool 並限制 slots=1,強制讓這些任務「排隊」執行 > 這能確保在任何時刻,只有一個 Spark Driver 在進行 Kerberos 認證與環境初始化 > > slots=1:最穩(保證不會同時起多個 Spark driver) > slots=2:稍微快,但還是可能有偶發錯誤 ### ⚪ Modification-2: Airflow DAG ``` convenience_store_to_cassandra = SSHOperator( task_id=f"convenience_store_to_cassandra_{date_label}", ssh_conn_id="ssh_spark_master", command=convenience_store_to_cassandra_cmd, cmd_timeout=60 * 60, get_pty=True, pool="spark_submit_pool", # ✅ 關鍵:把這個 task 丟進 pool(限制一次只跑一個 task) ) ```
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up