阅读622 返回首页    go 阿里云


高速 OSS 并行导入导出__快速入门_云数据库 HybridDB-阿里云

云数据库HybridDB(ApsaraDB HybridDB)是一种在线MPP大规模并行处理数据仓库服务。云数据库HybridDB基于Greenplum Database开源数据库项目,并由阿里云深度扩展支持OSS存储、JSON数据类型、HyperLogLog预估分析等功能特性。

在阿里云上,支持通过 gpossext 并行装载数据到 HybridDB 中,也支持并行的把数据导出到 OSS 中。

gpossext 语法

  1. CREATE [READABLE] EXTERNAL TABLE tablename
  2. ( columnname datatype [, ...] | LIKE othertable )
  3. LOCATION ('ossprotocol')
  4. FORMAT '...'
  5. [ ENCODING 'encoding' ]
  6. [ LOG ERRORS ...]
  7. CREATE WRITABLE EXTERNAL TABLE table_name
  8. ( column_name data_type [, ...] | LIKE other_table )
  9. LOCATION ('ossprotocol')
  10. FORMAT '...'
  11. [ ENCODING 'encoding' ]
  12. [ DISTRIBUTED BY (column, [ ... ] ) | DISTRIBUTED RANDOMLY ]
  13. ossprotocol:
  14. oss://oss_endpoint filepath=[folder/[folder/]...]/file_name
  15. id=userossid key=userosskey bucket=ossbucket
  16. ossprotocol:
  17. oss://oss_endpoint dir=[folder/[folder/]...]/file_name
  18. id=userossid key=userosskey bucket=ossbucket

参数解释

ossprotocol 整个协议和相关参数描述如下

常用参数

  1. 1. 协议名,当然是 oss
  2. 2. ossendpoint 参数,是内网访问oss的地址,也叫 host
  3. 3. id oss账号ID
  4. 4. key oss账号key
  5. 5. bucket ossbucket,需要创建 oss 账号后分配
  6. 6. filepath oss 中带路径的文件名,需要注意
  7. 6.1 文件名包含文件路径,但不包含 bucket 名
  8. 6.2 并行装载模式要求文件被均匀拆分为多个文件
  9. 6.3 文件命名方式为 finame.x,x 要求从 1 开始,且是连续的
  10. 6.4 例 filename.1 filename.2 filename.3 ...
  11. 6.5 可以被导入的文件有 filename filename.1 filename.2 ...;其中1到N需要是连续的
  12. 6.6 为了最大化导入性能,建议拆分文件的个数是导入到的 HybridDB segment 个数的倍数
  13. 7. dir oss 中带路径的虚拟文件夹,需要注意
  14. 7.1 dir指 oss 上的虚拟文件夹,它需要以 / 结尾
  15. 7.2 该模式和 filepath 互斥,不能同时指定
  16. 7.3 该模式会导入指定虚拟目录下的所有文件到 HybridDB,但不包括它子目录和子目录下的文件
  17. 7.4 和 filepath 一样,该模式也是并行导入的,为了最大化导入性能,每个文件的大小需要尽量的均匀。
  18. 7.5 和 filepath 不同,dir 下的文件没有命名要求

导入模式参数

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

导出模式参数

  1. 9. 针对导出模式,新增下列两个参数
  2. 9.1 oss_flush_block_size 单词刷出到 oss 的buffer大小,默认 32 MB,可选范围 1 到 128 MB
  3. 9.2 oss_file_max_size 写到 oss 的最大文件大小,超出之后会切换到另一个文件再写。默认 1024 MB,可选范围 8 到 4000 MB
  4. 9.3 上述两个参数对导入模式无效
  5. 10 针对导出模式,需要注意
  6. 10.1 WRITABLE 是导出模式外部表的关键字,创建外部表时需要明确指明
  7. 10.2 导出模式目前只支持虚拟文件夹的匹配模式,即只支持 dir 不支持 filepath
  8. 10.3 导出模式的 DISTRIBUTED BY 子句可以使 segment 直接把本地数据写入 oss,不用数据重分布

其他通用参数

  1. 11 针对导入模式和导出模式,还有下列容错相关参数
  2. 11.1 oss_connect_timeout 设置链接超时,单位秒,默认是10秒
  3. 11.2 oss_dns_cache_timeout 设置DNS超时,单位秒,默认是60秒
  4. 11.3 oss_speed_limit 控制能容忍的最小速率,默认是1024,即1K
  5. 11.4 oss_speed_time 控制能容忍的最长时间,默认是15秒
  6. 11.5 如果使用了上述默认值,表示如果连续15秒的传输速率小于1K,则超时
  7. 11.6 详细描述,请客参考文章末尾的链接

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

  1. 1. FORMAT 支持文件格式,支持 text,csv 等
  2. 2. ENCODING 文件中数据的编码格式,如 utf8
  3. 3. LOG ERRORS 依然支持容错模式数据导入,通过制定该子句忽略掉导入中出错的数据

用例

  1. # 创建 oss 导入外部表
  2. create READABLE external table ossexample
  3. (date text, time text, open float, high float,
  4. low float, volume int)
  5. location('oss://oss-cn-hangzhou.aliyuncs.com
  6. filepath=osstest/example.csv id=XXX
  7. key=XXX bucket=testbucket') FORMAT 'csv'
  8. LOG ERRORS SEGMENT REJECT LIMIT 5;
  9. # 创建 oss 导出外部表
  10. create WRITABLE external table ossexample_exp
  11. (date text, time text, open float, high float,
  12. low float, volume int)
  13. location('oss://oss-cn-hangzhou.aliyuncs.com
  14. dir=osstest/exp/ id=XXX
  15. key=XXX bucket=testbucket') FORMAT 'csv'
  16. DISTRIBUTED BY (date);
  17. # 创建堆表,数据就装载到这张表中
  18. create table example
  19. (date text, time text, open float,
  20. high float, low float, volume int)
  21. DISTRIBUTED BY (date);
  22. # 数据并行的从 ossexample 装载到 example 中
  23. insert into example select * from ossexample;
  24. # 数据并行的从 example 导出到 oss
  25. insert into ossexample_exp select * from example;
  26. # 可以看到,每个 segment 都会参与工作。
  27. # 他们并行的从 oss 拉取数据
  28. # 然后通过 Redistribute Motion 分发给对应的 segment.
  29. # 每个 segment 再通过 insert 节点入库
  30. explain insert into example select * from ossexample;
  31. QUERY PLAN
  32. --------------------------------------------------------------------------------------------------
  33. Insert (slice0; segments: 4) (rows=250000 width=92)
  34. -> Redistribute Motion 4:4 (slice1; segments: 4) (cost=0.00..11000.00 rows=250000 width=92)
  35. Hash Key: ossexample.date
  36. -> External Scan on ossexample (cost=0.00..11000.00 rows=250000 width=92)
  37. (4 rows)
  38. # 可以看到,segment 把本地数据直接导出到 oss ,没有进行数据重分布
  39. explain insert into ossexample_exp select * from example;
  40. QUERY PLAN
  41. ---------------------------------------------------------------
  42. Insert (slice0; segments: 3) (rows=1 width=92)
  43. -> Seq Scan on example (cost=0.00..0.00 rows=1 width=92)
  44. (2 rows)

gpossext 使用注意

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

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

错误处理

当导入或导出操作出错时,错误日志会出现下列信息:

  1. code: 出错请求的HTTP状态码
  2. error_code: OSS的错误码
  3. error_msg: OSS的错误信息
  4. req_id: 标识该次请求的UUID;当您无法解决问题时,可以凭 req_id 来请求 oss 开发工程师的帮助
  5. 请参考文档末尾的链接以了解各类错误,超时相关的错误可以使用 oss_ext 相关参数处理

参考链接

  1. oss endpiint 信息
  2. oss help 页面
  3. oss 错误处理
  4. oss 错误响应
  5. HybridDB EXTERNAL TABLE 手册

最后更新:2016-12-01 11:08:37

  上一篇:go 插件管理__快速入门_云数据库 HybridDB-阿里云
  下一篇:go 导入MySQL数据__快速入门_云数据库 HybridDB-阿里云