因业务需求,需要采集mysql中的某表数据进行记录。被采集表中必须有增量数据字段,如自增id或者修改时间。
我这里得需求是要记录所有数据及发生改变得数据,因此增量条件字段为 last_modified
开发环境:
jdk1.8
mysql5.6
flume1.8
flume默认是不支持sql source的,因此需要先添加flume-ng-sql-source 支持MySql SQLServer DB2
github地址为https://github.com/keedio/flume-ng-sql-source 根据自己的环境选择版本,README中也有基本配置说明。
打包前注意将pom文件中的 flume-ng-core 版本与flume安装版本保持一致,不然运行会报错。
理论上将打好得jar包和 mysql-connector-java-6.0.6.jar放到lib目录下即可(未实际验证,操作时可以先试试此方式)
我是参考别人得方式稍微复杂一些,操作如下:
在flume安装目录下创建目录plugins.d/sql-source/
再plugins.d/sql-source/目录下分别创建目录lib和libext
到官网下载 mysql-connector-java-6.0.6.tar.gz并解压到libext目录下即可版本根据自己得开发环境选择
----华丽的分割线----
采集到HDFS、Kafka的配置请参考如下链接
https://blog.csdn.net/cp_panda_5/article/details/81223653
以下为flume conf文件配置,因为是自定义sink对数据进行了处理,因此配置略有不同。
# example.conf: A single-node Flume configuration
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the source
# Hibernate Database connection properties
a1.sources.r1.type = org.keedio.flume.source.SQLSource #source type 声明
a1.sources.r1.hibernate.connection.url = jdbc:mysql://127.0.0.1:3306/test_database #被采集数据源
a1.sources.r1.hibernate.connection.user = root
a1.sources.r1.hibernate.connection.password = xxx
a1.sources.r1.hibernate.connection.autocommit = true
a1.sources.r1.hibernate.dialect = org.hibernate.dialect.MySQLDialect
a1.sources.r1.hibernate.connection.driver_class = com.mysql.jdbc.Driver
# Query delay, each configured milisecond the query will be sent
a1.sources.r1.run.query.delay=10000
# Status file is used to save last readed row
a1.sources.r1.status.file.path = /home/apache-flume-1.8.0/sqlSource
a1.sources.r1.status.file.name = sqlSource.status
# 自定义查询语句
a1.sources.r1.start.from = 0 #从id为0的记录开始查询,注意:flume-ng-sql-source 的记录标识为id
#注意查询条件的设置,当记录id为0时,last_modified大于2017-01-01(根据自己的日期范围需求),排除没有id为0的数据。
a1.sources.r1.custom.query = SELECT * FROM test_tab WHERE last_modified>(if($@$ < 1,"2017-01-01",(SELECT last_modified FROM test_tab WHERE id = $@$))) ORDER BY last_modified ASC
a1.sources.r1.batch.size = 1000
a1.sources.r1.max.rows = 1000
a1.sources.r1.delimiter.entry = |
#a1.sources.r1.hibernate.connection.provider_class = org.hibernate.connection.C3P0ConnectionProvider
#a1.sources.r1.hibernate.c3p0.min_size=1
#a1.sources.r1.hibernate.c3p0.max_size=10
# 自定义sink
a1.sinks.k1.type = com.xxx.mysink.CustomSink
###自定义sink部分配置省略###
# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 10000
a1.channels.c1.transactionCapacity = 1000
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
----华丽得分割线----
附上小弟久违得订阅号,路过的大佬不嫌弃点个关注