flume+kafka收集业务日志

介绍

我们的用户是经常在登陆,由于是涉及到设备,产品希望每个用户一登陆,后台系统就能感知到其变化,即实时更新,
登陆数据量是很大的,大约一天有1500W左右的数据,且比较集中在晚上.高峰时1秒钟要处理200多个登陆请求,
负责登陆的系统是业务的核心,架构上我们不想让它受到更多的压力,于是决定以 日志方式,收集数据后进行用户时间的更新。

我们采用flume+kafka的方式来收集
flume是1.7版本
kafka 是 0.10.1版本

flume及kafka的配置

启动是很简单的,写好一个配置文件,然后启动即可,
可参考官网 http://flume.apache.org/index.html

启动flume
./bin/flume-ng agent -n a1 -c conf -f conf/flume-conf.properties -Dflume.root.logger=INFO,console

配置文件是要先写好的
flume+kafka收集业务日志_第1张图片

a1.sources = r1
a1.sinks = k1
a1.channels = c1
# 配置 source
a1.sources.r1.type = org.apache.flume.source.taildir.TaildirSource
a1.sources.r1.positionFile = /xxxx/flume/taildir_position_klog.json
a1.sources.r1.filegroups = f1
a1.sources.r1.filegroups.f1 =/xxxx/log/business_login/business.tmp
a1.sources.r1.batchSize = 100
a1.sources.r1.backoffSleepIncrement  = 1000
a1.sources.r1.maxBackoffSleep  = 5000
a1.sources.r1.recursiveDirectorySearch = true
a1.sources.r1.yarnApplicationHeader = true
a1.sources.r1.yarnContainerHeader = true
# 配置 sink
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
a1.sinks.k1.brokerList = xxxx:9092
a1.sinks.k1.topic = klog
a1.sinks.k1.serializer.class = kafka.serializer.StringEncoder
# 定义 channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# 用 channel 连接起来 source 和 sink
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

flume有source和sink ,source即来源,我们上面是指向一个日志文件的,sink则是数据流出,我们这里是使用kafka的,flume有官方的kafka集成插件,如果你想到sink到其它自定义的地方,也可以自己写插件

在上面的配置中,我们监听 a1.sources.r1.filegroups.f1 ,在读的过程 中,会把记录存在 a1.sources.r1.positionFile,通过a1.channels.c1.type这个 channel, 把数据流向 a1.sinks.k1.type 中.

业务系统写日志是用log4j的,40M写完一个文件就切换,我们只需要监听那个一直写的文件即可。

严重提醒!!!flume有一个极其蛋疼的问题,如果你监听一个文件,那个文件追加的数据会被 flume 给获取,但是!!如果你去主动追加/vi加上一行,那这个flume就会无限重复全文件扫读后扔给kafka。。可以自行测试下。

kafka 的配置可参考:
http://blog.csdn.net/mingover/article/details/73604130

kafak不用作其它的配置,flume只是作为它的一个生产者.kafka会在硬盘里存7天左右的数据,所以消费者要及时消费完。

使用状态分析

我们有三台服务器会生成日志,部署三个flume,都指向同一个kafka,我们的kafak现在还不是分布的,但使用上也没啥问题,其占用内存挺少,我们没有特别去配置kafka,运行了1个多月,其内存只占用 32G中的4%左右, gc上fullgc也只是0次.
速度上也能保证。

kafka消费者的处理也是要多注意,相对生产者来讲,消费者比较复杂,由于数据量较大,我们的消费者也分了三个服务,通过同一个group 来负载均衡的。

你可能感兴趣的:(java,kafka-消息发布与订阅,flume)