一、写在前头。
早先考虑到并且调研的架构师flume或者canel等读取mysql的binlog,但是需要mysql开启row模式存binlog,但是目前mysql库是已经积攒了很多业务数据,举个例子就是批量修改一万条,仅记录一条update语句,如果改成行,对服务器的磁盘空间要求很大。
但是不开启行,就会造成,解析binlog的insert还好,我可以解析后放入kafka中,但是如果涉及到update,可能我只能存入到另一个groupid中了,回头还要在触发器端消费消息时,解析update后的where条件,反查表,反查的过程是漫长而不可控的,所以纯粹的实时是做不到的。所以,flume+kafka+sparkstreaming,就需要舍弃flume了,至少暂时是不可实现的。
好消息是后期这些大表都要改掉,改成按照客户分库,那样,数据库binlog开启row模式,就可以按行读取binlog并且解析了,多好,或者自己写工具实现。
好了,话不多说,开始说怎么开发了。
二、思路
首先我们需要spark的jdbcRDD,来读取mysql数据源,当然了,源表需要开启createTime和updateTime索引,只要速度够快,我们可以做小时级任务,10分钟级任务。
数据源查到后,其实jdbcRDD的行是resultSet数据类型,可以作为RDD行处理,当然了,这一步有挺多的坑的,国内外的网站找了很多资料才解决这个问题。
从RDD,我们转换成dataFrame,最后写入mysql数据库即可。(这中间正在考虑是否需要引入kafka+sparkstreaming组件)
总体上的事儿是很简单的,但是业务可不简单,首先数据源是形形色色的很多个库的,每个库可能有20张表,每个表的字段,数据类型都不一样,然后在我这里统一组装。这中间还有很多特别的公司、机构,在业务上需要处理,再者,还需要去目标库中拿到各个系统的映射字段做系统间的打通工作。
每条记录在插入之前还需要校验目标数据该唯一数据是否用户已修改。
最重要的是,要负责起来普通的hadoop、spark的搭建和运维工作。