Flume整合Kafka采集滚动的日志
背景:
从Nginx中间件采集web项目产生的滚动日志。通过本地服务器(简称:A服务)的Flume采集日志,然后传输到另外一台服务器(简称:B服务器)的Flume上,然后暂存到 B服务器 的Kafka中。
为了展示效果,通过Kafka的consumer进行消费,打印到字符界面。
1、Flume的配置文件如下:
1.1、A服务器上,[exec-memory-avro.conf] 配置文件如下:
# agent properties
exec-memory-avro.sources = r1
exec-memory-avro.sinks = k1
exec-memory-avro.channels = c1
# sourecs properties
exec-memory-avro.sources.r1.type = exec
exec-memory-avro.sources.r1.command = tail -F /home/cyx/data/flume-logs-tmp/logs.txt
exec-memory-avro.sources.r1.shell = /bin/sh -c
# sinks properties
# eg: exec-memory-avro.sinks.k1.type = logger
exec-memory-avro.sinks.k1.type = avro
exec-memory-avro.sinks.k1.hostname = h6 # B服务器hostname
exec-memory-avro.sinks.k1.port = 44444
# channels properties
exec-memory-avro.channels.c1.type = memory
# Bind the source and sink to channel
exec-memory-avro.sources.r1.channels = c1
exec-memory-avro.sinks.k1.channel = c1
1.2、B服务器上,[avro-memory-kafka.conf] 配置文件如下:
# agent properties
avro-memory-kafka.sources = r1
avro-memory-kafka.sinks = k1
avro-memory-kafka.channels = c1
# source properties
avro-memory-kafka.sources.r1.type = avro
avro-memory-kafka.sources.r1.bind = 0.0.0.0 # 或者直接写 B服务器hostname
avro-memory-kafka.sources.r1.port = 44444
# sink properties
avro-memory-kafka.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
avro-memory-kafka.sinks.k1.kafka.topic = my-topic
# flume1.6版本后改成 bootstrap.servers了,1.6之前是 brokerList
avro-memory-kafka.sinks.k1.kafka.bootstrap.servers = h5:9092,h6:9092,h7:9092
avro-memory-kafka.sinks.k1.kafka.flumeBatchSize = 5
avro-memory-kafka.sinks.k1.kafka.producer.acks = 1
avro-memory-kafka.sinks.k1.kafka.producer.linger.ms = 1
avro-memory-kafka.sinks.k1.kafka.producer.compression.type = snappy
# channels properties
avro-memory-kafka.channels.c1.type = memory
# bind the sources and sinks to channels
avro-memory-kafka.sources.r1.channels = c1
avro-memory-kafka.sinks.k1.channel = c1
2、步骤:
2.1、需要先启动B服务器上的Flume
flume-ng agent -n avro-memory-kafka -c /opt/flume/conf/ -f /opt/flume/conf/avro-memory-kafka.conf -Dflume.root.logger=INFO,console
命令行最后一部分会有信息如下:[INFO - org.apache.flume.source.AvroSource.start(AvroSource.java:260)] Avro source r1 started.
2.2、然后启动A服务器上的Flume
flume-ng agent -n exec-memory-avro -c /opt/flume/conf/ -f /opt/flume/conf/exec-memory-avro.conf -Dflume.root.logger=INFO,console
这时会看到B服务器上显示两台服务器连接成功的信息:。。。。B服务器IP:44444] CONNECTED: /A服务器IP:33478
2.3、然后启动B服务器上的Kafka
kafka-console-consumer.sh --zookeeper h6:2181 --topic my-topic
3、测试:
3.1、向A服务器的文件写入信息进行测试
echo word count1 >> /home/cyx/data/flume-logs-tmp/logs.txt
echo word count2 >> /home/cyx/data/flume-logs-tmp/logs.txt
echo word count3 >> /home/cyx/data/flume-logs-tmp/logs.txt
echo word count4 >> /home/cyx/data/flume-logs-tmp/logs.txt
3.2、查看B服务器的控制台,可以看到
word count1
word count2
word count3
word count4
如果没有到,需要等一会,因为flumeBatchSize = 5,需要超过设置缓存的时间后,才会传到Kafka中
注释:
1).tail -F /home/cyx/data/flume-logs-tmp/logs.txt 执行Linux命令tail,实时采集logs.txt中新增的日志
2).参数 flume.root.logger=INFO,console 是让打印日志消息到终端
3).flume 的启动参数 -n 后为flume的agent的名称,必须和对应的文件一直,否则启动不成功