---
# System prepended metadata

title: Airflow DAG 問題排查：spark 多任務同時執行問題

---

##### 更新日期: 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）
)
```