目录
Flume采集数据到Kafka的TopicA,再使用Kafka Stream将TopicA的数据进行某些逻辑处理后再写入TopicB。
案例一:现有一张表user_friends,表结构如下,去掉表头,使用flume将内容写进Kafka的TopicA,将第二列扁平化处理写入TopicB。
1、Flume–>Kafka TopicA
Flume发送数据到Kafka上,主要是通过KafkaSink来实现的,主要步骤如下:
1.1 启动Zookeeper和Kafka
这里启动一个单节点的Kafka作为测试:
# 启动Zookeeper
zkServer.sh start
# 后台启动Kafka
kafka-server-start.sh -daemon /opt/kafka/config/server.properties
1.2 创建主题
创建一个主题 user_friends_raw
,之后Flume收集到的数据都会发到这个主题上:
# 创建主题
kafka-topics.sh --create --zookeeper 192.168.136.20:2181 --topic user_friends_raw --partitions 1 --replication-factor 1
# 查看创建的主题
kafka-topics.sh --zookeeper hadoop001:2181 --list
1.3 配置Flume
新建配置文件:vi /opt/flume/conf/jobkb09/userFriend-flume-kafka.conf
,文件内容如下。这里我们监听/opt/flume/conf/jobkb09/dataSourceFile/userFriend
目录下文件,当有新增文件且文件命名符合配置文件里的要求,就将该文件的内容发送到Kafka的 user_friends_raw
主题上:
user_friend.sources=userFriendSource
user_friend.channels=userFriendChannel
user_friend.sinks=userFriendSink
user_friend.sources.userFriendSource.type=spooldir
user_friend.sources.userFriendSource.spoolDir=/opt/flume/conf/jobkb09/dataSourceFile/userFriend
user_friend.sources.userFriendSource.deserializer=LINE
user_friend.sources.userFriendSource.deserializer.maxLineLength=320000
user_friend.sources.userFriendSource.includePattern=userFriend_[0-9]{
4}-[0-9]{
2}-[0-9]{
2}.csv
user_friend.sources.userFriendSource.interceptors=head_filter
user_friend.sources.userFriendSource.interceptors.head_filter.type=regex_filter
user_friend.sources.userFriendSource.interceptors.head_filter.regex=^user,friends*
user_friend.sources.userFriendSource.interceptors.head_filter.excludeEvents=true
user_friend.channels.userFriendChannel.type=file
user_friend.channels.userFriendChannel.checkpointDir=/opt/flume/conf/jobkb09/checkPointFile/userFriend
user_friend.channels.userFriendChannel.dataDirs=/opt/flume/conf/jobkb09/dataChannelFile/userFriend
# 设置Kafka接收器
user_friend.sinks.userFriendSink.type=org.apache.flume.sink.kafka.KafkaSink
# 向Kafka写入内容时每次批量操作的event数量,默认是100
user_friend.sinks.userFriendSink.batchSize=640
# 设置Kafka地址
user_friend.sinks.userFriendSink.brokerList=192.168.136.20:9092
# 设置发送到Kafka上的主题
user_friend.sinks.userFriendSink.topic=user_friends_raw
user_friend.sources.userFriendSource.channels=userFriendChannel
user_friend.sinks.userFriendSink.channel=userFriendChannel
1.4 启动Flume
[root@hadoop20 flume]# ./bin/flume-ng agent --name user_friend --conf ./conf/ --conf-file ./conf/jobkb09/userFriend-flume-kafka.conf -Dflume.root.logger=INFO,console
1.5 测试
向监听的/opt/flume/conf/jobkb09/dataSourceFile/userFriend
目录下传输文件,查看Kafka消费者的输出:
cp /opt/flume/conf/jobkb09/tmp/user_friends.csv /opt/flume/conf/jobkb09/dataSourceFile/userFriend/userFriend_2020-12-16.csv
我们在Flume配置文件设置了拦截器,过滤掉第一条,我们可以验证一下是否写全:
#查看源文件user_friends.csv中总共多少数据量,共有38203条数据
wc -l /opt/flume/conf/jobkb09/tmp/user_friends.csv
# 查看消息队列中每个分区消息数量,去掉头是38202条数据
kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list 192.168.136.20:9092 --topic user_friends_raw -time -1 --offsets 1
2、TopicA–>TopicB
2.1 编写代码
import org.apache.kafka