转载自:https://www.cnblogs.com/yucy/p/7845105.html

MySQL数据实时增量同步到Kafka - Flume

 
  • 写在前面的话

  需求,将MySQL里的数据实时增量同步到Kafka。接到活儿的时候,第一个想法就是通过读取MySQL的binlog日志,将数据写到Kafka。不过对比了一些工具,例如:Canel,Databus,Puma等,这些都是需要部署server和client的。其中server端是由这些工具实现,配置了就可以读binlog,而client端是需要我们动手编写程序的,远没有达到我即插即用的期望和懒人的标准。

  再来看看flume,只需要写一个配置文件,就可以完成数据同步的操作。官网:http://flume.apache.org/FlumeUserGuide.html#flume-sources。它的数据源默认是没有读取binlog日志实现的,也没有读数据库表的官方实现,只能用开源的自定义source:https://github.com/keedio/flume-ng-sql-source

  • 同步的格式

  原作者的插件flume-ng-sql-source只支持csv的格式,如果开始同步之后,数据库表需要增减字段,则会给开发者造成很大的困扰。所以我添加了一个分支版本,用来将数据以JSON的格式,同步到kafka,字段语义更加清晰。

  sql-json插件包下载地址:https://github.com/yucy/flume-ng-sql-source-json/releases/download/1.0/flume-ng-sql-source-json-1.0.jar

  将此jar包下载之后,和相应的数据库驱动包,一起放到flume的lib目录之下即可。

  • 处理机制

flume-ng-sql-source在【status.file.name】文件中记录读取数据库表的偏移量,进程重启后,可以接着上次的进度,继续增量读表。

  • 启动说明

说明:启动命令里的【YYYYMM=201711】,会传入到flume.properties里面,替换${YYYYMM}


  1. [test@localhost ~]$ YYYYMM=201711 bin/flume-ng agent -c conf -f conf/flume.properties -n sync &

-c:表示配置文件的目录,在此我们配置了flume-env.sh,也在conf目录下;

-f:指定配置文件,这个配置文件必须在全局选项的--conf参数定义的目录下,就是说这个配置文件要在前面配置的conf目录下面;

-n:表示要启动的agent的名称,也就是我们flume.properties配置文件里面,配置项的前缀,这里我们配的前缀是【sync】;

  • flume的配置说明

  • flume-env.sh

  1. # 配置JVM堆内存和java运行参数,配置-DpropertiesImplementation参数是为了在flume.properties配置文件中使用环境变量
  2. export JAVA_OPTS="-Xms512m -Xmx512m -Dcom.sun.management.jmxremote -DpropertiesImplementation=org.apache.flume.node.EnvVarResolverProperties"

关于propertiesImplementation参数的官方说明:http://flume.apache.org/FlumeUserGuide.html#using-environment-variables-in-configuration-files

  • flume.properties

  1. # 数据来源
  2. sync.sources = s-1
  3. # 数据通道
  4. sync.channels = c-1
  5. # 数据去处,这里配置了failover,根据下面的优先级配置,会先启用k-1,k-1挂了后再启用k-2
  6. sync.sinks = k-1 k-2
  7. #这个是配置failover的关键,需要有一个sink group
  8. sync.sinkgroups = g-1
  9. sync.sinkgroups.g-1.sinks = k-1 k-2
  10. #处理的类型是failover
  11. sync.sinkgroups.g-1.processor.type = failover
  12. #优先级,数字越大优先级越高,每个sink的优先级必须不相同
  13. sync.sinkgroups.g-1.processor.priority.k-1 = 5
  14. sync.sinkgroups.g-1.processor.priority.k-2 = 10
  15. #设置为10秒,当然可以根据你的实际状况更改成更快或者很慢
  16. sync.sinkgroups.g-1.processor.maxpenalty = 10000
  17. ########## 数据通道的定义
  18. # 数据量不大,直接放内存。其实还可以放在JDBC,kafka或者磁盘文件等
  19. sync.channels.c-1.type = memory
  20. # 通道队列的最大长度
  21. sync.channels.c-1.capacity = 100000
  22. # putList和takeList队列的最大长度,sink从capacity中抓取batchsize个event,放到这个队列。所以此参数最好比capacity小,比sink的batchsize大。
  23. # 官方定义:The maximum number of events the channel will take from a source or give to a sink per transaction.
  24. sync.channels.c-1.transactionCapacity = 1000
  25. sync.channels.c-1.byteCapacityBufferPercentage = 20
  26. ### 默认值的默认值等于JVM可用的最大内存的80%,可以不配置
  27. # sync.channels.c-1.byteCapacity = 800000
  28. #########sql source#################
  29. # source s-1用到的通道,和sink的通道要保持一致,否则就GG了
  30. sync.sources.s-1.channels=c-1
  31. ######### For each one of the sources, the type is defined
  32. sync.sources.s-1.type = org.keedio.flume.source.SQLSource
  33. sync.sources.s-1.hibernate.connection.url = jdbc:mysql://192.168.1.10/testdb?useSSL=false
  34. ######### Hibernate Database connection properties
  35. sync.sources.s-1.hibernate.connection.user = test
  36. sync.sources.s-1.hibernate.connection.password = 123456
  37. sync.sources.s-1.hibernate.connection.autocommit = true
  38. sync.sources.s-1.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
  39. sync.sources.s-1.hibernate.connection.driver_class = com.mysql.jdbc.Driver
  40. sync.sources.s-1.run.query.delay=10000
  41. sync.sources.s-1.status.file.path = /home/test/apache-flume-1.8.0-bin/status
  42. # 用上${YYYYMM}环境变量,是因为我用的测试表示一个月表,每个月的数据会放到相应的表里。使用方式见上面的启动说明
  43. sync.sources.s-1.status.file.name = test_${YYYYMM}.status
  44. ######## Custom query
  45. sync.sources.s-1.start.from = 0
  46. sync.sources.s-1.custom.query = select * from t_test_${YYYYMM} where id > $@$ order by id asc
  47. sync.sources.s-1.batch.size = 100
  48. sync.sources.s-1.max.rows = 100
  49. sync.sources.s-1.hibernate.connection.provider_class = org.hibernate.connection.C3P0ConnectionProvider
  50. sync.sources.s-1.hibernate.c3p0.min_size=5
  51. sync.sources.s-1.hibernate.c3p0.max_size=20
  52. ######### sinks 1
  53. # sink k-1用到的通道,和source的通道要保持一致,否则取不到数据
  54. sync.sinks.k-1.channel = c-1
  55. sync.sinks.k-1.type = org.apache.flume.sink.kafka.KafkaSink
  56. sync.sinks.k-1.kafka.topic = sync-test
  57. sync.sinks.k-1.kafka.bootstrap.servers = localhost:9092
  58. sync.sinks.k-1.kafka.producer.acks = 1
  59. # 每批次处理的event数量
  60. sync.sinks.k-1.kafka.flumeBatchSize  = 100
  61. ######### sinks 2
  62. # sink k-2用到的通道,和source的通道要保持一致,否则取不到数据
  63. sync.sinks.k-2.channel = c-1
  64. sync.sinks.k-2.type = org.apache.flume.sink.kafka.KafkaSink
  65. sync.sinks.k-2.kafka.topic = sync-test
  66. sync.sinks.k-2.kafka.bootstrap.servers = localhost:9092
  67. sync.sinks.k-2.kafka.producer.acks = 1
  68. sync.sinks.k-2.kafka.flumeBatchSize  = 100

关于putList和takeList与capacity的关系,引用:http://blog.csdn.net/u012948976/article/details/51760546

flume各部分参数含义

  • batchData的大小见参数:batchSize
  • PutList和TakeList的大小见参数:transactionCapactiy
  • Channel总容量大小见参数:capacity
  • 问题记录

异常:Exception in thread "PollableSourceRunner-SQLSource-src-1" java.lang.AbstractMethodError: org.keedio.flume.source.SQLSource.getMaxBackOffSleepInterval()J

分析:由于我用的是flume1.8,而flume-ng-sql-1.4.3插件对应的flume-ng-core版本是1.5.2,1.8版本里的PollableSource接口多了两个方法 getBackOffSleepIncrement(); getMaxBackOffSleepInterval();在失败补偿暂停线程处理时,需要用到这个方法。

解决方法:更新flume-ng-sql-1.4.3里依赖的flume-ng-core版本为1.8.0,并在源代码【SQLSource.java】里添加这两个方法即可。


  1. @Override
  2. public long getBackOffSleepIncrement() {
  3. return 1000;
  4. }
  5. @Override
  6. public long getMaxBackOffSleepInterval() {
  7. return 5000;
  8. }

MySQL数据实时增量同步到Kafka - Flume的更多相关文章

  1. 通过canal实现把MySQL数据实时增量到kafka

    说明:我们有一个业务需要把mysql中一些表实时同步到大数据集群hbase上面,我们先通过sqoop把表中数据全量导入到hbase中,然后再通过canal定位的某个binlog的position,来实 ...

  2. orcale增量全量实时同步mysql可支持多库使用Kettle实现数据实时增量同步

    1. 时间戳增量回滚同步 假定在源数据表中有一个字段会记录数据的新增或修改时间,可以通过它对数据在时间维度上进行排序.通过中间表记录每次更新的时间戳,在下一个同步周期时,通过这个时间戳同步该时间戳以后 ...

  3. 用solr DIH 实现mysql 数据定时,增量同步到solr

    基础环境: (二)设置增量导入为定时执行的任务: 很多人利用Windows计划任务,或者Linux的Cron来定期访问增量导入的连接来完成定时增量导入的功能,这其实也是可以的,而且应该没什么问题. 但 ...

  4. Mysql数据实时同步

    企业运维的数据库最常见的是 mysql;但是 mysql 有个缺陷:当数据量达到千万条的时候,mysql 的相关操作会变的非常迟缓; 如果这个时候有需求需要实时展示数据;对于 mysql 来说是一种灾 ...

  5. canal整合springboot实现mysql数据实时同步到redis

    业务场景: 项目里需要频繁的查询mysql导致mysql的压力太大,此时考虑从内存型数据库redis里查询,但是管理平台里会较为频繁的修改增加mysql里的数据 问题来了: 如何才能保证mysql的数 ...

  6. kafka源码系列之mysql数据增量同步到kafka

    一,架构介绍 生产中由于历史原因web后端,mysql集群,kafka集群(或者其它消息队列)会存在一下三种结构. 1,数据先入mysql集群,再入kafka 数据入mysql集群是不可更改的,如何再 ...

  7. 几篇关于MySQL数据同步到Elasticsearch的文章---第二篇:canal 实现Mysql到Elasticsearch实时增量同步

    文章转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484377&idx=1&sn=199bc88 ...

  8. mysql数据实时同步到Elasticsearch

    业务需要把mysql的数据实时同步到ES,实现低延迟的检索到ES中的数据或者进行其它数据分析处理.本文给出以同步mysql binlog的方式实时同步数据到ES的思路, 实践并验证该方式的可行性,以供 ...

  9. 【转】美团 MySQL 数据实时同步到 Hive 的架构与实践

    文章转载自公众号  美团技术团队 , 作者 萌萌 背景 在数据仓库建模中,未经任何加工处理的原始业务层数据,我们称之为ODS(Operational Data Store)数据.在互联网企业中,常见的 ...

随机推荐

  1. 基于Bootsrap的BeyondAdmin前端模板 --分享

    1.PC端 2.移动端 3.下载 最新:http://www.yidt.cn/ 链接:https://pan.baidu.com/s/1Tx6EVmGFnVV7H7h3SFwldA 提取码:0btw

  2. erlang调试方法

    第一种方式,加打印记录 %%-define(debug, ok). -ifdef(debug). -define(LOG(X), io:format("pid:~p , {~p,~p}: ~ ...

  3. 92. Reverse Linked List II 反转链表 II

    网址:https://leetcode.com/problems/reverse-linked-list-ii/ 核心部分:通过a.b.c三个变量之间的相互更新,不断反转部分链表 然后将反转部分左右两 ...

  4. require,import区别

    链接:https://www.zhihu.com/question/56820346 遵循的模块化规范不一样 模块化规范:即为 JavaScript 提供一种模块编写.模块依赖和模块运行的方案.谁让最 ...

  5. 菜鸟webpack教程纠错

    gei事例: http://www.runoob.com/w3cnote/webpack-tutorial.html 本次的问题主要是在loader部分,原因是按照教程的操作,会出现一下错误 后来发现 ...

  6. 八大排序算法——选择排序(动图演示 思路分析 实例代码Java 复杂度分析)

    一.动图演示 二.思路分析 1.  第一个跟后面的所有数相比,如果小于(或小于)第一个数的时候,暂存较小数的下标,第一趟结束后,将第一个数,与暂存的那个最小数进行交换,第一个数就是最小(或最大的数) ...

  7. 深入理解vue-router之keep-alive

    keep-alive 简介 keep-alive 是 Vue 内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染. 用法也很简单: ? 1 2 3 4 5 <keep-alive> ...

  8. SpringMVC 搭建遇到的坑

    1. Caused by: org.xml.sax.SAXParseException; lineNumber: 8; columnNumber: 60; cvc-complex-type.2.4.c ...

  9. 高性能场景下,HashMap的优化使用建议

    1. HashMap 在JDK 7 与 JDK8 下的差别 顺便理一下HashMap.get(Object key)的几个关键步骤,作为后面讨论的基础. 1.1 获取key的HashCode并二次加工 ...

  10. OC学习笔记

    备注:这里只是个人的观点,有的地方也是copy,多多指教,个人笔记,有侵犯你们版权的地方还望海涵!!! ARC单例模式的实现 使用alloc方法初始化一个类的实例的时候,默认是调用了 allocWit ...