环境说明

  • 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中的更多相关文章

  1. flume实时采集mysql数据到kafka中并输出

    环境说明 centos7(运行于vbox虚拟机) flume1.9.0(flume-ng-sql-source插件版本1.5.3) jdk1.8 kafka(版本忘了后续更新) zookeeper(版 ...

  2. MongoDB -> kafka 高性能实时同步(采集)mongodb数据到kafka解决方案

    写这篇博客的目的 让更多的人了解 阿里开源的MongoShake可以很好满足mongodb到kafka高性能高可用实时同步需求(项目地址:https://github.com/alibaba/Mong ...

  3. MongoDB -> kafka 高性能实时同步(sync 采集)mongodb数据到kafka解决方案

    写这篇博客的目的 让更多的人了解 阿里开源的MongoShake可以很好满足mongodb到kafka高性能高可用实时同步需求(项目地址:https://github.com/alibaba/Mong ...

  4. flume采集log4j日志到kafka

    简单测试项目: 1.新建Java项目结构如下: 测试类FlumeTest代码如下: package com.demo.flume; import org.apache.log4j.Logger; pu ...

  5. canal从mysql拉取数据,并以protobuf的格式往kafka中写数据

    大致思路: canal去mysql拉取数据,放在canal所在的节点上,并且自身对外提供一个tcp服务,我们只要写一个连接该服务的客户端,去拉取数据并且指定往kafka写数据的格式就能达到以proto ...

  6. 大数据学习day33----spark13-----1.两种方式管理偏移量并将偏移量写入redis 2. MySQL事务的测试 3.利用MySQL事务实现数据统计的ExactlyOnce(sql语句中出现相同key时如何进行累加(此处时出现相同的单词))4 将数据写入kafka

    1.两种方式管理偏移量并将偏移量写入redis (1)第一种:rdd的形式 一般是使用这种直连的方式,但其缺点是没法调用一些更加高级的api,如窗口操作.如果想更加精确的控制偏移量,就使用这种方式 代 ...

  7. Mysql增量写入Hdfs(一) --将Mysql数据写入Kafka Topic

    一. 概述 在大数据的静态数据处理中,目前普遍采用的是用Spark+Hdfs(Hive/Hbase)的技术架构来对数据进行处理. 但有时候有其他的需求,需要从其他不同数据源不间断得采集数据,然后存储到 ...

  8. Flume推送数据到SparkStreaming案例实战和内幕源码解密

    本期内容: 1. Flume on HDFS案例回顾 2. Flume推送数据到Spark Streaming实战 3. 原理绘图剖析 1. Flume on HDFS案例回顾 上节课要求大家自己安装 ...

  9. flink---实时项目--day02-----1. 解析参数工具类 2. Flink工具类封装 3. 日志采集架构图 4. 测流输出 5. 将kafka中数据写入HDFS 6 KafkaProducer的使用 7 练习

    1. 解析参数工具类(ParameterTool) 该类提供了从不同数据源读取和解析程序参数的简单实用方法,其解析args时,只能支持单只参数. 用来解析main方法传入参数的工具类 public c ...

随机推荐

  1. POJ3080方法很多(暴力,KMP,后缀数组,DP)

    题意:       给n个串(n>=2&&n<=10),每个串长度都是60,然后问所有串的最长公共子串,如果答案不唯一输出字典序最小的. 思路:直接暴力,枚举+KMP,后缀 ...

  2. Intel汇编语言程序设计学习-第三章 汇编语言基础-中

    3.2  例子:整数相加减 现在来看一个进行整数加减操作的汇编语言小程序.寄存器用于存放中间数据,我们调用一个库函数在屏幕上显示寄存器的内容.下面是程序的源码: TITLE Add and Subtr ...

  3. Swift系列一 - 数据类型

    如果你习惯了OC的语法,第一次接触Swift的语法可能会有点抗拒,因为Swift的语法有点怪.但如果你有前端的基础,学Swift可能会有点吃力,如果你有C++的基础可能会学得比较快点.不管你有什么样的 ...

  4. XCTF-unfinish

    unfinish 之前做过这个题,这是之前写的WP:链接

  5. 手机访问电脑本地localhost网页

    项目需要用手机访问电脑本地网页,从而可以调试项目,对代码的理解的快一点 重点 确保手机和电脑在同一个局域网 可以通过手机开热点电脑连接或者电脑开便携式热点手机连接 确保电脑的防火墙是关闭的 打开apa ...

  6. Problem: package docker-ce-3:18.09.9-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed

    安装Docker时报错 Problem: package docker-ce-3:18.09.9-3.el7.x86_64 requires containerd.io >= 1.2.2-3, ...

  7. 【小技巧】Eclipse 中创建Maven项目后没有WEB-INF文件夹以及web.xml文件

    懒得截图了,一张图配下面步骤搞定. 1.右键项目,选择propertities后选择图中①(被遮住了): 2.先不②勾选去掉,点击Apply:然后在把②处勾选上.此时④位置会出现东东,点击蓝色超链接. ...

  8. idea 2018.3.3版本激活到

        新装的,还是试用版本,下面就是进行激活操作: 先下载 链接: https://pan.baidu.com/s/1o44bsO7tx3WGuO5GgT0ytw 提取码: gbmw 第一步:将bi ...

  9. 基于Gitlab的CICD流程

    本片文章主要初步介绍什么是CICD流程,并且把整个流程进行拆分理解整个流程的跑通过程. 1.CICD概述 什么是CICD呢? 简单的说CICD就是持续集成自动构建自动测试自动部署. 从概念上就可以看出 ...

  10. .NET Core 基于 Grafana Loki 日志初体验

    介绍 Loki: like Prometheus, but for logs. Loki是一个轻量级的日志系统,受到Prometheus项目的启发,由Grafana团队设计和开发,所以在Grafana ...