關於greenPlum中通過gpfdist導入數據不成功的問題與原因


摘自:http://blog.sina.com.cn/s/blog_79d599dc0100qfgz.html

先前日志里面應該講過一個對greenPlum數據庫通過copy導入數據到數據庫出現錯誤的原因。剛才查了一下日志,發現竟然沒有。

干脆借這個機會一起再寫一次,也算是給自己的回顧吧。

 

對於greenPlum數據庫,在BI的ETL應用中,把文件導入數據庫是構建數據倉庫的必經之路。對於GP(greenPlum后簡稱GP)有兩種

導入數據庫的方式:一是通過gpfdist創建外部表;二是通過copy命令;

 

前段時間寫了一個程序用於把數據導入到GP中,最初版本只提供了gpfdist方式導入,后因現場人員對gpfdist不熟悉,說部署起來

太麻煩,要求提供更簡便的方式,於是修改程序兩點:一是增加一種通過copy方式導入,二是程序里面自動的啟動gpfdist服務,而

不用維護人員手工啟動。以增加程序的可維護性。

 

先說第一個問題:就是碰到通過copy導入數據的時候報錯,印象中報的是文件沒有操作的權限。根據報出來的錯誤信息去查。

首先查是否可以讀取該文件,發現是可以讀取的。但不知道為什么就是報文件沒有操作權限。

通過GP的文檔,詳細看了后,發現里面指的可操作的權限指的是連接數據庫的用戶,我在本機上的用戶是gpadmin,但是連接數據庫

的是另外的一個用戶cluster,重新查看文件的權限,該文件也是其他用戶可讀的,但還是報錯。實在沒辦法,只有把文件給了777權限,

本想這下總該可以啦,但實際上,還是報錯。同樣的問題。

最后只得看着文件想,終於,因為linux下面,文件有沒有權限可操作,還跟文件所在的目錄有關系,如果一個文件是所有權限都有的,

但是文件所在的目錄或上層目錄對某個用戶沒有操作,那么該用戶同樣不可以操作該文件。再去查文件所在的目錄,果然,對cluster

用戶來說,該目錄沒有操作權限,給了可執行權限后,再去copy導數,成功。

 

上面第一點總的來說通過copy導數有兩點:

一、文件的權限是對連接數據庫的用戶來講的;

二、文件的權限與linux平台是相關的。

要保證以上兩點,copy才能對文件進行操作。

 

昨天碰到了第二個問題是關於gpfdist導數的。

以前也碰到過gpfdist導數不成功的問題,以前的問題主要有兩點:

1、gpfdist服務指定的目錄不對。

2、gpfdist服務沒啟動(由於某原因關閉了)

這兩個問題都好解決,而且也好查,第一點一般會報文件不存在;第二點一般報 error code = 115 (Operation now in progress) 

而且也好檢查。

昨天碰到的情況是gpfdist導數失敗后,日志里沒報什么信息出來,如下:

ERROR:  connection with gpfdist failed for gpfdist://133.37.253.111:8081/gpdata/test_gpfdist.txt. 

effective url:  http://133.37.253.111:8081/gpdata/test_gpfdist.txt. 

(url.c:258)  (seg7 slice1 sdw2-4:50004 pid=10033)],

error sql[select * from public.test_ext],

sql state[01000],variable info[]

 

根據以上錯誤,根本看不出有啥問題。首先目錄肯定是對的,因為以前跑成功過。

首先就着以前的思路,去想是否是目錄沒有權限或是目錄不存在呢?去現場機器上核查,目錄是存在的,而且也是有權限的這點確認。

再就是想是否是gpfdist服務過早退出或是啟動失敗了呢?於是手工啟動服務,然后再去調用,發現還是失敗。

兩種情況都不是。

把錯誤信息拿到google或baidu里面查,也查不出什么東西。可能主要還是因為里面沒報錯誤信息出來。

沒辦法,只有再次去查看一下 gpfdist命令的用戶 。

輸入 gpfdist --help

一個一個參數的查。目錄是對的,后面的端口呢?有沒有被占用。

輸入netstat -ltn | grep port

發現端口是正常的,沒有被占用。

再往后面就是日志文件,一查,原來日志文件的目錄不存在,重新要求新建日志目錄,再次運行 。

本以為可以了,沒想到,還是報錯。報同樣的錯誤。

 

這下徹底沒轍了。

 

於是找了另一台機器把所有的代碼拿過來試跑一次,可以跑通。說明代碼肯定是沒問題。那么問題就是出在環境上面啦。

 

重新去讀一下GP的手冊,發現里面有一句話:

For readable external tables ,gpfdist parses and serves data files evenly to all the segment instances in the Greenplum Database

system wheren users SELECT from the external table.

意思大概就是,要是讀取外部表,那么gpfdist服務器上的文件就必須被所有的子節點能訪問。

 

因現場有兩個節點,所以再回去看看節點的情況,通過gpfdist創建的服務文件是通過IP來創建的,該IP是一個外網的IP,而子節點是在內網上面的,

不能訪問到外網的IP,重新把IP修改為內網IP后,重新導入,成功。

 

總結上面第二個問題,通過gpfdist導入數據的時候。需要以下三種:

1、gpfdist目錄必須創建對;

2、gpfdist必須啟動后;

3、所有子節點的機器要能通過gpfdist所指定的地址對GP服務文件進行訪問。也就是能訪問GPFDIST服務上面外部表文件的機器。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM