Flume+Kafka获取MySQL数据
摘要
MySQL被广泛用于海量业务的存储数据库,在大数据时代,我们亟需对其中的海量数据进行分析,但在MySQL之上进行大数据分析显然是不现实的,这会影响业务系统的运行稳定。如果我们要实时地分析这些数据,则需要实时地将其复制到适合OLAP的数据系统上。本文介绍一种数据采集工具——Flume,由cloudera软件公司于2009年被捐赠了apache软件基金会,现已成为apache top项目之一。本文使用Flume构建一个对MySQL数据的采集,并投递到Kafka的一个链路。
环境依赖
- Java 8+
- Flume 1.9
- Kafka 2.7
- ZooKeeper 3.6
- MySQL 5.7.23
- Git
一、下载&打包flume-ng-sql-source插件
1、下载
$ cd /data/gitproject
$ git clone git@github.com:keedio/flume-ng-sql-source.git
$ cd flume-ng-sql-source
$ vim pom.xml
#在
#<build>
# <plugins>
#内添加如下内容,maven-dependency-plugin是一个可以将当前maven项目所有依赖的jar文件提取到指定文件夹的工具
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<configuration>
<outputDirectory>$FLUME_HOME/lib</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>true</stripVersion>
</configuration>
</plugin>
...
# outputDirectory是指定jar包提取路径,表示target目录。如果不写的话,将在根目录下创建lib目录。
# excludeTransitive,表示是否不包含间接依赖的包。
# stripVersion表示复制的jar文件去掉版本信息。
# 执行如下maven命令,所有依赖的jar将提取到lib目录:
$ mvn dependency:copy-dependencies
2、打包
通过maven打jar包:
# 编译Java项目
$ mvn clean
$ mvn compile
$ mvn package
# 执行完毕后,在./target文件夹下将会有构建好的项目对应的jar包
root@ubuntu-master:/data/gitproject/flume-ng-sql-source/target# ll
total 9088
drwxr-xr-x 11 root root 4096 2月 8 19:53 ./
drwxr-xr-x 5 root root 4096 2月 8 20:21 ../
drwxr-xr-x 3 root root 4096 2月 8 19:53 apidocs/
drwxr-xr-x 3 root root 4096 2月 8 19:50 classes/
-rw-r--r-- 1 root root 9163594 2月 8 19:52 flume-ng-sql-source-1.5.3-SNAPSHOT.jar #这个就是我们要的jar包
-rw-r--r-- 1 root root 59249 2月 8 19:53 flume-ng-sql-source-1.5.3-SNAPSHOT-javadoc.jar
-rw-r--r-- 1 root root 10856 2月 8 19:53 flume-ng-sql-source-1.5.3-SNAPSHOT-sources.jar
drwxr-xr-x 3 root root 4096 2月 8 19:50 generated-sources/
drwxr-xr-x 3 root root 4096 2月 8 19:52 generated-test-sources/
drwxr-xr-x 2 root root 4096 2月 8 19:53 javadoc-bundle-options/
drwxr-xr-x 2 root root 4096 2月 8 19:52 maven-archiver/
drwxr-xr-x 3 root root 4096 2月 8 19:50 maven-status/
-rw-r--r-- 1 root root 17724 2月 8 19:52 original-flume-ng-sql-source-1.5.3-SNAPSHOT.jar
drwxr-xr-x 2 root root 4096 2月 8 19:52 surefire-reports/
drwxr-xr-x 3 root root 4096 2月 8 19:52 test-classes/
3、复制jar包到$FLUME_HOME/lib目录
$ cp /data/gitproject/flume-ng-sql-source/target/flume-ng-sql-source-1.5.3-SNAPSHOT.jar $FLUME_HOME/lib/flume-ng-sql-source-1.5.3.jar
注:$FLUME_HOME是自己linux下flume的文件夹,比如我的是/usr/local/flume_1.9.0
二、新建数据库和表
接下来我们要使用Flume采集MySQL数据库中的相关表数据。
这里我们新建一个数据库和表,并且要记住这个数据库和表的名字,之后这些信息要写入Flume的配置文件。
创建数据库:
create database test;
创建表:
use test;
create table fk (
id int UNSIGNED AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
age int NOT NULL,
PRIMARY KEY ( id )
);
三、新增配置文件(重要)
在flume的conf文件夹中,新增一个文件mysql-flume.conf
$ cd /usr/local/flume_1.9.0/conf
$ vim mysql-flume.conf
注:mysql-flume.conf本来是没有的,是我生成的,具体配置如下所示
# a1表示agent的名称
# source是a1的输入源
# channels是缓冲区
# sinks是a1输出目的地,本例子sinks使用了kafka
a1.channels = ch-1
a1.sources = src-1
a1.sinks = k1
###########sql source#################
# For each one of the sources, the type is defined
a1.sources.src-1.type = org.keedio.flume.source.SQLSource
# 连接mysql的一系列操作,youhost改为你虚拟机的ip地址,可以通过ifconfig或者ip addr查看
# url中要加入?useUnicode=true&characterEncoding=utf-8&useSSL=false,否则有可能连接失败
a1.sources.src-1.hibernate.connection.url = jdbc:mysql://youhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
# Hibernate Database connection properties
# mysql账号,一般都是root
a1.sources.src-1.hibernate.connection.user = root
# 填入你的mysql密码
a1.sources.src-1.hibernate.connection.password = xxxxxxxx
a1.sources.src-1.hibernate.connection.autocommit = true
# mysql驱动
a1.sources.src-1.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
# 驱动版本过低会无法使用,驱动安装下文会提及
a1.sources.src-1.hibernate.connection.driver_class = com.mysql.jdbc.Driver
a1.sources.src-1.run.query.delay=5000
# 存放status文件
a1.sources.src-1.status.file.path = /opt/install/flume/status
a1.sources.src-1.status.file.name = sqlSource.status
# Custom query
a1.sources.src-1.start.from = 0
# 填写需要采集的数据表信息,你也可以使用下面的方法:
# agent.sources.sql-source.table =table_name
# agent.sources.sql-source.columns.to.select = *
a1.sources.src-1.custom.query = select `id`, `name` from fk
a1.sources.src-1.batch.size = 1000
a1.sources.src-1.max.rows = 1000
a1.sources.src-1.hibernate.connection.provider_class = org.hibernate.connection.C3P0ConnectionProvider
a1.sources.src-1.hibernate.c3p0.min_size=1
a1.sources.src-1.hibernate.c3p0.max_size=10
################################################################
a1.channels.ch-1.type = memory
a1.channels.ch-1.capacity = 10000
a1.channels.ch-1.transactionCapacity = 10000
a1.channels.ch-1.byteCapacityBufferPercentage = 20
a1.channels.ch-1.byteCapacity = 800000
################################################################
# 使用kafka
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
# 这个项目中你创建的或使用的topic名字
a1.sinks.k1.topic = testTopic
# kafka集群,broker列表,由于我没有使用集群所以只有一个
# 如果你搭建了集群,代码如下:agent.sinks.k1.brokerList = kafka-node1:9092,kafka-node2:9092,kafka-node3:9092
# Flume 1.6- 的写法
#a1.sinks.k1.brokerList = 192.168.1.113:9092,192.168.1.114:9092,192.168.1.115:9092
# Flume 1.7+ 的写法
a1.sinks.k1.kafka.bootstrap.servers=192.168.1.113:9092,192.168.1.114:9092,192.168.1.115:9092
a1.sinks.k1.requiredAcks = 1
a1.sinks.k1.batchSize = 20
# Bind the source and sink to the channel
a1.sinks.k1.channel=ch-1
a1.sources.src-1.channels=ch-1
四、添加mysql驱动到flume的lib目录下
$ cd /data
$ wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.49.tar.gz
$ tar -zxvf mysql-connector-java-5.1.49.tar.gz
$ cp /data/mysql-connector-java-5.1.49/mysql-connector-java-5.1.49-bin.jar $FLUME_HOME/lib/
五、启动相关组件
安装Zookeeper详细请参考:JasonCengBlog/zookeeper/20210206_Linux下搭建ZooKeeper集群.md
1、启动ZooKeeper
在所有节点上启动zkServer
$ cd $ZOOKEEPER_HOME/bin
$ zkServer.sh start
2、启动Kafka
安装Kafka详细请参考:JasonCengBlog/Kafka/20210207_Linux下搭建kafka集群.md
新开一个终端窗口
#从后台启动Kafka集群(3台都需要启动)
$ cd $KAFKA_HOME/bin #进入到kafka的bin目录
$ ./kafka-server-start.sh -daemon ../config/server.properties
新建一个topic
$ cd $KAFKA_HOME
$ bin/kafka-topics.sh --create --zookeeper 192.168.1.113:2181,192.168.1.114:2181,192.168.1.115:2181 --replication-factor 1 --partitions 1 --topic testTopic
注1:testTopic就是你使用的topic名称,这个和上文
mysql-flume.conf里的内容是对应的。注2:可以使用
bin/kafka-topics.sh --list --zookeeper 192.168.1.113:2181,192.168.1.114:2181,192.168.1.115:2181来查看已创建的topic。
3、启动flume
新开一个终端窗口
$ cd $FLUME_HOME
$ bin/flume-ng agent -n a1 -c conf -f conf/mysql-flume.conf -Dflume.root.logger=INFO,console
4、启动mysql终端
新开一个终端窗口
$ mysql -u mysql -p
mysql>
六、实时采集数据
1、启动kafka消费者查看flume采集的MySQL数据
flume会实时采集数据到kafka中,我们可以启动一个kafak的消费监控,用于查看mysql的实时数据。
$ cd $KAFKA_HOME
$ bin/kafka-console-consumer.sh --bootstrap-server 192.168.1.113:9092,192.168.1.114:9092,192.168.1.115:9092 --topic testTopic --from-beginning
我们在MySQL数据库中新插入(1,'xiaohong',18),(2,'xiaobai',20),这时就可以在Kafka消费者终端查看数据了,kafka会打印Flume所采集的MySQL中的数据。

2、修改MySQL数据,查看变化
我们在数据库中新增一条数据,Kafka消费者新读取到的Flume所采集的数据也会变更。
如我们新插入一条数据为(3,'heiheiheiheihei',22),Kafka消费者终端会打印如下:

参考
[1]flume实时采集mysql数据到kafka中并输出[https://www.cnblogs.com/kylinxxx/p/14137607.html]
[2]Flume常见错误整理(持续更新ing...)[https://blog.csdn.net/dr_guo/article/details/52193881]:参考其mysql-flume.conf配置
[3]https://github.com/keedio/flume-ng-sql-source
[4]https://cwiki.apache.org/confluence/display/FLUME/Getting+Started
[5]在linux上编译maven工程[https://www.jianshu.com/p/672be18b0f54]
[6]利用maven将项目依赖的jar提取到指定文件夹[https://blog.51cto.com/keeplearning/1225581]
Flume+Kafka获取MySQL数据的更多相关文章
- flume实时采集mysql数据到kafka中并输出
环境说明 centos7(运行于vbox虚拟机) flume1.9.0(flume-ng-sql-source插件版本1.5.3) jdk1.8 kafka(版本忘了后续更新) zookeeper(版 ...
- flume+kafka+storm+mysql架构设计
前段时间学习了storm,最近刚开blog,就把这些资料放上来供大家参考. 这个框架用的组件基本都是最新稳定版本,flume-ng1.4+kafka0.8+storm0.9+mysql (项目是mav ...
- 随机获取Mysql数据表的一条或多条记录
随机获得Mysql数据表的一条或多条记录有很多方法,下面我就以users(userId,userName,password......)表(有一百多万条记录)为例,对比讲解下几个方法效率问题: sel ...
- C#获取MySql 数据常用的代码
1.读取 public DataTable ExecuteDataTable(string SQLString) { using (MySqlConnection connection = new M ...
- 利用flume+kafka+storm+mysql构建大数据实时系统
架构图
- PHP获取mysql数据表的字段名称及详细属性
SHOW DATABASES //列出 MySQL Server 数据库. SHOW TABLES [FROM db_name] //列出数据库数据表. SHOW CREATE TABLES tbl_ ...
- PHP获取mysql数据表的字段名称和详细信息的方法
首先我们需要了解下查询MySQL数据库/表相关信息的SQL语句: 代码如下: SHOW DATABASES //列出 MySQL Serv ...
- 获取mysql数据表中的列名
select COLUMN_NAME from information_schema.columns where table_name='table_name' DESCRIBE table_name ...
- jmeter获取mysql数据并作为请求参数使用
1.将mysql-connector-java-5.1.22-bin.jar包放到jmeter的lib目录下,重启jmeter 2.测试计划中添加jdbc connection,右键测试计划----添 ...
- MySQL数据实时增量同步到Kafka - Flume
转载自:https://www.cnblogs.com/yucy/p/7845105.html MySQL数据实时增量同步到Kafka - Flume 写在前面的话 需求,将MySQL里的数据实时 ...
随机推荐
- pip 提示import error,cannot import name locations
出现这个问题的原因: 环境中没有安装年文件 安装了,环境路径错误 解决如下: 首先 执行升级命令 升级到最新 python -m pip install -U pip 再到site-packages目 ...
- 【Unit4】UML解析器(模型化设计)-作业总结 & 【BUAA-OO】课程总结
第四单元作业总结 1.题目概述 UML类图建模与查询(8) + UML顺序图/状态图建模与查询(3+3) + 模型错误检查(9),三次迭代共23条命令 2.构架设计 一开始以为和第三单元差不多,稍微用 ...
- Qt 获取本机ipv4地址
Qt 获取本机本地网卡的IPv4地址 本文介绍怎么用Qt去获取本机的ipv4地址 文章目录 Qt 获取本机本地网卡的IPv4地址 用法 用法 话不多说,直接上代码: QHostAddress host ...
- Git--命令常用
GITLab 命令 git remote add origin https://gitee.com/gtnotgod/Data-Quality-Management.git #增加了远程仓库 git ...
- delphi获取DOS命令行输出函数 运行CMD命令并获取结果
procedure TForm1.Button4Click(Sender: TObject); var hReadPipe,hWritePipe:THandle; si:STARTUPINFO; ls ...
- MySQL-删除数据和count(*)原理
delete删除数据原理 在InndoDB存储引擎中,delete删除操作是把需要删除的数据或者页标记为已删除,后面如果有需要,直接复用即可.这些被标记为已经删除的数据,看起来就像空洞一样.所以看起来 ...
- Spring AOP 应用
Spring AOP 应用 1. 介绍 AOP:面向切面编程,对面向对象编程的一种补充. AOP可以将一些公用的代码,自然的嵌入到指定方法的指定位置. 比如: 如上图,我们现在有四个方法,我们想在每个 ...
- 【Linux】3.1 远程登录Linux系统
为什么需要远程登录 Linux 示意图 说明: 公司开发时候, 具体的情况是这样的 linux 服务器是开发小组共享的. 正式上线的项目是运行在公网的. 因此程序员需要远程登录到 centos 进行项 ...
- leetcode每日一题:最小化字符串长度
题目 2716. 最小化字符串长度 给你一个下标从 0 开始的字符串 s ,重复执行下述操作 任意 次: 在字符串中选出一个下标 i ,并使 c 为字符串下标 i 处的字符.并在 i 左侧(如果有)和 ...
- Java 的 G1 垃圾回收流程
Java 的 G1 垃圾回收流程 G1(Garbage-First)垃圾收集器 是一种区域化.并发.低延迟的垃圾回收器,适合大堆内存和对暂停时间有严格要求的应用程序.G1 的垃圾回收流程主要包括以下阶 ...