gpload組件使用詳情

gpload是Greenplum數據庫提供的數據加載工具,同時支持開源Greenplum、Pivotal Greenplum及其他基於開源Greenplum的衍生版本(除非這個版本想不開,把這個功能閹割了🤦‍♂️)。

gpload屬於客戶端工具,類似於Oracle的SQL*Loader,如果服務器上已經安裝了Greenplum的Server包,默認已經包含了gpload工具;另外您也可以將gpload的客戶端(通常是從Pivotal官方取得的)安裝到任意服務器上,安裝完成後,需要打通該服務器與Greenplum所有服務器之間的網絡。

從原理上講,gpload屬於對gpfdist服務的封裝,在執行gpload入庫時,大概執行的步驟爲:啓動gpfdist服務 -> 創建外部表 -> 將數據從外部表插入到內部表 -> 刪除外部表 -> 關閉gpfdist服務。

1.gpload安裝

依賴軟件

  • gpload使用python語言編寫的,所以會依賴python,當前與Greenplum對應的版本爲python 2.7,還沒有兼容到3.x版本;
  • 另外解析YAML文件時,使用了Python的PyYAML包,底層依賴libYAML,獨立安裝時需要自行注意

安裝軟件

軟件的安裝這裏不詳細介紹了,通常分爲兩種安裝方式:

  • 採用Greenplum完整安裝包安裝,不管是bin文件還是rpm文件,都會自行安裝所有依賴,具體步驟請參考官方文檔;
  • 採用客戶端包,名稱類似於[greenplum-loaders-x.x.x-build-2-RHEL7-x86_64.zip],這種客戶端提供windows版本安裝包,通常可以一鍵執行安裝;

設置環境變量

軟件安裝完成後,需要設置以下環境變量(以RHEL7爲例):

# 在.bash_profile中添加Greenplum相關環境變量:
export PGDATABASE=postgres
export PGHOST=127.0.0.1
export PGPORT=5432
export PGUSER=gpadmin
export PGPASSWORD=gpadmin

2.gpload使用

準備測試環境

我們通過搭建一個簡單模擬環境的方式來簡單模擬gpload的使用,首先您的環境中需要已經安裝完成Greenplum任意一個版本的數據庫,然後創建數據庫用內部表T1:

[gpadmin@allinone ~]$ psql
psql (9.4.24)
Type "help" for help.

postgres=# create table t1(id int,name text,cust_id text,create_time timestamp without time zone);

創建本地入庫用的csv文件:

[gpadmin@allinone ~]$ cat test.csv
1|A|111
2|B|222
3|C|333
4|D|444

創建對應YAML文件

VERSION: 1.0.0.1 # 默認不修改
DATABASE: postgres # 對應入庫的數據庫名
USER: gpadmin # 通常都是gpadmin
HOST: 127.0.0.1 # Greenplum Master IP地址
PORT: 5432 # Greenplum Master 端口號
GPLOAD:
  INPUT:
    - SOURCE:
        LOCAL_HOSTNAME:
          - localhost # 當前安裝了gpload客戶端的主機IP
        PORT: 22222 # gpload啓動使用的端口
        FILE:
          - /home/gpadmin/test.csv # csv文件絕對路徑
    - COLUMNS:
        - ID: int # 對應外部表的數據類型,通常和數據庫內部表一樣
        - NAME: text # 對應外部表的數據類型,通常和數據庫內部表一樣
        - CUST_ID: text # 對應外部表的數據類型,通常和數據庫內部表一樣
    - FORMAT: csv # 格式
    - DELIMITER: '|' # csv文件分隔符
    - QUOTE: '"' # 字符串逃逸符
    - HEADER: false # csv不帶表頭,默認第一行不忽略
    - ERROR_LIMIT: 50 # 錯誤上線,達到50後執行失敗
    - LOG_ERRORS: true # 存儲入庫錯誤
  OUTPUT: # 數據庫內部表的映射關係
    - TABLE: t1 # 內部表名字
    - MODE: INSERT # 插入方式入庫
    - MAPPING:
        ID: ID # 映射,前面是內部表字段,後面是映射的字段,後面的字段可以是外部表的字段或數據庫函數
        NAME: NAME
        CUST_ID: CUST_ID
        CREATE_TIME: now()
  PRELOAD:
    - REUSE_TABLES: false # 默認外部表不重用

 

執行入庫測試

[gpadmin@allinone ~]$ gpload -f test.yml
2021-03-23 15:14:11|INFO|gpload session started 2021-03-23 15:14:11
2021-03-23 15:14:11|INFO|setting schema 'public' for table 't1'
2021-03-23 15:14:11|INFO|started gpfdist -p 22222 -P 22223 -f "/home/gpadmin/test.csv" -t 30
2021-03-23 15:14:11|INFO|running time: 0.07 seconds
2021-03-23 15:14:11|INFO|rows Inserted          = 4
2021-03-23 15:14:11|INFO|rows Updated           = 0
2021-03-23 15:14:11|INFO|data formatting errors = 0
2021-03-23 15:14:11|INFO|gpload succeeded

執行完成後,查看數據庫中表的數據:

postgres=# select * from t1;
 id | name | cust_id |     create_time
----+------+---------+---------------------
  1 | A    | 111     | 2021-03-23 15:14:12
  2 | B    | 222     | 2021-03-23 15:14:12
  3 | C    | 333     | 2021-03-23 15:14:12
  4 | D    | 444     | 2021-03-23 15:14:12
(4 rows)

至此,一個使用gpload的簡單例子就結束了。

End~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章