zoukankan      html  css  js  c++  java
  • [转]Greenplum 通过gpfdist + EXTERNAL TABLE 并行导入数据

    摘要: Greenplum 提供了快速导入数据的方法,下面通过一个例子演示给大家.

    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)

    (原文地址:https://yq.aliyun.com/articles/7457)

  • 相关阅读:
    java程序员怎么创建自己的网站:第一章:总体流程
    技术汇总:第五章:使用angularjs做首页三级分类
    js中Function的apply方法与call方法理解
    常用方法
    Array对象(一)
    一张图理解is_nll isset empty
    解析centos中Apache、php、mysql 默认安装路径
    常用命令
    centos虚拟机启用网卡
    初学Linux笔记
  • 原文地址:https://www.cnblogs.com/jianyungsun/p/6802694.html
Copyright © 2011-2022 走看看