文章目录
前言
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.效果展示
消费:
[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,写操作完成之后,后缀会自动删除。