
1. DataX是什么 DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、OTS、ODPS 等各种异构数据源之间高效的数据同步功能。 DataX本身作为数据同步框架,将不同数据源的同步抽象为从源头数据源读取数据的Reader插件,以及向目标端写入数据的Writer插件,理论上DataX框架可以支持任意数据源类型的数据同步工作。同时DataX插件体系作为一套生态系统, 每接入一套新数据源该新加入的数据源即可实现和现有的数据源互通。 2. 何时用DataX DataX是离线数据同步工具,当需要迁移增量时,建议使用DTS,而不是DataX; 针对离线数据,当数据量很大或表非常多时,建议使用DataX。此时配置文件可编写脚本批量生成,详见ODPS数据迁移指南。同时可以增大DataX本身的并发,并提高运行DataX的任务机数量,来达到高并发,从而实现快速迁移; 3. DataX怎么用 3.1 DataX的配置文件 如下是DataX的配置文件示例: { "job": { "content":[ { "reader":{ "name":"odpsreader", "parameter":{ "accessId":"<accessID>", "accessKey":"******************************", "column":[ "col_1", "col_2" ], "odpsServer":"http://service.odps.aliyun-inc.com/api", "partition":[ "dt=20160524" ], "project":"src_project_name", "splitMode":"record", "table":"table_name_1" } }, "writer":{ "name":"odpswriter", "parameter":{ "accessId":"<accessId>", "accessKey":"******************************", "accountType":"aliyun", "column":[ "ci_name", "geohash" ], "odpsServer":"http://service.odps.xxx.com/api", "partition":"dt=20160524", "project":"dst_project_name", "table":"nb_tab_http" } } } ], "setting":{ "speed":{ "channel":20 } } } } 整个配置文件是一个job的描述; job下面有两个配置项,content和setting,其中content用来描述该任务的源和目的端的信息,setting用来描述任务本身的信息; content又分为两部分,reader和writer,分别用来描述源端和目的端的信息; 本例中由于源和目的都是ODPS,所以类型为odpsreader和odpswriter。均包含accessId,accessKey与odpsServer的api地址。 同时预迁移表的project,table以及列名和分区信息都要一一填写清楚。 setting中的speed项表示同时起20个并发去跑该任务。 3.2 运行Datax任务 运行Datax任务很简单,只要执行python脚本即可。 python /home/admin/datax3/bin/datax.py ./json/table_1.json 运行后,可在终端查看运行信息。建议真正跑任务时,可按照ODPS迁移指南中给出的批量工具的方式运行。即将所有的命令整理到一个sh文件中,最后再用nohup运行该文件。 cat /root/datax_tools/run_datax.sh python /home/admin/datax3/bin/datax.py ./json/table_1.json > ./log/table_1.log #实际运行 nohup /root/datax_tools/run_datax.sh > result.txt 2>&1 & 4. DataX调优 DataX调优要分成几个部分,任务机指运行Datax任务所在的机器。 网络本身的带宽等硬件因素造成的影响; DataX本身的参数; 从源端到任务机; 从任务机到目的端; 即当觉得DataX传输速度慢时,需要从上述四个方面着手开始排查。 4.1 网络本身的带宽等硬件因素造成的影响 此部分主要需要了解网络本身的情况,即从源端到目的端的带宽是多少,平时使用量和繁忙程度的情况,从而分析是否是本部分造成的速度缓慢。一下提供几个思路。 可使用从源端到目的端scp的方式观察速度; 结合监控观察任务运行时间段时,网络整体的繁忙情况,来判断是否应将任务避开网络高峰运行; 观察任务机的负载情况,尤其是网络和磁盘IO,观察其是否成为瓶颈,影响了速度; 4.2 DataX本身的参数 可通过增加如下的core参数,去除掉DataX默认对速度的限制; { "core":{ "transport":{ "channel":{ "speed":{ "record":-1, "byte":-1 } } } }, "job":{ ... } } 针对odpsreader有如下参数可以调节,注意并不是压缩速度就会提升,根据具体情况不同,速度还有可能下降,此项为试验项,需要具体情况具体分析。 ... “parameter”:{ "isCompress":"true", ... } 针对odpswrtier有如下参数可以调节,其中isCompress选项同reader,blockSizeInMB,为按块写入,后面的值为块的大小。该项值并不是越大越好,一般可以结合tunnel做综合考量。过分大的 blockSizeInMB 可能造成速度波动以及内存OOM。 ... “parameter”:{ "isCompress":"true", "blockSizeInMB":128, ... } 针对任务本身,有如下参数可以调节,注意如果调整了tunnel的数量,可能会造成JVM虚拟机崩溃,故需修改相应的参数; "job": { "setting": { "speed": { "channel": 32 } } channel增大,为防止OOM,需要修改datax工具的datax.py文件。如下所示,可根据任务机的实际配置,提升-Xms与-Xmx,来防止OOM。由此可以看出,tunnel并不是越大越好,过分大反而会影响宿主机的性能。 DEFAULT_JVM = "-Xms1g -Xmx1g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=%s/log" % (DATAX_HOME) 4.3 从源端到任务机 可使用dataX从源端传输分区信息到本机,来观察速度。并和初始任务的速度进行比较,从而判断是哪一部分的原因造成的速度缓慢;具体配置文件如下: "writer": { "name": "txtfilewriter", "parameter": { "path": "/root/log", "fileName": "test_src_result.csv", "writeMode": "truncate", "dateFormat": "yyyy-MM-dd" } } 试验时,注意观察任务机本身的IO负载。 如果判断结果是源端的速度慢,可将任务机迁移至源端所在的集群,并再次运行任务,观察结果; 可尝试用odpscmd,直接从源端odps下载分区到本地,和上述结果作比较。如果odpscmd速度快,可尝试调整datax的相关参数; odpscmd --config=odps_config.ini.src tunnel download -thread 20 project_name.table_name/dt='20150101' log.txt; 如果是在专有云环境可尝试指定源端的tunnel server的ip进行测试,从而排除从域名到负载均衡部分的网络造成的影响。源端的tunnel server的ip需要咨询云端管理员。 ...“parameter”:{ "tunnelServer":"http://src_tunnel_server_ip", ... } 注意此步骤可选择负载较低的tunnel_server。 观察源端tunnel server的负载情况,尤其是磁盘IO和网卡的负载,从而判断是否为tunnel sever负载过高造成了资源瓶颈。 观察源端的表结果,当有多个分区键或列过多时,都有可能造成传输的性能下降,此时可考虑换一张表进行测试,以排除表结构等问题造成的影响。 4.4 从任务机到目的端 可使用datax从任务机传输文件分区文件到目的端,来观察速度。并和初始任务的速度进行比较,从而判断是哪一部分的原因造成的速度缓慢;具体配置文件如下: "reader": { "name": "txtfilereader", "parameter": { "path": ["/home/haiwei.luo/case00/data"], "encoding": "UTF-8", "column": [ { "index": 0, "type": "long" }, { "index": 1, "type": "boolean" }, { "index": 2, "type": "double" }, { "index": 3, "type": "string" }, { "index": 4, "type": "date", "format": "yyyy.MM.dd" } ], "fieldDelimiter": "," } }, 如果判断结果是源端的速度慢,可将任务机迁移至源端所在的集群,并再次运行任务,观察结果; 可尝试用odpscmd,直接从本地上传分区到目的端,和上述结果作比较。如果odpscmd速度快,可尝试调整datax的相关参数; odpscmd --config=odps_config.ini.src tunnel upload ./log.txt mingxuantest/pt='20150101'; 如果是在专有云环境可尝试指定指定端的tunnel server的ip进行测试,从而排除从域名到负载均衡部分的网络造成的影响。源端的tunnel server的ip需要咨询云端管理员。 ...“parameter”:{ "tunnelServer":"http://dst_tunnel_server_ip", ... } 注意此步骤可选择负载较低的tunnel_server。 观察源端tunnel server的负载情况,尤其是磁盘IO和网卡的负载,从而判断是否为tunnel sever负载过高造成了资源瓶颈。 4.5 综合 通过对DataX本身参数,源端到任务机、任务机到目的端的网络、负载等情况综合考量,进行针对各个部分的优化; 同时,可在多台机器上部署DataX,将任务平均分配到多台机器上并发运行,来提高速度;
1. 背景调研 1.1 ODPS源与目的集群 调研项 内容 ODPS源集群版本 ODPS目的集群版本 ODPS源与目的是否在一个集群/可使用相同账号 ODPS源集群AccessKeyId ODPS源集群AccessKeySecret ODPS目的集群AccessKeyId ODPS目的集群AccessKeyIdSecret 1.2 预迁移数据统计 所属Project 表名 大小 是否要迁移增量 Project1 Table1 Desc查看表大小 2. 工具选择与方案确定 目前有四种方式可用于ODPS的数据迁移。 如果源与目的ODPS在一个集群,或可使用相同账号,则推荐使用ODPS COPY TASK的方式进行迁移; 如果表的数量少,可通过手动建立CDP任务的方式进行迁移; 如果表的数量多,可通过调用Base CDP API接口的方式批量建立CDP任务,但目前此API接口还不成熟,和页面有较多关联; 如果是不同集群,不同账号体系下的ODPS数据迁移,则采用使用Datax工具进行迁移,迁移所需的配置文件,可用脚本批量生成; 3. 具体实施 3.1 表(分区)结构迁移 本部分操作,可通过调用ODPS的SQL来完成。具体可编写程序,调用ODPS SDK或ODPS cmd工具来进行。对预迁移的表,在源ODPS中获取表结构,根据表结构,在目标ODPS中批量运行组装好的建表语句,即可完成。 3.1.1 要迁移的表名梳理 根据1.2中调研结果,梳理出表名列表; 此步骤,也可使用show tables语句获取表名,然后将临时表等不需要迁移的表名去除; 3.1.2 生成DDL建表(分区)语句 此步骤操作,在ODPS源端进行,可使用ODPS CMD工具。其配置文件位于config/odps_config.ini,配置项如下: project_name= access_id=<accessid> access_key=<accesskey> end_point=http://service.odps.aliyun.com/api 这里注意,专有云环境下的end_point需要联系专有云管理人员获取。 在Bash环境下,执行如下示例语句,导出表结构。请根据实际情况改写shell语句,例如读取表名列表文件等。这里的odps_config.ini.src是源端ODPS的配置文件。 for table in tab1 tab2 tab3 do odpscmd --config=odps_config.ini.src -e "export table $table "|awk -F ':' '{print $2}' >>tab.ddl done 3.1.3 建立对应表(分区) 将ODPS CMD的配置文件配置成目的ODPS,然后执行如下实例语句。这里的odps_config.ini.dst是目的端ODPS的配置文件。 odpscmd --config=odps_config.ini.dst -f tab.ddl 3.2 数据迁移 3.2.1 使用ODPS TASK COPY 注意使用该工具的前提是在同一ODPS集群,或具有相同的账号。示例语句如下所示,请按照实际情况进行修改。 for table in tab1 tab2 tab3 do odpscmd --config=odps_config.ini.dst -e "copy -d import -t proj_i.$table -url=http://src_odps_tunnel_endpoint/proj_p/$table -a" & done src_odps_tunnel_endpoint指源ODPS的tunnel endpoint,专有云环境下,请联系云管理人员获取。odps_config.ini.dst同上只目的端odps 的配置。Copy命令的解释如下,有助于帮助使用和理解该命令。 copy [-a 或-o] -d [import 或 export] -url [TUNNEL 服务的 url 地址] -t [本地 ODPS 表名] -p [本地 ODPS 分区名] -e [远端 ODPS]; -a (追加模式)把数据附加到目标表已有数据之后 -o (覆盖模式)目标表已有数据被删除,新数据进入目标表 -d IMPORT或EXPORT。IMPORT表示数据从远端集群导入本地集群,EXPORT 表示数据从本地集群导入远端 集群 -url TUNNEL 服务的url地址,其中包含 Project 名,表名和分区名(如果是分区表的话) -t 本地ODPS集群的表名 -p 本地ODPS集群的分区名,如果该表没有分区,该选项被省略 -e 远端ODPS的访问点(end point) append(-a)和overwrite(-o)的语义很明确,不过tunnel其实是只支持append操作的,所以-o 命令只不过是帮你执行了一下alter table drop partition然后add partition的操作。 -url 指定的是tunnel地址,分区表的写法http://odps_endpoint_tunnel/prj_name/table_name/month=1,day=1,不需要写引号,多级分区用逗号分隔。 -t 可以写成project_name.table_name的名字 -p 分区名称不需要写引号,多级分区逗号分隔 -e 当前tunnel支持路由功能,copy task将使用-e指定的远端odps endpoint路由到对应的tunnel endpoint 以下举个例子。从源ODPS的 project_a.table_a,分区是ds='ds1'/pt=‘pt1’,导入到目的生产的project_b.table_b,分区是ds='ds2'/pt='pt2',在目的生产的ODPS CMD上运行: copy -o -d import -url http://dt-all.ext.odps.aliyun-inc.com/project_a/table_a/ds=ds1,pt=pt1 -t project_b.table_b -p ds=ds2,pt=pt2 -e http://service-all.ext.odps.aliyun-inc.com/api; 3.2.2 使用DataX工具 本步骤利用DataX工具进行数据迁移,DataX是阿里巴巴集团内被广泛使用的离线数据同步工具。利用datax批量配置工具来生成对应的脚本和json文件。本步骤流程如下: 进行环境的准备,本步骤需要在迁移机上安装odpscmd与datax工具,其中datax工具和datax批量工具需要python2.6及以上的运行环境; 在datax批量工具的config.ini中进行相关配置,包括源与目的ODPS的accessID与key、odps及tunnel的endpoint、odpscmd与datax的路径等信息; 在tables.ini中填写调试用到的表列表; 运行python datax_tools.py生成对应的脚本和json配置文件; 检查脚本与json配置文件; 运行run_datax.py脚本,批量顺序执行datax任务; 运行check_datax.py脚本,进行条数的检查; 3.2.2.1 批量配置工具 批量配置工具的流程如下: 配置源与目的端的基础信息; 读取并校验源与目的端的表结构和分区信息; 根据校验结果,生成DataX所需的json文件; 生成顺序运行Datax迁移命令的脚本文件; 利用select count(*)的方式进行条数检查; 代码示例详见Datax批量工具,可自行修改优化。 3.2.2.2 DataX使用与调优 本部分详见Datax的使用文档。
EDAS的开发框架、数据库连接和操作,确实需要自己来做。EDAS只负责服务发布和轻量级微服务解决方案。具体可以参考demo https://help.aliyun.com/document_detail/44168.html?spm=a2c4g.11186623.6.638.BxmwGD
请检查terminal的编码方式,尽量使用UTF-8,宽字符
亲,可以使用desc查看相关元数据信息。
desc ;
desc extended ;--查看外部表信息
具体的返回元数据如下所列:
返回指定表的信息,具体返回包括以下信息:
Owner(表的属主)。
Project:表所属的项目空间。
CreateTime:创建时间。
LastDDLTime:最后一次 DDL 操作时间。
LastModifiedTime:表中的数据最后一次被改动的时间。
InternalTable:表示被描述的对象是表,总是显示 YES。
Size:表数据所占存储容量压缩后的大小,压缩比一般为 5 倍,单位 Byte。
Native Columns:非分区列的信息,包括:列名,类型,备注。
Partition Columns:分区列信息,包括:分区名,类型,备注。
Extended Info: 外部表StorageHandler 、Location 等信息。
亲,如果ECS和RDS在一个可用区,内网互通的情况下,可以直接使用RDS的内网地址进行连接。如果不在一个可用区,内网不通的情况下,则需要使用RDS的公网地址进行连接。RDS的公网地址和私网地址,在RDS的管理控制台中可以查询
使用的kafka的版本比较旧,建议更换新版本、新API
亲,应该在轻量级应用服务器的产品里找,地址为:https://swas.console.aliyun.com
入口可以在https://www.aliyun.com/product/swas?spm=5176.8142029.388261.445.681a76f4f4MepL 产品介绍页,点击管理控制台可以看到
EDAS的开发框架、数据库连接和操作,确实需要自己来做。EDAS只负责服务发布和轻量级微服务解决方案。具体可以参考demo https://help.aliyun.com/document_detail/44168.html?spm=a2c4g.11186623.6.638.BxmwGD