最佳实践

增量同步(过滤)

本节使用MySQL作为示例,演示了如何利用数栈对MySQL的某张表进行增量同步:
进行增量同步的步骤,除了基础的字段映射之外,关键是在数栈同步任务的第一步数据来源数据过滤表单中填写过滤条件,下面分几种情况举例如何填写过滤条件:

MySQL建表语句如下:

create table if not EXISTS filterData(
  id int auto_increment,
  mod_time datetime
)

且存储的数据为: image::filterMysql.png[]

  • 天增量抽取

-- 抽取昨天数据
date(modtime)=DATE_FORMAT('${bdp.system.bizdate}','%Y-%m-%d');
  • 小时增量抽取

-- 抽取设定的时间,前3小时至前1小时的数据,例如任务定时时间是19:00运行,则会抽取:[16:00~18:00)的数据
SELECT
id,
  modtime
FROM
  filterdata
WHERE
  modtime >= DATE_ADD( DATE_FORMAT( '${bdp.system.cyctime}', '%Y-%m-%d %H' ), INTERVAL - 3 HOUR )
  AND modtime < DATE_ADD( DATE_FORMAT( '${bdp.system.cyctime}', '%Y-%m-%d %H' ), INTERVAL - 1 HOUR );
  • 半小时增量抽取

-- 抽取设定的时间,前半小时的数据,例如任务定时时间是19:00运行,则会抽取:[18:30~19:00)的数据
SELECT
  id,
  modtime
FROM
  filterdata
WHERE
  modtime >= DATE_ADD( DATE_FORMAT( '${bdp.system.cyctime}', '%Y-%m-%d %H:%i' ), INTERVAL -30 MINUTE )
  AND modtime < DATE_FORMAT( '${bdp.system.cyctime}', '%Y-%m-%d %H:%i' );
  • 月增量抽取

-- 抽取上个月,整月的数据,例如任务定时时间是2018-01-01 12:12:12运行,则会抽取:[2017-12-01 00:00:00 2018-01-01 00:00:00)的数据
SELECT
  id,
  modtime
FROM
  filterdata
WHERE
  modtime >= DATE_ADD( DATE_FORMAT( '${bdp.system.bizdate}', '%Y-%m-%d' ), INTERVAL -1 MONTH )
  AND modtime < DATE_FORMAT( '${bdp.system.bizdate}', '%Y-%m-%d' );

MySQL数据库增量同步

数据源管理的数据源配置后,数栈即可以从已配置的数据源中读取或写入数据。下面以MySQL→HDFS,并由数栈访问HDFS中的数据为例,介绍操作流程:

MySQL导入HDFS

进入 数据开发模块,进行如下配置:

  1. 数据来源: 类型选择MySQL,并选中刚刚配置的数据源 dataSourceExample ,选择其中的表 tableAge ,数据过滤规则、切分键不填写。

  2. 选择目标:类型选择HDFS,并选中刚刚配置的数据源hdfsSourceExample,其他配置参数为:

    1. 路径:需要填写的格式为 user/hive/warehouse/项目名称.db

    2. 分隔符:用户自定义,或者不填写,不填写时,会采用HIVE默认的分隔符 \001

    3. 编码:可选择UTF-8或GBK。

    4. 文件名:这里实际上填写的是hive中的表名(本例子中填写为 tableNameAge )。

    5. 文件类型:支持TEXT和ORC类型。

    6. 主键冲突规则:即执行数据同步时,若出现主键冲突,则报错或忽略。

  3. 字段映射: 通过映射的方式,将左右2侧的字段映射起来,用户可通过同名映射或同行映射快速配置。对于HDFS文件,可能出现无法读取字段的问题,用户需手动配置每个HDFS字段。

  4. 配置调度周期与依赖关系:在右侧的任务面板中配置任务的生效日期、调度日期、起调时间、需依赖的上游任务、自依赖等信息,详细配置方式请参考 调度属性配置

  5. 发布任务:确认任务信息无误后,提交执行,发布成功后,此任务不会立即执行,而是会在当天(或第二天)的22:00生成任务实例,待执行条件满足后才执行,如果需要数据同步任务立即执行,请参考 运行任务中的补数据

执行数据同步任务

任务提交成功后,为了立即执行,需在 任务管理中设置补数据任务,即可立即进行数据同步。

新建hive表,并读取数据

任务管理模块中进行如下操作:

  1. 点击新建表,建立内部表外部表,内部表与外部表的区别请参考 QA。或点击DDL建表,通过SQL的形式建表。

  2. 新建表的表名,必须与MySQL导入HDFS中的文件名对应,否则会导致无法关联到对应的文件,造成表中没有数据。

  3. 新建表的编码格式,路径等信息,也必须与MySQL导入HDFS中的编码格式路径对应起来,否则会造成无法关联到对应的文件,造成表中没有数据或编码错误。

  4. 新建表的字段信息,必须与数据同步任务中的字段对应,否则会造成无法关联到对应的文件。

  5. 建表成功后,即实现当前表与HDFS数据之间的关联,即可以在数据开发中的任意一个SQL查询到数据。

新建hive表的注意事项新建hive表,并读取数据与执行数据同步任务两个步骤不区分先后顺序,但数据同步任务时填写的路径、文件名、编码等参数需要与建hive表时的路径、表名、编码对应起
在本例中,主键冲突规则的配置生效,是依赖于MySQL中 tableAge 的主键,