一、为什么集成flume和kafka?
一般使用Flume+Kafka架构都是希望完成实时流式的日志处理,前台可能有多个Flume端采集数据向存储服务器扔,这时数据采集速度过快,而一旦数据处理速度无法跟上采集速度,很容易造成数据堆积或数据丢失的结果。这时,kafka可以当做一个消息缓存队列,从广义上理解,把它当做一个数据库,可以存放一段时间的数据;第二、Kafka属于中间件,一个明显的优势就是使各层解耦,使得出错时不会干扰其他组件。
二、Flume+Kafka实战
2.1 Flume配置
- flume采集的是离线型文件数据,source采用Spooling Directory Source;
- 数据都是存储在文件内,channel采用File Channel;
- 因为数据出口为kafka,sinks自然采用kafka sink;
[root@sole flume_conf]# vi kafka_event.conf
#定义source,channel,和sink的名字
a1.channels=c1
a1.sources=s1
a1.sinks=k1
#设置source为Spooling Directory Source(专门对文件提取的一种source)
a1.sources.s1.type=spooldir
a1.sources.s1.channels=c1
#设置source文件目录位置
a1.sources.s1.spoolDir=/opt/data/events
#设置单个事件中包含的最大字符数。如果一行超出此长度,则会被截断,并且该行中的其余字符将出现在后续事件中;
#这里如果不知道单行最大长度,可以用命令查看(wc -L FILENAME)
a1.sources.s1.deserializer.maxLineLength=1000
#因为文件首行包含表头,需要添加过滤器过滤表头
a1.sources.s1.interceptors=i1
#设置为正则过滤,条件成立则过滤
a1.sources.s1.interceptors.i1.type=regex_filter
a1.sources.s1.interceptors.i1.regex=\s*event_id.*
a1.sources.s1.interceptors.i1.excludeEvents=true
#设置channel为File Channel,并设置检查点目录、数据目录
a1.channels.c1.type=file
a1.channels.c1.checkpointDir=/opt/flume/checkpoint
a1.channels.c1.dataDirs=/opt/flume/data
#设置sink为kafka sink
a1.sinks.k1.channel=c1
a1.sinks.k1.type=org.apache.flume.sink.kafka.KafkaSink
#设置kafka对应的topic
a1.sinks.k1.kafka.topic=events
#kafka所在ip地址
a1.sinks.k1.kafka.bootstrap.servers=192.168.237.160:9092
#设置flume批量发送的数量
a1.sinks.k1.kafka.flumeBatchSize=10
#设置kafka produce的ack备份机制(-1为leader和follow全部备份完成反馈)
a1.sinks.k1.kafka.producer.acks=-1
#设置produce发送日志的间隔时间(与下面的条件为或关系,二者满足其一都发送日志消息)
a1.sinks.k1.kafka.producer.linger.ms=1
#设置kafka批发送的字节数大小
a1.sinks.k1.kafka.producer.batch.size=4096
2.2 Kafka配置
- 创建kafka主题,准备写入日志数据;
[root@sole ~]# kafka-topics.sh --create --topic events --zookeeper 192.168.237.160:2181 --replication-factor 1 --partitions 1
2.3 开启消费端,并执行Agent任务
- 新开一个session开启kafka对应主题的consumer消费数据
[root@sole ~]# kafka-console-consumer.sh --bootstrap-server 192.168.237.160:9092 --topic events --from-beginning
- 执行Agent任务
[root@sole ~]# flume-ng agent --name a1 --conf /opt/software/flume160/conf/ -f /opt/flumeconf/kafka_event.conf -Dflume.root.logger=DEBUG,console
2.4 数据检查
- kafka端查看offset与文件行数是否一致,确保数据无误;
[root@sole ~]# kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list 192.168.237.160:9092 --topic events --time -1
三、问题总结
- Flume采集数据半途不再采集数据,原因是内存溢出:编辑${FLUME_HOME}/bin/flume-ng,修改JAVA_OPTS="-Xmx
20
m" (默认为20m) ,调整内存大小但是别超过你的物理内存; - 采集数据的行数超过文件对应的行数:
source端的deserializer.maxLineLength设置过小
,没有超过文件最长行的字节长度; - channel的目录检查:
没有将检查点目录和数据目录清空
;
PS:如果有写错或者写的不好的地方,欢迎各位大佬在评论区留下宝贵的意见或者建议,敬上!如果这篇博客对您有帮助,希望您可以顺手帮我点个赞!不胜感谢!
原创作者:wsjslient |