天天看點

Greenplum 通過gpfdist + EXTERNAL TABLE 并行導入資料

greenplum 提供了快速導入資料的方法,下面通過一個例子示範給大家.

我們用tpch測試中最大的表做導入測試

首先簡單介紹下原理.

1) greenplum 通過外部表的方式讓所有 segment 同時連接配接到一組外部服務 gpfdist, 同時拉取資料

2) gpfdist 随機分發資料給所有 segment.

3) segment拿到資料後先解析它,根據表的分發規則收下屬于自己的資料,把不屬于自己的資料再分發給所屬的segment.

整個過程充分利用了網絡和各 segment 的硬體資源,效率極高.

demo:

1) 在檔案伺服器上啟動gpfdist服務,端口号8080,指定文本檔案所在目錄

 ./gpfdist -d /u01/gp001/dss-data/ -p 8080 -l /u01/gp001/loadlog.log

2) 連接配接greenplum master節點,建立外部表

create external table lineitem_load (

    l_orderkey      integer , 

    l_partkey       integer , 

    l_suppkey       integer , 

    l_linenumber    integer,

    l_quantity      decimal,

    l_extendedprice decimal,

    l_discount      decimal,

    l_tax           decimal,

    l_returnflag    char(1),

    l_linestatus    char(1),

    l_shipdate      date,

    l_commitdate    date,

    l_receiptdate   date,

    l_shipinstruct  char(25),

    l_shipmode      char(10),

    l_comment       varchar(44)

) location ('gpfdist://1192.168.1.1:8080/lineitem.csv')

format 'csv' (delimiter '|');

關鍵資訊: 

1. 指定了外部資料源是剛才啟動的gpfdist服務,并指定了需要導入的文本檔案名

2 文本的根式是csv,列之間用 | 分隔.

3) 按照需求建立表,資料會導入到這個表中

        create table lineitem (

                l_orderkey ,    

                l_partkey ,  

                l_suppkey ,  

                l_linenumber    integer,

                l_quantity              decimal,

                l_extendedprice decimal,

                l_discount              decimal,

                l_tax                   decimal,

                l_returnflag    char(1),

                l_linestatus    char(1),

                l_shipdate              date,

                l_commitdate    date,

                l_receiptdate   date,

                l_shipinstruct  char(25),

                l_shipmode              char(10),

                l_comment               varchar(44)

        )  with (oids=false) distributed by (l_orderkey, l_linenumber);

4) 通過外部資料源把資料導入到 greenplum 中

insert into lineitem select * from lineitem_load;

5) 通過執行計劃,可以了解他是工作原理, 整個過程 master 節點不會處理資料,都由 segment完成.

explain insert into lineitem select * from lineitem_load;

                                             query plan                                              

-----------------------------------------------------------------------------------------------------

 insert (slice0; segments: 16)  (rows=62500 width=426)

   ->  redistribute motion 16:16  (slice1; segments: 16)  (cost=0.00..18500.00 rows=62500 width=426)

         hash key: l_orderkey, lineitem_load.l_linenumber

         ->  external scan on lineitem_load  (cost=0.00..18500.00 rows=62500 width=426)

 settings:  effective_cache_size=1gb

(5 rows)