Flume+Kafka+Kafka Stream

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值