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)

时间: 2024-12-02 06:32:09

Greenplum 通过gpfdist + EXTERNAL TABLE 并行导入数据的相关文章

windows server 下使用gpfdist 并行导入数据到 greenplum集群

          windows server 使用gpfdist教程  linux 下请参考 linux gpfdist 由于工作需要, 需要将在SQL server 上的数据迁移到Greenplum集群 所以 采取并行导入CSV的工具gpfdist 实现并行导入数据 一.部署安装环境   首相去官网下载gpload.exe 点击安装  安装路径要记住    我的安装路径是D: 盘 gpfdist.exe在 D:\bin\ 二.启动windows 服务 2.1 命令行创建服务 win+R 输

Greenplum insert的性能(单步\批量\copy) - 暨推荐使用gpfdist、阿里云oss外部表并行导入

标签 PostgreSQL , Greenplum , HybridDB for PostgreSQL , insert , copy , 外部表 , oss , gpfdist 背景 Greenplum是一款MPP数据库产品,优势是优良的OLAP性能,支持多节点并行计算,实现PB级数据量的实时分析. 除了分析能力,数据写入吞吐也是Greenplum的重要指标,Greenplum支持从master节点写入,也支持从segment节点并行写入. 从segment并行加载的话,性能是线性提升的,因为

导入excel-php环境下把html页面table中的数据导入到Excel中

问题描述 php环境下把html页面table中的数据导入到Excel中 如题的问题,我看过网上一些解决方案,使用html5对象的方法可以忽略,因为我们的系统环境暂不支持html5:使用ActiveXObject方法的需要客户端支持,也不符合我们的设计思想.有没有更好解决办法,求详细方案. 解决方案 如果是客户端的,我也不知道怎么回答 如果是服务端导入的,我知道以下方案: 方案1,参考excel的openxml规范,生成对应的文件然后把这个文件打包为zip格式,这种方案最完美,然而我只有CLR下

Hbase 学习(十一)使用hive往hbase当中导入数据

我们可以有很多方式可以把数据导入到hbase当中,比如说用map-reduce,使用TableOutputFormat这个类,但是这种方式不是最优的方式. Bulk的方式直接生成HFiles,写入到文件系统当中,这种方式的效率很高. 一般的步骤有两步: (1)使用ImportTsv或者import工具或者自己写程序用hive/pig生成HFiles (2)用completebulkload把HFiles加载到hdfs上 ImportTsv能把用Tab分隔的数据很方便的导入到hbase当中,但还有

使用SQL*LOADER导入数据

导入数据 Oracle的SQL*LOADER是一个专门用于ORACLE导数据的工具.不过,好多DBA习惯用TOAD导入数据,TOAD这个工具.但是我觉得SQL*LOADER也不错,特别是在批量的时候. 对于初学者,我想声明一点的是,关于那个.CTL文件.我起初以为.CTL文件是ORACLE自己的控制文件.结果搞错了,这个CTL文件是需要你自己写的.也就是说,这个CTL文件就是一个脚本文件,而不是ORACLE启动的控制文件. 今天我做了一写关于SQL*LOADER的测试,写一下大致过程. 1:新建

使用 Sql*Loader 向 Oracle 导入数据

oracle|导入数据 使用Oracle的sqlldr工具来将SDSS.CSV文件中的数据导入数据库. SDSS.CSV 放置于 E:\ 内容如下:         2.3757291096910399E-4,-8.9490277843631194,20.302597,        0.00023851549291556,-0.88450365314434698,20.098101,        2.5168890447969299E-4,7.7169029946908094E-2,18.7

使用Oracle sql loader批量导入数据

在性能测试中,有一项十分重要的准备工作就是准备测试数据.在进行性能测试之前,首先要保证测试数据库中有测试所需要的足够多的数据.对于数据的准备工作,有时候我会使用LoadRunner生成相应的脚本去准备数据,这样的做法有一个好处就是简便易行,然而它有一个很大的缺点就是效率太慢,当我们需要的数据量极大时,这样做是非常耗时间的,所以我觉得还需要掌握各种不同的技能来完成这个任务.以下就是我在前不久的一次测试中学到的经验: 使用oracle sql loader批量导入数据(在准备测试数据时很有用!) 生

mysqldump 只导入数据或只导结构

[size=small]mysqldump只导出数据或只导出表结构   1.备份数据库  #mysqldump -u 用户名 -p 数据库名 > 导出文件名  2.导出表结构  #mysqldump -u 用户名 -p -d 数据库名 --add-drop-table 表名 > 导出文件名  ##-d:表示没有数据,--add-drop-table 在每个creat语句之前增加一个drop table  3.导出表  #mysqldump -u 用户名 -p 数据库名 表名> 导出文件名

sqlite-如何将导入到数据库表中的数据保存在程序中,而不用每次换调试机时还得重新导入数据

问题描述 如何将导入到数据库表中的数据保存在程序中,而不用每次换调试机时还得重新导入数据 如题:我有一张excel的表,我将其存为.csv文件,然后通过dos命令下的sqlite3命令导入到了数据库表中,问题是如果不换机子,导入到该数据库表中的数据永久有效.如果我换机子调试的话,该数据库表中的数据就不存在了,会报错,请问有没有解决办法?谢谢! 解决方案 最好存入远程数据库每次启动同步下来数据就可以了,sqlite是系统自带的数据库具体的就是http://blog.csdn.net/tianyit