由于blog各种垃圾评论太多,而且本人审核评论周期较长,所以懒得管理评论了,就把评论功能关闭,有问题可以直接qq骚扰我

streamset 实时同步mysql binlog到kudu

大数据 西门飞冰 4521℃

背景

业务数据库中有一些mysql表,这些表的记录会被增删改,我们的需求是需要吧这些mysql表实时同步到大数据数仓的impala中,作为数仓的维表来进行使用,因此需要实时的反映这些表的变化情况。

StreamSets Data Collector(SDC)是目前最先进的可视化数据采集配置工具,非常适合做实时的数据采集,兼顾批量数据采集和不落地的数据ETL。如果您正在使用Flume、Logstash、Sqoop、Canal等上一代数据采集工具,推荐您使用SDC作为升级替换。

安装

安装可以参考官方文档,我用的cloudera manager进行安装的,过程非常简单

http://streamsets.vip/?page_id=196

streamset 配置

streamset连接mysql,需要配置mysql的驱动,一共需要放置两个,一个用来全量同步mysql 数据,一个通过增量的binlog方式同步mysql数据

1、服务器 安装mysql jdbc 驱动器

~]# tree /opt/sdc-extras/
/opt/sdc-extras/
├── streamsets-datacollector-jdbc-lib
│   └── lib
│       └── mysql-connector-java-5.1.41.jar
└── streamsets-datacollector-mysql-binlog-lib
    └── lib
        └── mysql-connector-java-8.0.13.jar

2、streamset 修改配置文件添加扩展目录

(1)sdc-security.policy Data Collector 高级配置代码段(安全阀)

grant codebase "file:///opt/sdc-extras/-" {
permission java.security.AllPermission;
};

(2)sdc-env.sh Data Collector 高级配置代码段(安全阀)

export STREAMSETS_LIBRARIES_EXTRA_DIR="/opt/sdc-extras/"

3、配置合理的jvm 内存:sdc-env.sh Data Collector 高级配置代码段(安全阀)

export SDC_JAVA_OPTS="-Xmx10g  -Xms10g"

binlog采集到impala配置说明

  • impala 不直接存储数据,一般是使用hive数据,或者kudu数据,我们这里的需求实现是先把mysql 数据同步到kudu中,然后在用impala外部表的方式关联查询
  • 一般在配置mysql binlog日志实时进入kudu之前,mysql 数据都是在生产运行了一段时间的,积攒了一定程序的历史数据,这些数据的binlog日志正常情况下已经被清理掉了,所以在配置mysql 实时采集binlog日志的同时,需要先全量同步一份mysql 数据到kudu中,然后在根据mysql binlog位置实时同步数据。

全量收集mysql 数据到kudu

mysql 源端配置

image001

image002

kudu 目标端配置

image003 image004

配置完成之后,点击start 实时流即可进行数据的全量同步

启动之后可以根据streamset自带的图标获取到同步的数据量情况

image005

mysql binlog 收集到kudu配置

mysql 源端配置

image006 image007

 

Field Renamer配置

设置一下源字段和目标字段的对应关系

image008

kudu 目标端配置

image009

生产实践

mysql和 kudu数据的一致性保证

1、先记录当前mysql的binlog 位置

2、通过streamset 先全量同步数据到kudu

3、在通过streamset 实时同步增量数据到kudu(binlog 初始位置为第一步mysql记录的位置)

同步mysql 表结构到kudu

可以使用cloudcanal 同步表结构

后续使用impala 外部表的方式 关联kudu 数据到数仓进行查询

tinyInt 问题

如果mysql 中有tinyint 字段,在写入kudu的时候会报错

KUDU_09 – Field ‘/deleted’ does not match destination type ‘BYTE’: com.streamsets.pipeline.api.impl.TypeSupportConversionException: Cannot convert Boolean field ‘false’ to Byte

解决办法,在JDBC 连接串添加 tinyInt1isBit=false 配置

 

转载请注明:西门飞冰的博客 » streamset 实时同步mysql binlog到kudu

喜欢 (31)or分享 (0)