关于Flume-Kafka-Flume的模式进行数据采集操作


测试是否连接成功:

在主节点flume目录下输入命令:

bin/flume-ng agent -n a1 -c conf/ -f job/file_to_kafka.conf -Dflume.root.logger=info,console

这个file_to_kafka.conf文件就是我们的配置文件

然后在另一台节点输入命令进行消费数据:

kafka-console-consumer.sh --bootstrap-server hadoop102:9092 --topic topic_log

然后再开一个主节点终端,在这个主节点上面在对应生成数据的文件追加数据

这样就可以看见第一个主节点的终端和消费节点上面有数据变化了!


下面这个是配置拦截器,把json格式的内容进行消费,其他的进行拦截

Flume采集数据到kafka的配置conf文件内容:

#定义组件

#1、定义source、channel、agent名称

a1.sources = r1

a1.channels = c1

#配置source

#2、描述source

a1.sources.r1.type = TAILDIR

#指定监控的组名

a1.sources.r1.filegroups = f1

#指定f1组监控的路径

a1.sources.r1.filegroups.f1 = /opt/software/applog/log/app.*

#指定断点续传的文件

a1.sources.r1.positionFile = /opt/software/flume/taildir_position.json

配置拦截器

a1.sources.r1.interceptors = i1

a1.sources.r1.interceptors.i1.type = com.atguigu.gmall.flume.interceptor.ETLInterceptor$Builder

#配置channel

#3、描述channel

a1.channels.c1.type = org.apache.flume.channel.kafka.KafkaChannel

#指定kafka集群

a1.channels.c1.kafka.bootstrap.servers = hadoop102:9092,hadoop103:9092

#指定数据写到kafka哪个topic

a1.channels.c1.kafka.topic = topic_log

#是否以Event对象的形式写入kafka

a1.channels.c1.parseAsFlumeEvent = false

#组装

#4、关联source->channel

a1.sources.r1.channels = c1

如果一开始测试我们flume和kafka是否能成功采集数据的时候,我们应该先把拦截器的两行配置先删除,后面再根据我们需要的内容进行拦截对应的内容。就比如:我们期望我们采集到数据是json格式的,如果不是json格式的话,我们就放弃这个数据。

具体操作:

(1)创建Maven工程flume-interceptor

(2)创建包:com.gugu.gmall.flume.interceptor

(3)在pom.xml文件中添加如下配置

<dependencies>

<dependency>

<groupId>org.apache.flume</groupId>

<artifactId>flume-ng-core</artifactId>

<version>1.9.0</version>

<scope>provided</scope>

</dependency>

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>fastjson</artifactId>

<version>1.2.62</version>

</dependency>

</dependencies>

<build>

<plugins>

<plugin>

<artifactId>maven-compiler-plugin</artifactId>

<version>2.3.2</version>

<configuration>

<source>1.8</source>

<target>1.8</target>

</configuration>

</plugin>

<plugin>

<artifactId>maven-assembly-plugin</artifactId>

<configuration>

<descriptorRefs>

<descriptorRef>jar-with-dependencies</descriptorRef>

</descriptorRefs>

</configuration>

<executions>

<execution>

<id>make-assembly</id>

<phase>package</phase>

<goals>

<goal>single</goal>

</goals>

</execution>

</executions>

</plugin>

</plugins>

</build>

在com.gugu.gmall.flume.utils包下创建JSONUtil类

java 复制代码
package com.gugu.gmall.flume.utils;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONException;

public class JSONUtil {
/*
* 通过异常判断是否是json字符串
* 是:返回true  不是:返回false
* */
    public static boolean isJSONValidate(String log){
        try {
            JSONObject.parseObject(log);
            return true;
        }catch (JSONException e){
            return false;
        }
    }
}

在com.gugu.gmall.flume.interceptor包下创建ETLInterceptor类

java 复制代码
package com.gugu.gmall.flume.interceptor;

import com.atguigu.gmall.flume.utils.JSONUtil;
import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.interceptor.Interceptor;


import java.nio.charset.StandardCharsets;
import java.util.Iterator;
import java.util.List;

public class ETLInterceptor implements Interceptor {

    @Override
    public void initialize() {

    }

    @Override
    public Event intercept(Event event) {
		
		//1、获取body当中的数据并转成字符串
        byte[] body = event.getBody();
        String log = new String(body, StandardCharsets.UTF_8);
		//2、判断字符串是否是一个合法的json,是:返回当前event;不是:返回null
        if (JSONUtil.isJSONValidate(log)) {
            return event;
        } else {
            return null;
        }
    }

    @Override
    public List<Event> intercept(List<Event> list) {

        Iterator<Event> iterator = list.iterator();

        while (iterator.hasNext()){
            Event next = iterator.next();
            if(intercept(next)==null){
                iterator.remove();
            }
        }

        return list;
    }

    public static class Builder implements Interceptor.Builder{

        @Override
        public Interceptor build() {
            return new ETLInterceptor();
        }
        @Override
        public void configure(Context context) {

        }

    }

    @Override
    public void close() {

    }
}

然后进行打包,复制到我们flume下的lib目录下就可以了!

然后再和上面测试一样进行测试连接,是否成功把非json格式的数据拦截成功!


感谢各位的观看,创作不易,能不能给哥们来一个点赞呢!!!

好了,今天的分享就这么多了,有什么不清楚或者我写错的地方,请多多指教!

私信,评论我呗!!!!!!

关注我下一篇不迷路哦!

相关推荐
m0_587383001 小时前
广州 24 小时自助健身房解决方案技术实现与实战指南
java·spring·小程序·架构·需求分析
曦夜日长1 小时前
Git系统篇,Git本地使用(一):从“究极进化版“到三个区域的底层原理
大数据·linux·git·elasticsearch
·云扬·1 小时前
Prompt 工程与安全:从 System 设计到注入防御
java·人工智能·安全·ai·prompt
阿明副业观察2 小时前
2026年免费AI视频生成工具功能深度解析:有无水印、中文语音及商业用途考量
大数据·人工智能·ai作画·aigc·音视频·ai写作
代码不停2 小时前
自动化测试(java)
java·开发语言·selenium·自动化
2601_962780914 小时前
2027校招准备:统计学专业如何用数据能力应聘企业经营管理管培生
大数据
阿明副业观察4 小时前
AI视频生成技术全解:生成方法、操作流程与选型指南
大数据·人工智能·ai作画·aigc·ai写作
鬼手点金4 小时前
opencode-rules 插件
java·开发语言·前端·人工智能·chrome·git·github
paopaokaka_luck5 小时前
滑雪场管理系统(AI智能助手流式对话,ECharts 运营数据分析、教练、雪具与场地一体化预约,钱包支付退款、订单核销与服务评价)
java·人工智能·spring boot·网络协议·数据分析·echarts
Leo.yuan5 小时前
FineBI AI原生版:Agent主动规划分析路径,让数据成为企业经营决策的顾问
大数据