pgpool(3.6.5)的一個巨坑
阿新 • • 發佈:2018-12-25
在現場環境中突然發現spark application卡死,而卡死的狀態又與普通的阻塞不同,看起來就是執行了一部分job之後,後面的Job都沒有提交了。
而更為詭異的是,如果把指向不用pgpool,而直接用一個普通的pg庫,整個spark application是正常的。
此時猜測可能問題出在driver端程式碼上,發現有一個類似這樣的程式碼:
df.write().jdbc(...)
主要就是將df寫成一張pg表。
查看了spark原始碼也很簡單:
1.判斷表是否存在(使用語句為select * from 表名 limit 1)
2.建立表
3.寫資料
檢視pg_stat_activity,發現是有query=select * from 表名 limit 1 語句的,處於idle狀態。
IDEA遠端連spark單步除錯,發現卡住的正是第一步:
select * from 表名 limit 1
不用spark,而使用普通的jdbc執行這句話,也存在卡死的狀況。
需要說明的是,查詢的這種表是不存在的,也就是說這句話是會丟擲異常的。不會是pg丟擲了異常,而pgpool未能正確的處理此異常吧?
事實證明,pgpool確實是在處理error message時有問題,9月5日釋出的3.6.6版本修復了此問題: