昨天(2023-02-22)開始發現公司 Spark 叢集上出現一些任務執行時間過長最後失敗,具體表現包括:
- 大量執行失敗的 Task,最終任務也是失敗的
- 在 Spark Master 管理介面上看到任務的 Driver 地址不是真實 IP 地址,而是一個叫做“host.containers.internal”的主機名;
- Spark 的 worker 節點上能觀察到在不停的建立 Java 程式,然後程式瞬間就結束了;
- 進入 worker 節點的日誌目錄檢視日誌內容,發現異常資訊為連線 “host.containers.internal” 這個地址失敗。
所以顯然當前出現的問題跟“host.containers.internal”有關係。
背景說明:我們的 Spark 叢集是執行在 podman 容器裡的,而且是在非 root 使用者下執行。
經過在網際網路上搜尋,發現這個主機名是容器分配給內部程式用來連線容器所在主機自身的。再進一步檢視 podman 參考文件,按照裡面的說法,僅當容器執行網路模式為 slirp4netns,即帶上引數 "--network=slirp4netns"
時,才會有 host.containers.internal 這個主機名。
但我執行容器時帶的引數是 "--network=host"
啊。
再仔細看文件才知道,slirp4netns 模式是非 root 執行容器的預設模式。按照我遇到的實際情況,難道我給的 "--network=host"
引數並沒有起作用?但是用 podman inspect xxx | grep NetworkMode
命令檢視容器得到的結果是:
"NetworkMode": "host"
不懂,先把這個放到一邊,那麼如何訪問 host.containers.internal 這個主機呢,有兩種方式:
- 引數改為
"--network=slirp4netns:allow_host_loopback=true"
- 修改
/usr/share/containers/containers.conf
,修改或新增配置network_cmd_options
的值為["allow_host_loopback=true"]
在不修改 --network
引數的前提下,我用第二種方法試試。
修改配置檔案然後重啟各個 worker 容器,故障消失,Spark 任務能夠順利執行完成。但還需要觀察一段時間。