Posts

Showing posts from January, 2018

Greenplum 增加連線數目後 系統無法順利啟動

筆者: 歐立威 Hank Greenplum 在四版時,增加過多的 max_connection 至1000 以上時確實會遇見問題 (參考Pivotal KB: "https://discuss.pivotal.io/hc/en-us/articles/201462656-GPDB-startup-initilization-failed-with-could-not-create-semaphores-No-space-left-on-device-"), 筆者在五版時有遇過僅從預設 250 增加至 350 便遇見系統無法正常啟動的狀況, 原因可能是Segment Instance較多導致 semaphores 不足 (OS系統的信號燈,用以管控多執行緒環境共用資源的機制), 但問題解決並不複雜,可透過調整OS參數作解決: 筆者透過將 Greenplum 官方建議值調高成底下值便解決問題,詳細能夠調整至多大,還請詢問系統管理員,預設 Greenplum 群集不會和其他系統共用,測試結果調整至底下值並無其他影響發生。 $ vi /etc/sysctl.conf kernel.sem=32000 1024000000 500 32000 ## kernel.sem={ SEMMSL,  SEMMNS,  SEMOPM,  SEMMNI } 調整完畢後記得檢查OS參數是否正確讀取,以免系統又啟動失效還得修復: $ sysctl -p $ sysctl -a | grep sem kernel.sem = 32000 1024000000 500 32000 底下附上遇見問題時的GPDB LOG訊息: 2017-12-26 17:51:15.565211 CST,,,p17519,th1956788096,,,,0,,,seg-1,,,,,"FATAL","XX000","could not create semaphores: No space left on device (pg_sema.c:129)","Failed system call was semget(40010001, 17, 03600).",&q

Greenplum write out with copy command and read with external table

筆者: 歐立威 Hank Greenplum 可以透過 Postgresql 相同的 copy 指令來匯出所需的資料文字檔, 又或是資料文字檔式從其他的系統上(EX: Oracle)匯出得來, 再介由 Greenplum External Table 的方式匯入資料至 Greenplum, 這樣的操作看似簡單平常, 卻是常常遇到資料檔中有不符合預期的字元而導致資料匯入失敗。 這邊我整理了一些最常遇見問題及大家可能搞混的部分做說明, 便可大大減少在資料匯出匯入時所遇到的問題, 而不需要每次都花時間在解這些煩人的字元剖析問題。 狀況一: copy 指令的功能與語法相當直觀且單純,如下: copy (select * from test) to '/tmp/test.txt'; 若未給參數,則預設為 Text Format 且 delimiter 為 \t (Tab鍵), 但這樣會遇到一個問題,如果有欄位裡的值也有 \t, 則會導致在匯入資料時有剖析錯誤, 所以筆者這邊建議大家資料匯出時必須特別選擇 delimiter,要是資料裡絕對不會出現字元。 狀況二: 通常我們匯出資料的源頭,我們根本不了解資料到底有哪些字元, 常常是花了數小時的資料匯出與匯入才會發現有不預期的字元, 所以我們還有一個方法能夠避免掉萬一有 delimiter 的字元出現在資料內的情形, 那就是 quote 這個參數, 筆者這邊習慣直接使用以下語法: copy (select * from test) to '/tmp/test.txt' CSV ; CSV的格式預設便直接使用 delimiter ',' (逗號)及 quote '"' (雙引號), 所以若資料內有逗號字元時,便可因為有雙引號的 quote 而剖析通過。 狀況三: 倘若有資料內容還是有與 quote 相同的字元呢!? 1. 可以把 quote 改為其他字元如: $, ^ 等不常見字元... 2. 若資料內容甚麼奇怪的字元都有,筆者看來這欄位的資料也是些非結構化的資料, 不差這些字元也是能看出欄位意義,所以可使用取代的指令都把它換掉吧 ( :%s/word1/word2/