Kafka与Flume和HDFS整合应用之日志采集系统项目


前言

Flume 是一个连接各种组件和系统的桥梁,在$FLUME_HOME/lib 目录下有Flume与HBase、HDFS等集成的 jar文件,可以很方便地与HBase和HDFS连接。在实际业务中,我们一般通过Flume 从应用程序实时采集数据写入到Kafka,而将历史数据通过Flume 导入到HDFS以用于离线分析计算。当然,我们也可以通过Flume从Kafka将数据写入到HBase和HDFS。
下面我将为大家介绍如何使用Flume快速消费Kafka Topic数据,然后将消费后的数据实时转发到HDFS上。


项目需求

使用Flume实时采集数据写入Kafka主题中,并持久化到本地磁盘,然后通过Flume消费主题消息,并实时写入到HDFS,供开发人员进行离线分析计算。


一、Flume采集日志写入Kafka

创建一个flume-kafka.properties文件,写入相关配置如下。
首先指定源、接收器和通道的名称,配置如下:

agent.sources = sc #指定源名称
agent.sinks = sk #指定接收器名称
agent.channels = chl #指定通道名称

1.Source配置

agent.sources.sc.type = exec #指定源类型为linux命令
agent.sources.sc.channels = chl #绑定通道,指定源将事件传递的通道,可以指定多个通道
agent.sources.sc.command = tail -f /opt/flume/test.log #以tail命令打开文件输出流
agent.sources.sc.fileHeader = false #指定事件不包括头信息

2.Sinks配置

#接收器类型
agent.sinks.sk.type = org.apache.flume.sink.kafka.KafkaSink
#绑定通道,指定接收器读取数据的通道
agent.sinks.sk.channel = chl
agent.sinks.sk.kafka.bootstrap.servers = 172.20.10.3:9092,172.20.10.4:9092:172.20.10.5:9092
#指定写入Kafka的主题
agent.sinks.sk.kafka.topic=flume-kafka
#指定序列化类
agent.sinks.sk.serializer.class=kafka.serializer.StringEncoder
#生产者acks方式
agent.sinks.sk.producer.acks = 1
#指定字符编码
agent.sinks.sk.custom.encoding = UTF-8

3.Channel配置

agent.channels.chl.type = memory #指定通道类型
agent.channels.chl.capacity = 1000 #在通道中停留的最大事件数
agent.channels.chl.transactionCapacity = 1000 #每次从源拉取的事件数及给接收器的事件数

Flume安装以及更详细的请看我之前写的:Flume采集日志写入Kafka


二、Flume采集Kafka消息写入HDFS

首先创建一个kafka2hdfs.properties文件,并完成源、通道和接收器名称的定义,配置信息如下:

# source alias
agent.sources = source_from_kafka  
# channels alias
agent.channels = mem_channel  
# sink alias
agent.sinks = hdfs_sink

1.KafkaSource配置

代码如下:

# define kafka source
agent.sources.source_from_kafka.type = org.apache.flume.source.kafka.KafkaSource  
agent.sources.source_from_kafka.channels = mem_channel  
agent.sources.source_from_kafka.batchSize = 5000  

# set kafka broker address  
agent.sources.source_from_kafka.kafka.bootstrap.servers = hadoop2:9092,hadoop3:9092

# set kafka topic
agent.sources.source_from_kafka.kafka.topics = flume-kafka

# set kafka groupid
agent.sources.source_from_kafka.kafka.consumer.group.id = flume_test_id

2.KafkaSinks配置

代码如下:

# defind hdfs sink
agent.sinks.hdfs_sink.type = hdfs 

# specify the channel the sink should use  
agent.sinks.hdfs_sink.channel = mem_channel

# set store hdfs path
agent.sinks.hdfs_sink.hdfs.path = /data/flume/kafka/%Y-%m-%d/%H 

agent.sinks.hdfs_sink.hdfs.fileSuffix = .txt

# set file size to trigger roll
agent.sinks.hdfs_sink.hdfs.rollSize = 0  
agent.sinks.hdfs_sink.hdfs.rollCount = 0  
agent.sinks.hdfs_sink.hdfs.rollInterval = 3600  
agent.sinks.hdfs_sink.hdfs.threadsPoolSize = 30
agent.sinks.hdfs_sink.hdfs.fileType=DataStream    
agent.sinks.hdfs_sink.hdfs.writeFormat=Text    

3.KafkaChannel配置

代码如下:

# define channel from kafka source to hdfs sink 
agent.channels.mem_channel.type = memory  

# channel store size
agent.channels.mem_channel.capacity = 100000
# transaction size
agent.channels.mem_channel.transactionCapacity = 10000

三、启动Flume NG和Kafka验证

1.启动Flume采集日志写入Kafka代理

flume-ng agent -n agent -f $FLUME_HOME/conf/flume-kafka.properties &>flume-kafka.log &

2.启动Flume采集Kafka消息写入HDFS代理

flume-ng agent -n agent -f $FLUME_HOME/conf/kafka2hdfs.properties &>kafka2hdfs.log &

3.效果展示

消费:

扫描二维码关注公众号,回复: 12676875 查看本文章
[root@hadoop2 ~]# kafka-console-consumer.sh --bootstrap-server 172.18.221.221:9092,172.29.155.250:9092  --topic flume-kafka
hello,2020-12-25,16:38:41,15223012324
hello,2020-12-25,16:38:51,15223012324
hello,2020-12-25,16:39:01,15223012324
hello,2020-12-25,16:39:11,15223012324
hello,2020-12-25,16:39:21,15223012324
hello,2020-12-25,16:39:31,15223012324
hello,2020-12-25,16:39:41,15223012324

HDFS:

[root@hadoop1 /]# hdfs dfs -cat /data/flume/kafka/2020-12-25/16/FlumeData.1608885511599.txt.tmp
hello,2020-12-25,16:38:11,15223012324
hello,2020-12-25,16:38:01,15223012324
hello,2020-12-25,16:38:21,15223012324
hello,2020-12-25,16:38:31,15223012324
hello,2020-12-25,16:38:41,15223012324
hello,2020-12-25,16:38:51,15223012324
hello,2020-12-25,16:39:01,15223012324
hello,2020-12-25,16:39:11,15223012324
hello,2020-12-25,16:39:21,15223012324
hello,2020-12-25,16:39:31,15223012324
hello,2020-12-25,16:39:41,15223012324

在这里插入图片描述

总结

这里我写入到HDFS的方法为一个小时创建一个文件夹,具体请根据实际情况而定,正在接收数据写操作的文件的后缀默认为.tmp,写操作完成之后,后缀会自动删除。

猜你喜欢

转载自blog.csdn.net/qq_36588424/article/details/111685083