flume中 kafka sink flume自定义Interceptor实现消息分主题收集

目录

1、自定义 flume 拦截器类,并打jar包上传到 /flume/lib 下

二、flume 配置文件

三、开启 kafka consumer 分别准备消费 kafka-java 、bigdata 、bigdata1 这三个主题中的数据

四、启动 flume

五、模拟生产数据, 用于 flume收集

六、效果演示


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

六、效果演示

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flume使用Kafka作为Sink的步骤如下: 1. 安装Kafka:首先需要安装Kafka,可以从官网上下载最新版本:https://kafka.apache.org/downloads 2. 配置Kafka:配置Kafka的端口号、主题名称、副本数等参数。在config/server.properties文件进行配置。 3. 在Flume添加Kafka Sink:在Flume配置文件添加一个Kafka Sink,并配置它与Kafka的连接信息和主题等。 4. 启动KafkaFlume:启动KafkaFlume。 以下是一个示例Flume配置文件,使用Kafka作为Sink: ``` # Name the components on this agent agent.sources = source agent.sinks = kafkaSink agent.channels = memoryChannel # Describe/configure the source agent.sources.source.type = netcat agent.sources.source.bind = localhost agent.sources.source.port = 44444 # Describe the sink agent.sinks.kafkaSink.type = org.apache.flume.sink.kafka.KafkaSink agent.sinks.kafkaSink.brokerList = localhost:9092 agent.sinks.kafkaSink.topic = myTopic agent.sinks.kafkaSink.serializer.class = kafka.serializer.StringEncoder # Use a channel which buffers events in memory agent.channels.memoryChannel.type = memory agent.channels.memoryChannel.capacity = 1000 # Bind the source and sink to the channel agent.sources.source.channels = memoryChannel agent.sinks.kafkaSink.channel = memoryChannel ``` 在这个配置,使用netcat作为源,监听本地的44444端口。在Kafka Sink,配置连接信息和主题名称等参数。同时也使用了一个内存间件,用于缓存事件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值