关于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格式的数据拦截成功!


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

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

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

关注我下一篇不迷路哦!

相关推荐
步行cgn10 分钟前
MyBatis Error evaluating expression ‘ids‘. Return value (3) was not iterable 错误详
java·后端
xiaohebang10 分钟前
流失预测模型设计:行为特征分析算法选型
大数据·数据结构·经验分享
lakernote22 分钟前
图解 Kafka Consumer 常用 API:poll、seek、pause、wakeup 到底在控制什么?
分布式·kafka·linq
lhldsg27 分钟前
社区健身场地规划实战指南:从器材配置到智能化管理经验分享
java·开发语言·经验分享·小程序
LayZhangStrive28 分钟前
后端通识 - 后端工程开发常用的流程图类别
java·流程图·后端开发
WIN赢1 小时前
【抽象思想-从复杂中抽离简单、收敛的口子】
java·前端·javascript
captain3761 小时前
多线程单例模式
java·单例模式·java-ee
Meya11271 小时前
RFID 机房资产管理系统:告别手工台账,实现资产全流程自动管控
大数据·服务器
xiaotianyuanma1 小时前
【计算机毕业设计】基于Spring Boot的体育馆预约系统的设计与实现
java·spring boot·课程设计
何以解忧,唯有..1 小时前
MySQL 索引分类与底层原理深度剖析
java