暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

为什么不建议使用DataX读写GreenPlum

叶同学专栏 2021-04-16
4439

1 Datax简介
  DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL、Oracle、SqlServer、PostgreSql、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、DRDS 等各种异构数据源之间高效的数据同步功能。
  DataX本身作为数据同步框架,将不同数据源的同步抽象为从源头数据源读取数据的Reader插件,以及向目标端写入数据的Writer插件,理论上DataX框架可以支持任意数据源类型的数据同步工作。同时DataX插件体系作为一套生态系统, 每接入一套新数据源该新加入的数据源即可实现和现有的数据源互通。

2 Datax读写GreenPlum原理

  • 通过PostgresqlReader插件,使用JDBC连接远程数据库,并执行相应的sql语句将数据从GreenPlum数据库中SELECT出来。

  • 通过PostgresqlWriter插件,使用JDBC连接远程数据库,并执行相应的 insert into … sql 语句将数据写入GreenPlum数据库,内部会分批次提交入库。


3 测试分析过程
3.1 使用datax实现mysql数据同步到GreenPlum
mysql2gp.json 配置文件

{
        "job": {
                "setting": {
                        "speed": {
                                "channel""5"
                        }
                },
                "content": [{
                        "reader": {
                                "name""mysqlreader",
                                "parameter": {
                                               "username""root",
                                               "password""root",
                                               "column": ["bi_sfdm""sslxdm""ywlbdm""yxdnbbs""jldbh""gzdbh""jldxh""czcs"],
                                               "splitPk":"rownum",
                                               "connection": [
                                                   {
                                                   "jdbcUrl": ["jdbc:mysql://x.x.x.x:3306/test"],
                                                   "table": ["yejf"]
                                                   }
                                               ],
                                               "where"""
                                }
                        },
                        "writer": {
                                "name""postgresqlwriter",
                                "parameter": {
                                        "username""gpadmin",
                                        "password""gpadmin",
                                        "column": ["bi_sfdm""sslxdm""ywlbdm""yxdnbbs""jldbh""gzdbh""jldxh""czcs"],
                                        "preSql": ["truncate table yejf;"],
                                        "postSql": [""],
                                        "connection": [{
                                                "table": ["yejf"],
                                                "jdbcUrl""jdbc:postgresql://x.x.x.x:5432/test"
                                        }]
                                }
                        }
                }]
        }
}

josn配置文件解释:

mysqlreader:
"channel": "5"            使用5个通道
"splitPk":"rownum"    对rownum字段进行数据切片
postgresqlwriter :
batchSize没有配置,默认1024记录数提交

查看执行前数据库文件日志的大小

运行datax命令

python datax.py mysql2gp4.json

结果分析:一共进行100万数据的同步,耗时101秒


统计入库数据库表的大小情况

再查看日志增长的情况(执行前是4k)

  OMG,日志增长竟然如此之大,原因数据库文件日志记录了每条操作,datax往数据库写数据时,master上也相当于是同时写一条了,所以不管从CPU资源、或者是磁盘I\O使用上,对master造成非常大的压力,而且正常生产系统的数据库都会保留操作日志,以便DBA的排查。


3.2 使用datax实现GreenPlum数据同步到mysql
gp2mysql.json 配置文件

{
        "job": {
                "setting": {
                        "speed": {
                                "channel""5"
                        }
                },
                "content": [{
                        "reader": {
                                "name""postgresqlreader",
                                "parameter": {
                                    "username""gpadmin",
                                    "password""gpadmin",
                                    "column": ["bi_sfdm""sslxdm""ywlbdm""yxdnbbs""jldbh""gzdbh""jldxh""czcs"],
                                    "fetchSize":"2048",
                                    "connection": [
                                        {
                                            "table": ["yejf"],
                                            "jdbcUrl": ["jdbc:postgresql://x.x.x.x:5432/test"]
                                        }
                                    ]
                                }
                        },
                        "writer": {
                                "name""mysqlwriter",
                                "parameter": {
                                        "username""root",
                                        "password""root",
                                        "column": ["bi_sfdm""sslxdm""ywlbdm""yxdnbbs""jldbh""gzdbh""jldxh""czcs"],
                                        "writeMode""insert",
                                        "preSql": ["truncate table yejf;"],
                                        "postSql": [""],
                                        "connection": [{
                                                "table": ["yejf"],
                                                "jdbcUrl""jdbc:mysql://x.x.x.x:3306/test"
                                        }]
                                }
                        }
                }]
        }
}

josn配置文件解释:

postgresqlreader:
"fetchSize":"2048"   每次获取2048条数据量

运行datax命令及结果

python datax.py gp2mysql.json

结果分析:一共进行100万数据的同步,耗时20秒,读取性能比插入性能高,同时观察数据库文件日志情况,同样也是增长很大。


4 使用数据库自身工具同步数据从mysql到GreenPlum
mysql导出文件,耗时3.1秒

使用copy方式把文件入库到GreenPlum,耗时1.1秒

使用gifdist外部表方式把文件入库到GreenPlum,耗时0.1秒

外部表方式实现代码

# gpfdist -d /tmp -p 8100
drop EXTERNAL table ext_yejf;
CREATE EXTERNAL TABLE ext_yejf
(
like yejf
)
LOCATION ('gpfdist://x.x.x.x:8100/yejf.txt')
FORMAT 'TEXT' (delimiter E'\x09' null 'NULL' escape'/' )
ENCODING 'utf8';
insert into yejf select * from ext_yejf;


可以看到使用数据库的工具结合起来,copy方式耗时一共4.2秒,外部表方式3.2秒,相对datax方式耗时101秒,性能有很大的提升。


5 总结

使用Datax方式读写GreenPlum时,会有以下几个问题:

  • 导致数据库文件日志迅速增长,远远超过表的大小

  • MASTER压力大,特别是在并发执行Datax程序时,有可能使master出现OOM情况

  • 速度慢,相比数据库的ETL工具,效率是极其低下的

  • 大表同步到GreenPlum时,用外部表方式最好

优点:

  • 方便,只需要配置json文件,就可以实现各种异构数据源之间的数据同步


  如果使用datax同步数据库到GreenPlum,建议使用HashData开源的Datax,它在阿里的Datax基础上开发了gpdbwriter插件,其内部是使用copy命令同步到GreenPlum库。


文章转载自叶同学专栏,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论