6.2 ODPS中导入和导出

HybridDB支持直接从ODPS(MaxCompute)中导入和导出数据,这也是HybridDB独具特色的功能之一,相比较借助D2、CDP、DTS等工具,HybridBD直通导入和导出节省了大量的中间转换,导入导出的速度要快10倍以上!

建议

导入导出:采用本章介绍的批量方式,即Insert overwrite方式,批量可见,性能好,异常时可幂等重试

任务执行:建议采用Submit job方式异步执行(参考6.5 异步提交导入导出任务),避免长连接超时导致的任务中断等情况

1. 从ODPS中导入

数据从ODPS导入到HybridDB中需要如下四个步骤:

  • 准备ODPS中的源头数据表
  • 在HybridDB中建立一张外表映射到ODPS中的源头表
  • 在HybridDB中建立接收数据的真实存储表
  • 调用Insert [overwrite] into select来完成数据导入

举例如下:

1)准备ODPS中的源头数据表

这一步是准备odps源头表数据,如果已经有源头表了,可以忽略这一步

# odps非分区表
CREATE TABLE IF NOT EXISTS odps_nopart_import_test
(
uid     STRING COMMENT '',
other   STRING COMMENT ''
)
COMMENT ''
LIFECYCLE 3;

# odps分区表
CREATE TABLE IF NOT EXISTS odps_part_import_test
(
uid     STRING COMMENT '',
other   STRING COMMENT ''
)
COMMENT ''
PARTITIONED BY (ds STRING COMMENT '天')
LIFECYCLE 3;

# odps二级分区表
CREATE TABLE IF NOT EXISTS odps_two_part_import_test
(
uid     STRING COMMENT '',
other   STRING COMMENT ''
)
COMMENT ''
PARTITIONED BY (ds STRING COMMENT '天',other string)
LIFECYCLE 3;

2)在HybridDB中创建一张外部映射表

这一步的作用是建立映射表,用于告诉HybridDB如何读取ODPS源头表数据

use exdb  ##exdb是HybriDB中用户db的名称

# odps非分区表对应的外表
CREATE TABLE IF NOT EXISTS odps_nopart_import_test_external_table
(
uid string,
other string
)
ENGINE='ODPS'
TABLE_PROPERTIES='{
"endpoint":"http://service.odps.aliyun-inc.com/api",
"accessid":"xxx",
"accesskey":"xxx",
"project_name":"xxx",
"table_name":"odps_nopart_import_test"
}'

# odps分区表对应的外表
CREATE TABLE IF NOT EXISTS odps_part_import_test_external_table
(
uid string,
other string,
ds string
)
ENGINE='ODPS'
TABLE_PROPERTIES='{
"endpoint":"http://service.odps.aliyun-inc.com/api",
"accessid":"xxx",
"accesskey":"xxx",
"project_name":"xxx",
"table_name":"odps_part_import_test",
"partition_column":"ds"
}'

# odps二级分区表对应的外表
CREATE TABLE IF NOT EXISTS odps_two_part_import_test_external_table
(
uid string,
other string,
ds string
)
ENGINE='ODPS'
TABLE_PROPERTIES='{
"endpoint":"http://service.odps.aliyun-inc.com/api",
"accessid":"xxx",
"accesskey":"xxx",
"project_name":"xxx",
"table_name":"odps_part_import_test",
"partition_column":"ds,other"
}'

上表定义中

  • ENGINE=ODPS用于表明该表是外部表,存储引擎是外部的ODPS
  • TABLE_PROPERTIES用于告诉HybridDB如何访问odps中源头表的数据
    • endpoint:ODPS的数据连接地址,请注意公有云和阿里集团内部是不一样的。
    • accessid: 访问ODPS源头表的用户的accessid
    • accesskey: 访问ODPS源头表的用户的accessKey
    • project_name: ODPS中源头表所在的project名称
    • tablename: ODPS中源头表名称
  • ODPS非分区表和分区表的外表定义不一样
    • 外表定义(CREATE TABLE)多了一个ds string定义
    • 表属性(TABLE_PROPERTIES)多了一个 "partition_column":"ds"定义

3)在HybridDB中创建一张真实数据表

这一步是创建目标表,用于接收从ODPS中导入的源头表的数据

# 对应dps非分区表
CREATE TABLE IF NOT EXISTS hybriddb_nopart_import_test
(
uid string,
other string
)
DISTRIBUTE BY HASH(uid)
INDEX_ALL='Y'
ENGINE='CSTORE'


# 对应odps分区表
CREATE TABLE IF NOT EXISTS hybriddb_part_import_test
(
uid string,
other string,
ds string
)
DISTRIBUTE BY HASH(uid)
PARTITION BY VALUE(ds)
INDEX_ALL='Y'
ENGINE='CSTORE'


# 对应odps二级分区表
CREATE TABLE IF NOT EXISTS hybriddb_two_part_import_test
(
uid string,
other string,
ds string
)
DISTRIBUTE BY HASH(uid)
PARTITION BY VALUE(ds)
INDEX_ALL='Y'
ENGINE='CSTORE'

4) 执行sql语句开始导入

可以通过两种方式来完成导入:

  • 方式1:实时ETL导入,实时可见

    # 实时导入odps非分区表
    insert into hybriddb_nopart_import_test
    select * from odps_nopart_import_test_external_table
    
    # 实时导入odps分区表某个分区数据
    insert into hybriddb_part_import_test
    select * from hybriddb_part_import_test_external_table
    where ds = '20170101'
    
    # 实时导入odps分区表某个二级分区数据
    insert into hybriddb_two_part_import_test
    select * from hybriddb_two_part_import_test_external_table
    where ds = '20170101' and other='hangzhou'
    
  • 方式2:批量ETL导入,批量可见,性能好

    # 批量导入odps非分区表
    insert overwrite into hybriddb_nopart_import_test
    select * from odps_nopart_import_test_external_table
    
    # 批量导入odps分区表某个分区数据
    insert overwrite into hybriddb_part_import_test
    select * from odps_part_import_test_external_table
    where ds = '20170101'
    
    # 批量导入odps分区表某个二级分区数据
    insert overwrite into hybriddb_part_import_test
    select * from odps_part_import_test_external_table
    where ds = '20170101' and other='hangzhou'
    

2. 导出到ODPS

数据从ODPS导出到HybridDB中需要如下三个步骤:

  • 准备ODPS中的真实数据表
  • 在HybridDB中建立一张目标外表映射到ODPS中的数据表
  • 准备HybridDB中的数据源头表
  • 调用Insert [overwrite] into select来完成数据导出

1) 准备ODPS中的真实数据表

# odps非分区表
CREATE TABLE IF NOT EXISTS odps_nopart_export_test
(
uid     STRING COMMENT '',
other   STRING COMMENT ''
)
COMMENT ''
LIFECYCLE 3;

# odps分区表
CREATE TABLE IF NOT EXISTS odps_part_export_test
(
uid     STRING COMMENT '',
other   STRING COMMENT ''
)
COMMENT ''
PARTITIONED BY (ds STRING COMMENT '天')
LIFECYCLE 3;

2) 在HybridDB中建立一张外表映射到MySQL中的数据表

这一步的作用是建立映射表,用于告诉HybridDB如何将数据写回 ODPS

use exdb #exdb是HybriDB中用户db的名称

# odps非分区表对应的外表
CREATE TABLE IF NOT EXISTS odps_nopart_export_test_external_table
(
uid string,
other string
)
ENGINE='ODPS'
TABLE_PROPERTIES='{
"endpoint":"http://service.odps.aliyun-inc.com/api",
"accessid":"xxx",
"accesskey":"xxx",
"project_name":"xxx",
"table_name":"odps_nopart_export_test"
}'

# odps分区表对应的外表
CREATE TABLE IF NOT EXISTS odps_part_export_test_external_table
(
uid string,
other string,
ds string
)
ENGINE='ODPS'
TABLE_PROPERTIES='{
"endpoint":"http://service.odps.aliyun-inc.com/api",
"accessid":"xxx",
"accesskey":"xxx",
"project_name":"xxx",
"table_name":"odps_part_export_test",
"partition_column":"ds"
}'

3) 在HybridDB准备数据源头表

这这一步是准备hybriddb源头表数据,如果已经有了,可以忽略这一步

# 对应dps非分区表

CREATE TABLE IF NOT EXISTS hybriddb_nopart_export_test
(
uid string,
other string
)
DISTRIBUTE BY HASH(uid)
INDEX_ALL='Y'
ENGINE='CSTORE'


# 对应odps分区表
CREATE TABLE IF NOT EXISTS hybriddb_part_export_test
(
uid string,
other string,
ds string
)
DISTRIBUTE BY HASH(uid)
PARTITION BY VALUE(ds)
INDEX_ALL='Y'
ENGINE='CSTORE'

4) 执行sql语句开始导出

# 导出hybriddb数据到odps非分区表
insert [overwrite] into odps_nopart_export_test_external_table
select * from hybriddb_nopart_export_test

# 导出hybriddb数据到odps分区表某个分区
insert [overwrite] into odps_part_export_test_external_table
select * from hybriddb_part_export_test
where ds = '20170101'

3. 注意事项

  1. 要求三表的DDL定义完全一致(MySQL源头表、HybridDB外表、HybridDB存储表)
  2. 公有云VPC网络不支持这种外表方式导入,需要用户自己借助CDP/DataX等方式
  3. 这里导入导出都是同步模式,发起导入的mysql client连接需要一直保持,如需异步提交请参考6.5节
  4. ODPS分区表导入HybridDB二级分区表时,单次并行可以导入的ODPS分区数目为32个
  5. ODPS非分区表导入HybridDB二级分区表时,单次最多可以写入的分区数目为4个
  6. 使用overwrite关键字表示分区覆盖,与ODPS -> HDB的批量ETL导入语义一致,也是批量可见

results matching ""

    No results matching ""