Flume:自定义拦截器-选择器-kafka

本文详细介绍了Flume如何自定义拦截器和选择器,包括复制选择器和多路复用选择器的使用,以及在级联配置中实现项目分流的需求。同时,讲解了序列化和反序列化的基本概念及常用方法,如ObjectOutputStream、DataOutputStream、Writable等,并探讨了Flume级联下的高可用策略。
摘要由CSDN通过智能技术生成

一、kafka基本操作与flume级联案例操作手册(不使用选择器、拦截器)

1、启动hdfs、kafka

(1)如果是第一次启动kafka,启动前需要设置一下broker.id=0或1:

vi /opt/apps/kafka_2.11-2.0.0/config/server.properties 

①broker.id=0或broker.id=1

②zookeeper地址:

zookeeper.connect=doitedu01:2181,doitedu02:2181,doitedu03:2181

(2)①先启动zookeeper:

zkall.sh start

②后台启动kafka:(后台:-daemon;三台都需要启动)

bin/kafka-server-start.sh  -daemon config/server.properties

③查看端口:jps -m

④如果出现下面这种情况:

1356 -- process information unavailable

说明进程程序已经退出的,但是进程没有关掉

⑤找到这个进程:

find / -name 1356

得到如下地址:

/tmp/hsperfdata_impala/1356

这是个impala的进程

⑥删掉即可:

rm -rf /tmp/hsperfdata_impala

2、准备级联配置:(第一版:不使用选择器、拦截器)

agent级联配置,没有加选择器和拦截器,使用avro,kafka sink

##第一级配置,第一级所有的节点配置都一样

a1.sources = r1
a1.channels = c1
a1.sinks = k1

a1.sources.r1.channels = c1
a1.sources.r1.type = TAILDIR
a1.sources.r1.filegroups = g1
a1.sources.r1.filegroups.g1 = /logdata/a.*
a1.sources.r1.fileHeader = false

a1.channels.c1.type = file

a1.sinks.k1.channel = c1
a1.sinks.k1.type = avro
a1.sinks.k1.hostname = doitedu02
a1.sinks.k1.port = 4444

##第二级agent配置,使用file channel,下一级bind、端口决定上一级

a1.sources = r1
a1.channels = c1
a1.sinks = k1

a1.sources.r1.channels = c1
a1.sources.r1.type = avro
a1.sources.r1.bind = doitedu02
a1.sources.r1.port = 4444
a1.sources.r1.batchSize = 100

a1.channels.c1.type = file

a1.sinks.k1.channel = c1
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
a1.sinks.k1.kafka.bootstrap.servers = doitedu01:9092,doitedu02:9092,doitedu03:9092
a1.sinks.k1.topic = doitedu17
a1.sinks.k1.flumeBatchSize = 100
a1.sinks.k1.producer.acks = 1

3、kafka的基本命令操作:

启动kafka

bin/kafka-server-start.sh  -daemon config/server.properties

(1)topic查看

bin/kafka-topics.sh --list --zookeeper doitedu01:2181

(2)topic创建(指定topic名、分区数、副本数)

bin/kafka-topics.sh --create --topic topic2 --partitions 2 --replication-factor 2 --zookeeper doitedu01:2181

(3)启动一个控制台生产者来生产数据

bin/kafka-console-producer.sh --broker-list doitedu01:9092,doitedu02:9092,doitedu03:9092 --topic topic2

(4)启动一个控制台消费者来消费数据

bin/kafka-console-consumer.sh --bootstrap-server doitedu01:9092,doitedu02:9092,doitedu03:9092 --topic topic2 --from-beginning

(5)kafka基本概念示意图:

在这里插入图片描述

4、启动flume

doitedu01作为第一级,doitedu02作为第二级

(1)将配置文件按分级放在不同机器上

①第一台机器:

vi /opt/apps/flume-1.9.0/agentconf/tail-flume-avrosink.properties

将第一级配置放入properties中

②第二台机器:

vi /opt/apps/flume-1.9.0/agentconf/tail-flume-avrosink.properties

将第一级配置放入properties中

(2)模拟日志生成:

cd /logdata

while true;do echo "123456$RANDOM i love you" >> a.log;sleep 0.2;done

(3)启动kafka

bin/kafka-server-start.sh  -daemon config/server.properties

(4)启动flume;

①先启动第二级:(doitedu02中)

bin/flume-ng agent -c conf -f agentconf/avro-flume-kfksink.properties -n a1 -Dflume.root.logger=debug,console 

查看进程得知,启动了一个application,可以查看一下application的端口号:

netstat -nltp  | grep 120017

得到结果如下:

tcp6       0      0 192.168.77.42:4444      :::*                    LISTEN      120017/java 

②再启动第一级:(doitedu01中)

bin/flume-ng agent -c conf -f agentconf/avro-flume-kfksink.properties -n a1 -Dflume.root.logger=debug,console 

(5)查看kafka中:

①查看是否写入:

bin/kafka-topics.sh --list --zookeeper doitedu01:2181

②检查数据是否到了kafka,启动消费者:

bin/kafka-console-consumer.sh --bootstrap-server doitedu01:9092,doitedu02:9092,doitedu03:9092 --topic doitedu17

③停止:CTRL+C

二、channel选择器-自定义拦截器-项目分流需求

1、调用:

source先调用拦截器,得到结果,再调用选择器,将结果放入指定channel。

2、两种选择器:

replicating selector和multiplexing selector

3、复制选择器(默认):replicating selector

(1)场景:

selector将event复制,taildir采集完,分发给所有下游节点,一个是hdfs,一个是kafka

(2)配置:

a1.sources = r1
a1.channels = c1 c2
a1.sinks = k1 k2

a1.sources.r1.channels = c1 c2
a1.sources.r1.type = TAILDIR
a1.sources.r1.filegroups = g1
a1.sources.r1.filegroups.g1 = /logdata/a.*
a1.sources.r1.fileHeader = false
a1.sources.r1.selector.type = replicating
a1.sources.r1.selector.optional = c2
a1.sources.r1.interceptors = i1 i2

a1.sources.r1.interceptors.i1.type = timestamp
a1.sources.r1.interceptors.i1.headerName = timestamp

a1.sources.r1.interceptors.i2.type = cn.doitedu.yiee.flume.MultiplexingInterceptor$MultiplexingInterceptorBuilder
a1.sources.r1.interceptors.i2.flagfield = 2

a1.channels.c1.type = memory

a1.channels.c2.type = memory

a1.sinks.k1.channel = c1
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
a1.sinks.k1.kafka.bootstrap.servers = doitedu01:9092,doitedu02:9092,doitedu03:9092
a1.sinks.k1.kafka.topic = doitedu17
a1.sinks.k1.kafka.producer.acks = 1


a1.sinks.k2.channel = c2
a1.sinks.k2.type = hdfs
a1.sinks.k2.hdfs.path = hdfs://doitedu01:8020/flumedata/%Y-%m-%d/%H
a1.sinks.k2.hdfs.filePrefix = doitedu-log-
a1.sinks.k2.hdfs.fileSuffix = .log
a1.sinks.k2.hdfs.rollSize = 268435456
a1.sinks.k2.hdfs.rollInterval = 120
a1.sinks.k2.hdfs.rollCount = 0
a1.sinks.k2.hdfs.batchSize = 1000
a1.sinks.k2.hdfs.fileType = CompressedStream
a1.sinks.k2.hdfs.codeC = snappy
a1.sinks.k2.hdfs.useLocalTimeStamp = false

注:
source中:

①type:selector的类型使用复制选择器replicating。

②optional:选择器的可选channel,如果不写,代表c1和c2都是必须的。

③interceptors:拦截器。

sink中:

①k1是kafka,k2是hdfs。

②k1.kafka.bootstrap.servers:服务器地址,写法:主机名:端口号,用逗号隔开。

③rollInterval:大小与hdfs切块大小无关。

4、多路复用选择器:multiplexing selector

(1)简介:

①可以根据event中的一个指定key的val

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值