spark开发mysql伪实时数据接入与写入

一、写在前头。

早先考虑到并且调研的架构师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的搭建和运维工作。

 

三、目前已经克服的难点。

maven集成mysql的jdbc,并且可以完成spark环境的发布,azkaban调度开发也已经调试完毕,且已经尝试使用jdbcRDD完成sql语句的数据抽取,同时完成了10分钟内增量数据的写入工作。

 

四、列出来即将克服的问题

1.azkaban时间调度10分钟准时不,因为要获取10分钟增量的时间。拼接10分钟区间作为参数做为数据源的查询条件,千万不能出现缺少时间的情况,否则缺了数据就完蛋了,在哪里记录这个时间的任务是否完成了。字段为create_dt   update_dt

2.update_dt要查目标表是否已经被用户修改过了,要查看update时间在不为空的情况下,且要大于创建时间,说明目标表中数据已经被更新过,那么源数据过来就不能覆盖。其余的,是允许修改的。所以需要两套方案,为了提高效率,会用dataFrame的唯一标识id来做查询条件,批量overwrite。

3.dataFrame关联的字段管理,因为要做各个系统兼容,所以还需要查询目标库中的几张维表,需要全表扫描且转换为df。

4.确定几个字段的读写,因为很多业务数据做不同的用途,有的字段为空,确定业务数据的接入。例如:业务类型、人数、付款码、开户行

5.失败重跑功能,就像我说的,如果任务跑失败了,或者azkaban任务排队了,磁盘满了等,需要提供一个功能,将一个时间段内的业务数据中的数据源为数据抽取部分的数据清空情况下,给定时间参数,重新抽取并且插入。

6.5需要验证数据量,如果全部加载进入内存是否会导致内存溢出,或者时间不可接受。

7.是否引入kafka+sparkStreaming来做数据接入,在消费端降压。

8.配置中心的开发,做到参数可配置,运维简单。

9.数据质量管理,数据告警的开发。

10.多种数据源接入,如何高效的、稳定的数据插入业务数据表。

11.多数据源需要创建create_time 和update_time索引,提高查询效率。这个时间需要一天,运维同学帮忙加个班。后面做了分库之后,应当做成binlog的方式,做成真真正正的实时。

12.以前的公司特殊处理的部分需要在代码出写死操作了。这种特殊情况比较恶心。

13.代码模块化,降低复杂度,编写ut自测,解决bug。

14.获取windwo与linux的路径分隔符

 

暂时列以上几点,后期可能会补充。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值