1、自定义 flume 拦截器类,并打jar包上传到 /flume/lib 下
我这里拦截器逻辑是:
flume收集到的消息包含 hello 的发送到 kafak bigdata主题
flume收集到的消息包含 hi 的发送到 kafak bigdata1主题
import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.interceptor.Interceptor;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/* 自定义flume 拦截器 */
public class KafkaSinkInterceptor implements Interceptor {
/* 设置事件集集合 */
private List<Event> events;
/* 初始化 */
@Override
public void initialize() {
events = new ArrayList<>();
}
@Override
public Event intercept(Event event) {
/* 获取单个事件的 header */
Map<String, String> header = event.getHeaders();
/* 获取单个事件的 body */
String body = new String(event.getBody());
/* 根据body中的数据设置header */
/* 这里可以写自己需要的业务逻辑 */
if (body.contains("hello")) {
header.put("topic", "bigdata");
} else if (body.contains("hi")) {
header.put("topic", "bigdata1");
}
return event;
}
@Override
public List<Event> intercept(List<Event> list) {
/* 对每次批数据进来清空事件集 */
events.clear();
/* 循环处理单个事件 */
for (Event event : events) {
events.add(intercept(event));
}
return events;
}
@Override
public void close() {
}
/* 静态内部类创建,自定义拦截器对象 */
public static class MyIntercept implements Interceptor.Builder{
@Override
public Interceptor build() {
return new KafkaSinkInterceptor();
}
@Override
public void configure(Context context) {
}
}
}
二、flume 配置文件
Interceptor 接口还有一个 公共的内部接口(Builder) ,所以自定义拦截器 要实现 Builder接口,也就是实现一个内部类(该内部类的主要作用是:获取flume-conf.properties 自定义的 参数,并将参数传递给 自定义拦截器)
# Name the components on this agent
# source:起一个别名
# properties文件它是java的配置文件,=左边就是键,=右边是值;键的开头都是以a1(就是flume的名字--agent的名字就是a1);a1随便起
a1.sources = r1
# sink:起一个别名
a1.sinks = k1
# channels;:起一个别名
a1.channels = c1
# Describe/configure the source
# a1(agent的名字).sources(来源).r1(来源的名字);配置多个来源
# type:不能随便写(文档上说明)
a1.sources.r1.type = netcat
# bind:netcat的一个属性(绑定),允许任何人访问
a1.sources.r1.bind = 0.0.0.0
# port:netcat的一个属性;(端口)
a1.sources.r1.port = 44444
#Interceptor
# interceptors 起一个别名
a1.sources.r1.interceptors = i1
#自定义拦截器全类名+$内部类名
a1.sources.r1.interceptors.i1.type = com.gu.interceptor.KafkaSinkInterceptor$MyIntercept
# Describe the sink
# 描述一个sink: lkafka sink
a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
# kafak集群
a1.sinks.k1.kafka.bootstrap.servers = cenos7-1:9092,cenos7-2:9092,cenos7-3:9092,centos7-4:9092
# 默认发往的kafka topic
a1.sinks.k1.kafka.topic = kafka-java
a1.sinks.k1.kafka.flumeBatchSize = 20
a1.sinks.k1.kafka.producer.acks = 1
a1.sinks.k1.kafka.producer.linger.ms = 1
# Use a channel which buffers events in memory
# 描述一下channel:内存
a1.channels.c1.type = memory
# capacity:容量
a1.channels.c1.capacity = 1000
# transactionCapacity:事务的容量
a1.channels.c1.transactionCapacity = 100
# Bind the source and sink to the channel
# 绑定;source和channel绑定
a1.sources.r1.channels = c1
# sink和channel绑定
a1.sinks.k1.channel = c1
三、开启 kafka consumer 分别准备消费 kafka-java 、bigdata 、bigdata1 这三个主题中的数据
[root@centos7-1 kafka]# bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic kafka-java --from-beginning
[root@centos7-2 kafka]# bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic bigdata --from-beginning
[root@centos7-2 kafka]# bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic bigdata1 --from-beginning
四、启动 flume
[root@centos7-3 apache-flume]# bin/flume-ng agent --conf conf --conf-file conf/kafka-sink-interceptors.properties --name a1 -Dflume.root.logger=INFO,console
五、模拟生产数据, 用于 flume收集
[root@centos7-3 data]# telnet localhost 44444