1. 程式人生 > >Greenplum中裝載和解除安裝資料

Greenplum中裝載和解除安裝資料

裝載和解除安裝資料

GP裝載概述

關於外部表

1) 外部表允許使用者像訪問標準資料庫表一樣訪問外部表 
2) 結合GP的並行檔案分配程式(gpfdist),外部表支援在裝載和解除安裝資料時全並行化利用所有segment例項的資源 
3) GP還可以利用Hadoop分散式檔案系統的並行架構來訪問檔案 
4) GP提供了兩種型別的外部表: 
可讀外部表:用於資料裝載,不允許對資料進行修改 
可寫外部表:用於資料解除安裝,從資料庫表中選擇記錄並輸出到檔案、命令管道或其他的可執行程式,包括並行MapReduce計算。只需允許INSERT 操作。 
5) 按資料來源不同,分為兩種可讀外部表: 
常規的:訪問靜態的平面檔案 
WEB:訪問動態資料來源(比如wen服務或者OS的命令或指令碼)

關於gpload

1) gpload是一個數據並行裝載命令 
2) 需要建立一個按照YAML格式定義的裝載說明控制檔案

關於copy

1) 標準PostgreSQL裝載和解除安裝命令 
2) 不具有並行裝載/解除安裝的機制

定義外部表

概述

在建立外部表定義時,必須指定檔案格式和檔案位置;三種用來訪問外部表資料來源的協議:gpfdist, gpfdists和gphdfs。

gpfdist

1) 在外部表指定檔案的所有主機上執行GP檔案分發程式(gpfdist) 
2) 該程式指向一個給定的目錄,並行的為所有segment例項提供外部資料檔案服務 
3) 如果檔案使用了gzip或者bzip2壓縮,gpfdist會自動解壓 
4) 可以使用多個gpfdist來提升外部表的掃描效能 
5) 可使用萬用字元或者C風格的模式匹配多個檔案

gpfdists

1) gpfdists是gpfdist的安全版本,其開啟的加密通訊並確保檔案與GP之間的安全認證

file

1) 如果使用file://協議,則外部檔案必須存放在segment主機上面 
2) 指定的符合segment例項數量的的URIs將並行工作來訪問外部表 
3) 每個segment主機外部檔案的數量不能超過segment例項數量 
4) pg_max_external_files用來確定每個外部表中允許多少個外部檔案

gphdfs

1) 該協議指定了一個可以在HDFS上包含萬用字元的路徑。 
2) 在GP連結到HDFS檔案時,所有資料將從HDFS資料節點被並行讀取到GP的Segment例項以快速處理。 
3) 每個GP Segment例項只讀取一組Hadoop資料塊。 
4) 對於寫來說,每個GP Segment例項值寫該例項包含的資料

外部檔案格式

1) TEXT型別對所有協議有效 
2) 逗號分割的CSV對於gpfdist和file協議有效 
3) 自定義格式適用於gphdfs

外部表中的錯誤資料

為了在裝載正確格式的記錄時隔離錯誤資料,需在定義外部表時使用單條記錄出錯處理

外部表備份恢復

在備份或者恢復操作中,僅僅外部表或者WEB外部表的定義會被備份或恢復。

使用GP並行檔案服務(gpfdist)

為最大化系統頻寬而執行gpfdist要考慮的因素: 
1) 關於gpfdist的設定與效能 
如果ETL主機配置了多個網口,應將所有網口對應的主機名在LOCATION子句中宣告 
2) 在ETL主機上執行多個gpfdist並將外部資料均勻的分拆到各gpfdist服務。 
3) 控制節點並行度 
gp_external_max_segs引數設定最大多少Segment例項訪問同一個gpfdist檔案分發程式 
4) 啟動和停止gpfdist 
a) 要啟動gpfdist,必須指定其提供檔案服務的目錄以及執行的埠(預設為HTTP埠8080) 
b) 在後臺啟動gpfdist(日誌資訊和出錯資訊輸出到日誌檔案)

 $ gpfdist –d /var/load_files –p 8081 –l /home/gpadmin/log &
  • 1

c) 要在同一個ETL主機啟動多個gpfdist服務,為每個服務指定不同的目錄和埠。例如,

    $ gpfdist –d /var/load_files1 –p 8081 –l /home/gpadmin/log1 &
    $ gpfdist –d /var/load_files2 –p 8082 –l /home/gpadmin/log2 &
  • 1
  • 2

d) 停止後臺的gpfdist服務: 
第一步找到程序號,

$ ps –ef|grep gpfdist
  • 1

第二步殺掉該程序

$ select pg_cancel_backend(1234);
  • 1

5) gpfdist故障診斷 
a) 確保GP Segment可以訪問gpfdist的網路 
b) 使用wget命令來測試GP叢集的連線性

    $ wget  http://gpfdist_hostname:port/filename
  • 1

c) 需要確保CREATE EXTERNAL TABLE定義了hostname, port以及gpfdist的檔名 
6) 建立使用gpfdist協議的外部表 
a) 建立單檔案服務的可讀外部表,檔案格式為豎線(|)分割:

  CREATE EXTERNAL TABLE tb_ext_gf01(id int, name text)
    LOCATION (‘gpfdist://mdw:8081/*.txt’)
    FORMAT ‘TEXT’ (DELIMITER ‘|’ NULL ‘’);
  • 1
  • 2
  • 3

b) 建立多檔案服務的可讀外部表,檔案格式為豎線(|)分割:

  CREATE EXTERNAL TABLE tb_ext_gf02(id int, name text)
    LOCATION ('gpfdist://mdw:8081/*.txt','gpfdist://mdw:8082/*.txt')
    FORMAT 'TEXT' (DELIMITER '|' NULL '');
  • 1
  • 2
  • 3

c) 帶有錯誤資料日誌的多檔案服務

   CREATE EXTERNAL TABLE tb_ext_gf03 ( id int, name text, amount float4)
    LOCATION ('gpfdist://mdw:8081/*.csv','gpfdist://mdw:8082/*.csv')
    FORMAT 'CSV' ( DELIMITER ',' )
    LOG ERRORS INTO err_customer SEGMENT REJECT LIMIT 2;
  • 1
  • 2
  • 3
  • 4

d) 建立可寫外部表

 CREATE WRITABLE EXTERNAL TABLE tb_ext_gf04 (LIKE tb_cp_02)
    LOCATION ('gpfdist://mdw:8081/tb_cp_02.out')
    FORMAT 'TEXT' ( DELIMITER '|' NULL ' ')
    DISTRIBUTED BY (id);
    insert into tb_ext_gf04 select * from tb_cp_02;
  • 1
  • 2
  • 3
  • 4
  • 5

7) 使用SELECT FROM來訪問外部表 
裝載全部資料到一個新的資料表

CREATE TABLE tb_load_01 AS SELECT * FROM tb_ext_gf01;
  • 1
  • 2

使用Hadoop分散式檔案系統表

1) GP使用gphdfs協議支援並行架構Hadoop分散式檔案系統的讀寫。 
2) 使用HDFS的三個步驟 
a) 安裝設定 
b) HDFS協議授權 
c) 在外部表定義中指定HDFS資料

建立和使用WEB外部表

1) 查詢優化器不允許重複掃描WEB表的資料 
2) 使用CREATE EXTERNAL WEB TABLE建立GP的WEB表 
3) WEB外部表的定義有兩種形式 
a) WEB URL 
使用http://協議指定WEB伺服器上檔案的LOCATION; 
該WEB資料檔案必須在GP Segment可以訪問的WEB服務上; 
URL的數量將對應並行訪問WEB表的Segment例項 
b) OS命令 
在一個或數個Segment上指定執行SHELL命令或者指令碼,輸出結果作為WEB表訪問的資料; 
使用EXECUTE子句定義的外部表,將在指定的數個Segment主機上執行指定的SHELL命令或指令碼; 
注意限制執行WEB表命令的Segment例項數量 
4) 定義OS命令型WEB外部表 
a) 命令或程式必須放置到所有Segment主機上 
b) 命令是從資料庫執行而不是從登入的SHELL 
例如:

 CREATE EXTERNAL WEB TABLE tb_ext_wb01(output text)
    EXECUTE 'hostname' 
    FORMAT 'TEXT';
  • 1
  • 2
  • 3

5) 定義URL型WEB外部表

 CREATE EXTERNAL WEB TABLE tb_ext_wb02 (name text,
    date date, amount float4, category text, description text)
    LOCATION (
    'http://intranet.company.com/expenses/marketing/file.csv',
    'http://intranet.company.com/expenses/eng/file.csv‘
    )
    FORMAT 'CSV' ( HEADER );
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

裝載和解除安裝資料

在GP中有兩種自定義方案可用於裝載和解除安裝資料

使用自定義格式

1) 自定義格式用於匯入匯出TEXT和CSV兩種格式之外的資料; 
使用自定義格式有如下3個步驟: 
a) 編寫輸入輸出函式並編譯到共享庫中 
b) 在GP中通過CREATE FUNCTION指定共享庫函式 
c) 將這些函式與CREATE EXTERNAL TABLE的formatter子句關聯 
d) 對於固定寬度資料來說,前兩步在GP中已經完成。函式名分別為fixedwidth_in和fixedwidth_out 
2) 匯入匯出固定寬度資料 
在GP中可直接使用固定寬度資料的函式,需要指定自定義的格式和在formatter引數中指定函式名稱。例如,

  CREATE READABLE EXTERNAL TABLE tb_ext_cs01 (id int, name text)
    LOCATION ('gpfdist://mdw:8081/a_cs.txt')
    FORMAT 'CUSTOM' (formatter=fixedwidth_in, id='2',name='3');
  • 1
  • 2
  • 3

3) 其他選項 
a) 設定空白和控制字元 
要保留補尾的空白,使用preserve_blanks=on選項; 
使用null=‘null_string_value’選項指定控制字元 
b) 指定行的結尾 
使用引數line_delim=‘line_ending’指定行的結尾字元; 
下面列舉的可以覆蓋大部分場景:

line_delim=E’\n’
    line_delim=E’\r’
    line_delim=E’\r\n’
    line_delim=‘’ (沒有分隔行)
  • 1
  • 2
  • 3
  • 4

例如,

 CREATE READABLE EXTERNAL TABLE tb_ext_cs02 (id int, name text)
    LOCATION ('gpfdist://mdw:8081/b_cs.txt')
    FORMAT 'CUSTOM' (formatter=fixedwidth_in,
    id='2',name='3', preserve_blanks='on',null='NUL');
  • 1
  • 2
  • 3
  • 4

4) 使用自定義協議 
如果現有的協議(gpfdist、http、file等)不能夠很好的用於訪問資料,可以編寫自定義的協議。

使用gpload裝載資料

1) gpload是GP使用可讀外部表和GP並行檔案服務gpfdist裝載資料的一個命令包裝。 
2) 使用gpload 
a) 建立YAML格式裝載控制檔案 
該檔案指定了GP的連線資訊,gpfdist配置資訊,外部表選項以及資料格式。例如,

    VERSION: 1.0.0.1
    DATABASE: testdw
    USER: gpadmin
    HOST: mdw
    PORT: 5432
    GPLOAD:
     INPUT:
      - SOURCE:
     LOCAL_HOSTNAME:
    - mdw
       PORT: 8081
    FILE:
    - /data/load_files/a.txt
      - COLUMNS:
    - id: int
    - name: text
      - FORMAT: text
      - DELIMITER: '|'
      - ERROR_LIMIT: 1
      - ERROR_TABLE: err_a
     OUTPUT:
      - TABLE: tb_gf01
      - MODE: INSERT
     SQL:
      - BEFORE: "INSERT INTO audit VALUES('start', current_timestamp)"
      - AFTER: "INSERT INTO audit VALUES('end', current_timestamp)"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

3) 通過裝載控制檔案執行gpload命令,例如:

    gpload –f my_load.yml
  • 1

使用COPY裝載資料

1) 使用COPY FROM把資料從檔案追加拷貝到表中 
2) Master必須可以訪問到該檔案 
3) 可考慮每個CPU執行一個併發的COPY來提高效能 
4) 使用單條記錄錯誤隔離模式執行COPY(跟定義外部表一樣),例如:

    CREATE TABLE tb_ext_cp01 (LIKE tb_ext_gf01);
    COPY tb_ext_cp01 FROM '/data/load_files/a.txt‘
    WITH DELIMITER '|' LOG ERRORS INTO err_tb_ext_cp01
    SEGMENT REJECT LIMIT 2 ROWS;
  • 1
  • 2
  • 3
  • 4

資料裝載效能技巧

1) 在裝載前刪除索引:在已存在的資料上建立索引比不斷的遞增索引要快 
2) 在裝載之後執行ANALYZE:執行ANALYZE確保查詢計劃擁有最新的統計資訊 
3) 在裝載出錯後執行VACUUM:錯誤發生前的記錄無法訪問,但仍然佔據磁碟空間

從GP中解除安裝資料

1) 兩種型別:並行(可寫外部表)和非並行(COPY) 
2) 兩種方式的可寫外部表:基於檔案和基於WEB 
3) 定義基於檔案的可寫外部表 
a) 使用CREATE WRITABLE EXTERNAL TABLE命令定義外部表並指出輸出檔案的位置和格式 
b) 使用gpfdist協議的可寫外部表 
GP Segment將資料傳送給gpfdist程序,該程序將資料寫到指定名稱的檔案; 
若希望輸出的資料分割到多個檔案,可以在外部表的定義中指定多個gpfdist的URL選項 
例如,

  CREATE WRITABLE EXTERNAL TABLE tb_wext_gf01(LIKE tb_cp_02)
    LOCATION ('gpfdist://mdw:8081/tb_wext_gf01.out',
    'gpfdist://mdw:8082/tb_wext_gf02.out')
    FORMAT 'TEXT' (DELIMITER ',')
    DISTRIBUTED RANDOMLY;
  • 1
  • 2
  • 3
  • 4
  • 5

4) 定義基於命令的可寫外部表 
a) 使用CREATE WRITABLE EXTERNAL WEB TABLE命令定義外部表並指定可執行命令或程式 
b) 對於可寫WEB表,EXECUTE子句指定的命令或指令碼準備著接受資料輸入流; 
c) 可寫外部表有分佈策略選項,預設為隨機分佈; 
d) 若使用HASH分佈策略,在可寫外部表中定義相同的分佈鍵可以改善解除安裝的效能。 
e) 在外部表定義的EXECUTE子句中,可根據需要設定環境變數。例如,

    CREATE WRITABLE EXTERNAL WEB TABLE tb_wext_wb01 (output text)
    EXECUTE 'export PATH=$PATH:/home/gpadmin;myprogram.sh‘
    FORMAT 'TEXT‘
    DISTRIBUTED RANDOMLY;
  • 1
  • 2
  • 3
  • 4

f) WEB外部表和可寫外部表的可執行性 
外部表執行OS命令或者指令碼有一定的風險,根據需要,可以禁止在WEB表定義中使用EXECUTE。在Master的postgresql.conf檔案設定:

 gp_external_enable_exec = off
  • 1

5) 使用COPY解除安裝資料 
在GP Master上使用COPY TO語句從資料庫表序列拷貝資料到檔案 
例如:

 COPY (SELECT * FROM tb_cp_02 WHERE date LIKE '2013%') TO '/data/unload/tb_cp_02_2013.out';
  • 1

6) 可讀外部表的統計資訊 
a) 無法通過ANALYZE獲取,可以通過手工修改資料字典pg_class來設定粗略統計值 
b) 指定行數和資料庫頁面數(資料尺寸/32K) 
c) 預設行數為1000000,頁面數為1000 
手工修改:

  update pg_class set reltuples=500000, relpages=150 where relname='tb_wext_gf01';