从 oss 装载数据到 GreenPlum

gpossext

在阿里云上,支持通过 gpossext 并行装载数据到 Greenplum 中

gpossext 语法

CREATE [READABLE] EXTERNAL TABLE tablename
( columnname datatype [, ...] | LIKE othertable )
LOCATION ('ossprotocol')
FORMAT '...'
[ ENCODING 'encoding' ]
[ LOG ERRORS ...]

ossprotocol:
   oss://oss_endpoint filepath=[folder/[folder/]...]/file_name 
    id=userossid key=userosskey bucket=ossbucket

ossprotocol:
   oss://oss_endpoint dir=[folder/[folder/]...]/file_name 
    id=userossid key=userosskey bucket=ossbucket

参数解释

ossprotocol 整个协议有6部分

1. 协议名,当然是 oss 

2. ossendpoint 参数,是内网访问oss的地址,也叫 host

3. id oss账号ID

4. key oss账号key

5. bucket ossbucket,需要创建 oss 账号后分配

6. filepath oss 中带路径的文件名,需要注意
  6.1 文件名包含文件路径,但不包含 bucket 名
  6.2 并行装载模式要求文件被均匀拆分为多个文件
  6.3 文件命名方式为 finame.x,x 要求从 1 开始,且是连续的
  6.4 例 filename.1 filename.2 filename.3 ...
  6.5 可以被导入的文件有 filename filename.1 filename.2 ...;其中1到N需要是连续的。
  6.6 为了最大化导入性能,建议拆分文件的个数是导入到的 Greenplum segment 个数的倍数

7. dir oss 中带路径的虚拟文件夹,需要注意
    7.1 dir指 oss 上的虚拟文件夹,它需要以 / 结尾
    7.2 该模式和 filepath 互斥,不能同时指定
    7.3 该模式会导入指定虚拟目录下的所有文件到 Greenplum,但不包括它子目录和子目录下的文件
    7.4 和 filepath 一样,该模式也是并行导入的,为了最大化导入性能,每个文件的大小需要尽量的均匀。
    7.5 和 filepath  不同,dir 下的文件没有命名要求

8. async 是否启用异步模式装载数据
    8.1 开启辅助线程从 oss 装载数据,加速导入性能
    8.2 默认情况下异步模式是打开的,如果需要关掉,可以使用参数 async = false 或 async = f
    8.3 异步模式和普通模式比,会消耗更多的硬件资源

gpossext 的其他参数兼容 Greenplum EXTERNAL TABLE 的原有语法,主要有

1. FORMAT 支持文件格式,支持 txt,csv 等

2. ENCODING 文件中数据的编码格式,如 utf8

3. LOG ERRORS 依然支持容错模式数据导入,通过制定该子句忽略掉导入中出错的数据

用例

# 创建 oss 外部表
create READABLE external table ossexample 
        (date text, time text, open float, high float,
        low float, volume int) 
        location('oss://oss-cn-hangzhou-zmf.aliyuncs.com
        filepath=osstest/example.csv id=XXX
        key=XXX bucket=testbucket') FORMAT 'csv'
        LOG ERRORS SEGMENT REJECT LIMIT 5;

# 创建堆表,数据就装载到这张表中
create table example
        (date text, time text, open float,
         high float, low float, volume int);

# 数据并行的从 ossexample 装载到 example 中。
insert into example select * from ossexample;

# 可以看到,每个 segment 都会参与工作。
# 他们并行的从 oss 拉取数据
# 然后通过 Redistribute Motion 分发给对应的 segment. 
# 每个 segment 再通过 insert 节点入库
explain insert into example select * from ossexample;
                                            QUERY PLAN                                            
--------------------------------------------------------------------------------------------------
 Insert (slice0; segments: 4)  (rows=250000 width=92)
   ->  Redistribute Motion 4:4  (slice1; segments: 4)  (cost=0.00..11000.00 rows=250000 width=92)
         Hash Key: ossexample.date
         ->  External Scan on ossexample  (cost=0.00..11000.00 rows=250000 width=92)
(4 rows)
        

gpossext 使用注意

gpossext 打开了 oss 到 Greenplum 的数据通道,用户可以把数据放到廉价的 oss 中,再导入到 Greenplum 中进行分析。使用需要注意

1. gpossext 中除了 ossprotocol,其他的部分和 Greenplum 相同。
2. 数据导入的性能和 Greenplum 集群的资源(CPU IO MEM NET)相关,也和 OSS 相关。
3. 为了保证数据导入的性能 ossendpoint Region 需要匹配 Greenplum 云上所在 Region,建议oss和Greenplum在同一个Region以获得最好的性能。相关信息请参考下面的链接。

参考链接

  1. oss endpiint 信息
  2. [oss help 页面] [2]
  3. [Greenplum EXTERNAL TABLE 手册] [3]
上一篇:PPAS 兼容oracle部分函数表达式索引


下一篇:PostgreSQL/PPAS 一例死锁问题分析