flume采集MongoDB数据到Kafka中
环境说明
- centos7(运行于vbox虚拟机)
- flume1.9.0(自定义了flume连接mongodb的source插件)
- jdk1.8
- kafka(2.11)
- zookeeper(3.57)
- mongoDB4.0.0(无密码)
- xshell 7
自定义flume插件
由于flume对数据库的支持欠缺,flume的source组件中,没有组件适用于连接关系型数据库或非关系型数据库。
对于关系型数据库(RDB),github中开源插件flume-ng-sql-source被广泛用于对接RDB。但是对于非关系型数据库,不同的非关系型数据库之间都有些许差别,且没有一个统一的,或者配对的插件来支持非关系型数据库。
因此,需要使用者自定义插件来适配。
我自定义的flume-ng-mongodb-source的jar包如下:
()
将该jar包放在yourpath/flume/lib
下(yourpath指你flume文件夹前面路径,下同。同理,下文出现的yourhost指你本机的ip地址)
连接mongodb的配置文件
在mongodb中创建database和collection,用于测试。
创建数据库:
use flumetest
创建集合(隐式创建):
db.testCollection.insert({id:1,name:"333"})
查看是否已经创建了数据库:
> show dbs
admin 0.000GB
config 0.000GB
flumetest 0.000GB
local 0.000GB
test 0.000GB
查看集合中的数据:
> db.testCollection.findOne()
{ "_id" : ObjectId("5fe29faad5553e6caaa8cbe9"), "id" : 1, "name" : "333" }
此外,我们需要将mongodb相关的驱动jar包放到yourpath/flume/lib
下
bson-3.12.7.jar
mongo-java-driver-3.12.7.jar
mongodb-driver-core-3.12.7.jar
flume连接mongodb需要先编写相关的配置文件,在yourpath/flume/conf
里新增配置文件mongo-flume.conf
,具体的配置如下:
#This is a model,you can use for test
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the source
a1.sources.r1.type = com.wms.flumesource.MongoDBSource
a1.sources.r1.Mongodb.url = yourhost:27017
a1.sources.r1.Mongodb.database=flumetest
a1.sources.r1.Mongodb.collection = testCollection
a1.sources.r1.Mongodb.column= _id
a1.sources.r1.start.from = 0
a1.sources.r1.interval=2000
a1.sources.r1.charset=UTF-8
# Describe the sink
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
a1.sinks.k1.topic = mongoTopic
a1.sinks.k1.brokerList = yourhost:9092
a1.sinks.k1.requiredAcks = 1
a1.sinks.k1.batchSize = 20
# Describe the channel
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
参数说明:
# mongodb的url
a1.sources.r1.Mongodb.url = yourhost:27017
# 要连接的database
a1.sources.r1.Mongodb.database=flumetest
# 要连接的collection
a1.sources.r1.Mongodb.collection = testCollection
# mongodb中每条数据都有默认的_id,用于续传
a1.sources.r1.Mongodb.column= _id
# sink使用了kafka,flume成功连接之后开启消费监控就能看到数据了
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
# 接下来用于监控消费的topic名字
a1.sinks.k1.topic = mongoTopic
因为mongodb有集群操作,所以flume-ng-mongodb-source也支持mongodb集群,只需要在a1.sources.r1.Mongodb.url
里配置多个url即可,如:
a1.sources.r1.Mongodb.url = yourhost1:port1,yourhost2:port2,yourhost3:port3,......
采集mongodb数据实践
启动mongodb和kafka。
启动flume
bin/flume-ng agent -n a1 -c conf -f conf/mongo-flume.conf -Dflume.root.logger=INFO,console
参数说明:
a1
:是你在mongo-flume中给agent起的别名conf/mongo-flume.conf
:导入前文所述的配置文件,配置文件在yourpath/flume/conf
下。
启动一个kafka消费监控:
bin/kafka-console-consumer.sh --bootstrap-server yourhost:9092 --topic mongoTopic --from-beginning
获取testCollection中全部数据(下图不是重复数据,是之前多次测试在topic中留下的数据):
往testCollection中添加一条数据:
db.testCollection.insert({id:7,name:"test",city:"Beijing"})
消费监控中的结果如下:
只读增量数据
如果不想把collection中所有的数据都读取出来,请修改flume-ng-mongodb-source源码。
在MongoDBSource.java文件中,找到run
方法,取消掉events.clear()
的注释。
再次打包,替换掉lib下flume-ng-mongodb-source的jar包。
然后再次执行上面的启动操作:
bin/kafka-console-consumer.sh --bootstrap-server yourhost:9092 --topic mongoTopic --from-beginning
bin/kafka-console-consumer.sh --bootstrap-server yourhost:9092 --topic mongoTopic --from-beginning
插入一条数据:
db.testCollection.insert({id:8,name:"增量"})
查看消费监控:
可以看到只有新增的数据了,不会再读取所有的数据
再插入一条数据实验一下:
db.testCollection.insert({id:9,source:"MongoDBSource",channle:"memory",sink:"kafka"})
flume采集MongoDB数据到Kafka中的更多相关文章
- flume实时采集mysql数据到kafka中并输出
环境说明 centos7(运行于vbox虚拟机) flume1.9.0(flume-ng-sql-source插件版本1.5.3) jdk1.8 kafka(版本忘了后续更新) zookeeper(版 ...
- MongoDB -> kafka 高性能实时同步(采集)mongodb数据到kafka解决方案
写这篇博客的目的 让更多的人了解 阿里开源的MongoShake可以很好满足mongodb到kafka高性能高可用实时同步需求(项目地址:https://github.com/alibaba/Mong ...
- MongoDB -> kafka 高性能实时同步(sync 采集)mongodb数据到kafka解决方案
写这篇博客的目的 让更多的人了解 阿里开源的MongoShake可以很好满足mongodb到kafka高性能高可用实时同步需求(项目地址:https://github.com/alibaba/Mong ...
- flume采集log4j日志到kafka
简单测试项目: 1.新建Java项目结构如下: 测试类FlumeTest代码如下: package com.demo.flume; import org.apache.log4j.Logger; pu ...
- canal从mysql拉取数据,并以protobuf的格式往kafka中写数据
大致思路: canal去mysql拉取数据,放在canal所在的节点上,并且自身对外提供一个tcp服务,我们只要写一个连接该服务的客户端,去拉取数据并且指定往kafka写数据的格式就能达到以proto ...
- 大数据学习day33----spark13-----1.两种方式管理偏移量并将偏移量写入redis 2. MySQL事务的测试 3.利用MySQL事务实现数据统计的ExactlyOnce(sql语句中出现相同key时如何进行累加(此处时出现相同的单词))4 将数据写入kafka
1.两种方式管理偏移量并将偏移量写入redis (1)第一种:rdd的形式 一般是使用这种直连的方式,但其缺点是没法调用一些更加高级的api,如窗口操作.如果想更加精确的控制偏移量,就使用这种方式 代 ...
- Mysql增量写入Hdfs(一) --将Mysql数据写入Kafka Topic
一. 概述 在大数据的静态数据处理中,目前普遍采用的是用Spark+Hdfs(Hive/Hbase)的技术架构来对数据进行处理. 但有时候有其他的需求,需要从其他不同数据源不间断得采集数据,然后存储到 ...
- Flume推送数据到SparkStreaming案例实战和内幕源码解密
本期内容: 1. Flume on HDFS案例回顾 2. Flume推送数据到Spark Streaming实战 3. 原理绘图剖析 1. Flume on HDFS案例回顾 上节课要求大家自己安装 ...
- flink---实时项目--day02-----1. 解析参数工具类 2. Flink工具类封装 3. 日志采集架构图 4. 测流输出 5. 将kafka中数据写入HDFS 6 KafkaProducer的使用 7 练习
1. 解析参数工具类(ParameterTool) 该类提供了从不同数据源读取和解析程序参数的简单实用方法,其解析args时,只能支持单只参数. 用来解析main方法传入参数的工具类 public c ...
随机推荐
- JQuery跨站脚本漏洞
原理: jQuery中过滤用户输入数据所使用的正则表达式存在缺陷,可能导致 location.hash 跨站漏洞 影响版本: jquery-1.7.1~1.8.3 jquery-1.6.min.js, ...
- Windows核心编程 第五章 作业(上)
第5章 作 业 通常,必须将一组进程当作单个实体来处理.例如,当让 Microsoft Developer Studio为你创建一个应用程序项目时,它会生成 C l . e x e,C l . e x ...
- 用 vitePress 快速创建一个文档项目
其实开发一个项目最需要的就是操作文档,文档的质量决定了项目的开发流程,开发规范等等. 对于前端框架来说,文档最友好的还是vue,不仅是中国人的框架,而且文档支持了中文.仔细查看 Vue 的官方文档,还 ...
- Spring Boot & Cloud 轻量替代框架 Solon 1.3.35 发布
Solon 是一个微型的Java开发框架.强调,克制 + 简洁 + 开放的原则:力求,更小.更快.更自由的体验.支持:RPC.REST API.MVC.Micro service.WebSocket. ...
- 【我给面试官画饼】Python自动化测试面试题精讲
那今天给家分享的是一个面试主题. 就比如说我们的自动化测试,自动化如何去应对面试官,和面试官去聊一聊自动化的心得,自动化你现在去面试的时候是一个非常重要的一个关键点,所以如果你在这方面有一定的心得.那 ...
- 【原创】JVM如何运行Java程序的?
[Deerhang] 我们知道Java程序的运行是依赖于JVM虚拟机的,JVM类语言经过编译生成class字节码文件,字节码又经JVM进一步的编译生成机器码,最终运行在硬件上.那么JVM存在的意义是什 ...
- 浅谈CRM系统的选型和实施
CRM的本质是最大化利用企业的现有资源来提供客户所需的产品,保证提供给客户最好的服务,帮助销售人员提高客户转化率,储存所有重要的客户信息,帮助企业深入挖掘潜在客户等等. 对于企业来说,即使处于同一行业 ...
- mysql枚举和集合
create table consumer( id int, name char(16), sex enum('male','female','other'), level enum('vip1',' ...
- SQLFlow数据流分析工具的job功能介绍
SQLFlow是一款专业的数据血缘关系分析工具,在大型数据仓库中,完整的数据血缘关系可以用来进行数据溯源.表和字段变更的影响分析.数据合规性的证明.数据质量的检查等. 一.SQLFlow 是怎样工作的 ...
- 面试侃集合 | LinkedBlockingQueue篇
面试官:好了,聊完了ArrayBlockingQueue,我们接着说说LinkedBlockingQueue吧 Hydra:还真是不给人喘口气的机会,LinkedBlockingQueue是一个基于链 ...