使用DataX进行OTS实例间数据迁移
表格存储是 NoSQL 的数据存储服务,是基于云计算技术构建的一个分布式结构化和半结构化数据的存储和管理服务。表格存储的数据模型以二维表为中心。表有行和列的概念,但是与传统数据库不一样,表格存储的表是稀疏的,每一行可以有不同的列,可以动态增加或者减少属性列,建表时不需要为表的属性列定义严格的 schema。
1. 概述
OTS的数据迁移可以使用DataX完成全量数据迁移。但由于部分数据表的数据量较大,无法在指定的窗口内完成全量迁移,且目前DataX只能针对主键值进行范围查询,暂不支持按照属性列范围抽取数据。所以可以按如下两种方式实现全量+增量的数据迁移:
- 分区键包含范围信息(如时间信息、自增ID),则以指定range为切分点,分批次迁移;
- 分区键不包含范围信息,则可以采用在应用侧双写的模式将数据分批次迁移,写入目标环境同一张业务表。利用OTS的主键唯一性,选择对重复数据执行覆盖原有行的策略来保证数据唯一性;
本文以应用侧调整为双写模式为例,详细说明OTS数据迁移、校验过程。其中OTS数据迁移流程具体如下所示:
1) 预迁移阶段:双写模式中的大表全量迁移。
2) 正式迁移阶段:双写模式中的增量表全量迁移、其余小表的全量迁移。
2. 预迁移阶段
2.1 准备工作
为保证新老环境的数据一致性,需要在开始数据迁移前,对目标环境的OTS数据表进行数据清空操作,Delete操作是通过Datax工具直接删除表内数据,无需重新建表。具体操作如下:
2.1.1 配置datax任务
在使用datax执行数据清空前,需配置对应数据表使用datax执行delete任务所需的json文件。在清空数据的配置中,reader与writer均配置目标端的连接信息,且数据写入模式配置DeleteRow即可,具体内容如下。
{ "job": { "setting": { "speed": { "channel": "5" } }, "content": [{ "reader": { "name": "otsreader", "parameter": { "endpoint": "http://xxx.vpc.ots.yyy.com/", "accessId": "dest_accessId", "accessKey": "dest_accessKey", "instanceName": " dest_instanceName", "table": " tablename ", "column": [{ "name": "xxxxx" }, { "name": "xxxxx" } ], "range": { "begin": [{ "type": "INF_MIN" }], "end": [{ "type": "INF_MAX" }] } } }, "writer": { "name": "otswriter", "parameter": { "endpoint": "http://xxx.vpc.ots.yun.yyy.com/", "accessId": "dest_accessId", "accessKey": "dest_accessKey", "instanceName": " dest_instanceName", "table": " tablename ", "primaryKey": [{ "name": "xxxxx", "type": "string" }], "column": [{ "name": "xxxxx", "type": "string" }, { "name": "xxxxx", "type": "string" } ], "writeMode": "DeleteRow" } } }] } }
2.1.2 执行datax任务
- 登录datax所在ECS后,进入datax所在路径
- 在对应的工具机分别执行del_pre.sh脚本,即可开始目标环境对应表的数据清空,具体命令如下:
sh del_pre.sh
del_pre.sh脚本内容如下:
#!/bin/bash nohup python datax.py del_table_1.json --jvm="-Xms16G -Xmx16G" > del_table_1.log &
2.2 数据迁移
在不停服务的情况下把源环境内数据量较大的数据表全部迁移到目标环境内对应的数据表。
2.2.1 配置datax任务
在datax对数据表配置相应的json文件,迁移配置的具体内容如下:
需注意,由于OTS本身是NoSQL系统,在迁移数据的配置中,必须配置所有的属性列,否则会缺失对应属性列的值。
{ "job": { "setting": { "speed": { "channel": "5" } }, "content": [{ "reader": { "name": "otsreader", "parameter": { "endpoint": "http://xxx.vpc.ots.yyy.com/", "accessId": "src_accessId", "accessKey": "src_ accessKey ", "instanceName": " src_instanceName", "table": "tablename", "column": [{ "name": "xxxxx" }, { "name": "xxxxx" } ], "range": { "begin": [{ "type": "INF_MIN" }], "end": [{ "type": "INF_MAX" }] } } }, "writer": { "name": "otswriter", "parameter": { "endpoint": "http://xxx.vpc.ots.yun.zzz.com/", "accessId": "dest_accessId", "accessKey": "dest_accessKey", "instanceName": " dest_instanceName", "table": " tablename ", "primaryKey": [{ "name": "xxxxx", "type": "string" }], "column": [{ "name": "xxxxx", "type": "string" }, { "name": "xxxxx", "type": "string" } ], "writeMode": "PutRow" } } }] } }
2.2.2 执行datax任务
- 登录datax所在ECS后,进入datax所在路径
- 在对应的工具机分别执行pre_transfer.sh脚本,即可开始专有域OTS到专有云OTS的数据迁移,具体命令如下:
sh pre_transfer.sh
- pre_transfer.sh脚本内容如下:
#!/bin/bash nohup python datax.py table_1.json --jvm="-Xms16G -Xmx16G" >table_1.log &
3. 正式迁移阶段
3.1 OTS数据静默
OTS的数据静默主要是通过观察对应表的数据是否存在变化来判断,校验方式主要包括行数统计、内容统计。
3.1.1 行数统计
因OTS本身不提供count接口,所以采用在hive创建OTS外部表的方式,读取OTS数据并计算对应数据表的行数,具体操作如下:
- 创建外部表
启动hive,创建上述数据表对应的外部表;为提高统计效率,外部表可以只读取OTS的主键列,建表语句示例如下:
CREATE EXTERNAL TABLE t_oilcard_expenses_old (h_card_no string) STORED BY 'com.aliyun.openservices.tablestore.hive.TableStoreStorageHandler' WITH SERDEPROPERTIES( "tablestore.columns.mapping"="card_no") TBLPROPERTIES ("tablestore.endpoint"="$endpoint ","tablestore.instance"="instanceName","tablestore.access_key_id"="ak","tablestore.access_key_secret"="sk","tablestore.table.name"="tableName");
- 进入脚本所在路径
登录Hadoop集群master所在ECS,进入hive所在目录; - 执行行数统计
执行pre_all_count.sh脚本,即可开始源环境内OTS对应表的行数统计;
nohup sh pre_all_count.sh >pre_all_count.log &
- pre_all_count.sh脚本内容如下:
#!/bin/bash ./bin/hive -e "use ots;select count(h_card_no) from tableName;" >table.rs &
连续执行两次行数统计,若两次统计结果一致则说明数据已经静默,数据写入以停止;
3.1.2 内容统计
由于部分数据表分区键对应的值比较单一,导致数据全部存储在同一个分区。若采用hive统计行数会耗时太久,所以对于这个表使用datax将OTS数据导入oss的方式进行内容统计,具体操作如下:
- 进入脚本所在路径
登录上述表格对应的ECS,进入datax所在路径; - 执行内容校验
1) 执行check_table.sh脚本,即可将源环境内OTS数据表导出到OSS;
sh check_table.sh
- check_table.sh脚本内容如下:
#!/bin/bash nohup python datax.py table.json --jvm="-Xms8G -Xmx8G">ots2oss01.log &
2) 获取OSS object的ETAG值,写入对应文件table_check01.rs
连续执行两次内容统计,对比两次导出object的ETAG值,若结果一致则说明数据已经静默,数据写入以停止;
3.2 OTS数据迁移
3.2.1 准备工作
为保证迁移后新老环境数据一致,防止目标环境因测试产生遗留脏数据,在进行数据迁移前,需要将目标环境的OTS的其余全量表进行数据清空。数据清空方式主要有drop、delete,两者的区别如下:
操作方式 | 优势 | 劣势 | 建议 |
---|---|---|---|
Drop | 耗时短 | 需重新建表 新表分区数需重新扩展 | 分区数为1的数据表建议选择drop |
Delete | 分区数保留 | 耗时较长 | 需要保留分区数提升迁移速率的表建议选择delete |
3.2.1.1 Drop表操作
- 登录OTS图形化客户端所在工具机,使用如下信息连接指定OTS实例,并进行对应表的drop操作;
AK: dest_accessId SK: dest_accessKey InstanceName: InstanceName Endpoint:endpoint
确认删除后,再在客户端重新创建对应的数据;
3.2.1.2 Delete表操作
Delete操作是通过Datax工具直接删除表内数据,无需重新建表。Datax所需的配置文件参考2.1.1所示。
- 登录datax所在ECS后,进入datax所在路径
- 在对应的工具机分别执行delete脚本,即可开始目标环境OTS的对应表的数据清空,具体命令如下:
sh del_table_01.sh
- del_table_01.sh脚本内容如下:
#!/bin/bash nohup python datax.py del_table.json --jvm="-Xms16G -Xmx16G">del_table.log &
3.2.2 数据迁移
在源环境停止服务的情况下把双写模式中的增量表全量迁移以及其余小表全部迁移到目标环境内对应的数据表。
具体操作如下:
3.2.2.1 配置datax任务
在datax对上述数据表配置相应的json文件,迁移配置的具体内容参考2.2.1,在迁移数据的配置中,需要列全所有的属性列。
3.2.2.2 执行datax任务
- 登录datax所在ECS后,进入datax所在路径
- 在对应的工具机分别执行transfer.sh脚本,即可开始专有域OTS到专有云OTS的数据迁移,具体命令如下:
sh transfer.sh
- transfer.sh脚本内容如下:
#!/bin/bash nohup python datax.py Table.json >Table.log &
3.3 OTS数据校验
新老环境OTS的数据校验方式均包括行数统计、内容统计,具体如下。
3.3.1 源环境数据统计
源环境OTS数据表的数据量统计依据数据静默期间最后一次的统计结果即可。
3.3.2 目标环境数据统计
3.3.2.1 行数统计
因OTS本身不提供count接口,且目标环境ODPS支持创建OTS外部表,所以采用在ODPS创建OTS外部表的方式,读取OTS数据并计算对应数据表的行数,具体操作如下:
- 创建外部表
登录odpscmd,创建上述数据表对应的外部表; - 进入脚本所在路径
登录odpscmd工具所在ECS,进入odps所在路径; - 执行行数统计
执行newots_count.sh脚本,即可进行目标环境内OTS对应表的行数统计;
nohup sh newots_count.sh >newots_count.log &
- newots_count.sh脚本内容如下:
#!/bin/bash ./bin/odpscmd -e "select count(h_card_no) from tableName;" >table.rs &
3.3.2.2 内容统计
由于源环境的部分数据表采用内容统计的方式进行数据校验,为了方便对比数据是否一致,所以目标环境也采用内容统计的方式,具体操作参考3.1.2。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
阿里巴巴JAVA面试后的个人总结与反思
一面这周获得了阿里巴巴的面试邀请,应聘的岗位为支付宝内某IOT部门的JAVA软件工程师。面试时间是通过电话面试1天后通知我的,地点为高端的上海大厦。 接到面试通知后的我,即高兴又有些胆怯。高兴的是:全国数一数二的大厂会给我一份面试机会,证明我的某些地方还是受到了面试人员的初步肯定;胆怯的是早就听说阿里巴巴这样的大厂要求很高,非等闲之辈很难进去,对于自己的技术知识信心感觉不足。 面试当天的下午,按照能到达的面试时间乘着地铁到达了陆家嘴地铁站,由于是第一次参加这样的大厂面试,一路上的我非常紧张激动了。出地铁后,我遍只身向上海中心大厦走去(还好以前无聊时去陆家嘴转悠过几次,陆家嘴区域中最高直上云霄的那坐旋转大厦遍是,要不然又得用步行导航了)。健步如飞的我在办理好了证件后顺利到达第N层楼,出电梯一看,“支付宝”三个大字映入门帘,想着终于见到了
- 下一篇
阿里巴巴Java开发手册———个人追加的见解和补充(一)
先上干货,《阿里巴巴Java开发手册》的下载地址https://yq.aliyun.com/articles/69327下面分几个部分对这个手册进行说明,都是个人的见解,本人技术一般,如果有错误或者不妥,请评论指出,虚心接受,提前感谢了。 建议边看手册,边食用以下说明,效果比较好。 前言首先当我第一次看见这个的手册的时候或许和和你们是一样激动的,因为在java行业内我还没有看见有中文的规范,也可能是我读书少。总之,这是我见到的第一个中文的java规范。 首先还是要感谢阿里能给出这样一个规范,万事还是要怀有感恩的嘛,毕竟也是别人努力的结果。 首先没有规矩不成方圆,我觉得有了规矩,才能让大家的代码可读性和鲁棒性上面有所提高。而且规矩这东西是慢慢形成的,如果之后行业内的规范越来越相同的话那么互相交流也变的方便了不少。 然后要说明的是,规矩也是人定
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- Hadoop3单机部署,实现最简伪集群
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2整合Redis,开启缓存,提高访问速度