天天看點

pgpool(3.6.5)的一個巨坑

在現場環境中突然發現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版本修複了此問題:

pgpool(3.6.5)的一個巨坑

是以解決方案,就是采用3.6.6版本的pgpool。