flume 拦截器
目的:功能1:判断json文件,如何格式合格则正常传输,否则就不传输
功能2:判断出合格的json文件,并且key值中包含“date”才进行传输
一、创建一个Json的工具类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | package com.atguigu.gmall.flume.utils; import com.alibaba.fastjson.JSONObject; import org.apache.flume.Event; public class JSONUtil { // public static void main(String[] args) { // String log = "{date:2}"; // String key = "date"; // System.out.println(isJSONValidate(log)); // System.out.println(isContainsKey(log, key)); //// System.out.println(JSONObject.parseObject(log).containsKey(key)); // } // 判断log是否为一个合法的json public static boolean isJSONValidate(String log) { try { JSONObject.parseObject(log); //是将str转化为相应的JSONObject对象 return true ; } catch (Exception e) { // e.printStackTrace(); return false ; } } // 判断json中是否包含key值,其中如果log不是合格的json,直接走异常返回false public static boolean isContainsKey(String log,String key){ try { if (JSONObject.parseObject(log).containsKey(key)) { return true ; } else { return false ; } } catch (Exception e) { // e.printStackTrace(); return false ; } } } |
二、编写拦截器,只需要重写Event intercept和List<Event> intercept方法即可。如果传输的json文件不是很复杂,只需要重写单个event的intercept方法即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | package com.atguigu.gmall.flume.intercepter; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; 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.ArrayList; import java.util.Iterator; import java.util.List; public class ETLIntercepter implements Interceptor { @Override public void initialize() { } @Override public Event intercept(Event event) { // 获取body中的数据 byte [] body = event.getBody(); String log= new String(body, StandardCharsets.UTF_8); // 1.判断是否为合法的json,是:返回event , 否:返回null // if(JSONUtil.isJSONValidate(log ){ // return event; // }else{ // return null; // } // 2.判断是否为合法的json,且是都包含key值“date” if (JSONUtil.isContainsKey(log, "date" ) ){ return event; } else { return null ; } } @Override public List<Event> intercept(List<Event> list) { // 判断事件list中的event是都合格,如果不合格就将event的删掉,返回合格的event列表 // 如果list中的event都不合格,则返回null Iterator<Event> iterator = list.iterator(); while (iterator.hasNext()){ Event event = iterator.next(); if (intercept(event) == null ){ iterator.remove(); } } return list; } @Override public void close() { } public static class Builder implements Interceptor.Builder{ @Override public Interceptor build() { return new ETLIntercepter(); } @Override public void configure(Context context) { } } } |
三、生成rtProj-1.0-SNAPSHOT-jar-with-dependencies.jar包上传到flume的lib目录下,然后再编辑flume的配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | a1.sources = r1 a1.channels = c1 # Describe/configure the source a1.sources.r1.type = taildir a1.sources.r1.filegroups=f1 a1.sources.r1.filegroups.f1 = /workplace/data/log*.* a1.sources.r1.positionFile = /workplace/data/taildir_position.json a1.sources.r1.interceptors = i1 a1.sources.r1.interceptors.i1.type = com.atguigu.gmall.flume.intercepter.ETLIntercepter$Builder #i1.type :此地址是拦截器中Builder的地址(右键点击Copy Reference,记得将.Builder中的 . 换成$号) # Use a channel which buffers events in memory a1.channels.c1.type = org.apache.flume.channel.kafka.KafkaChannel a1.channels.c1.kafka.bootstrap.servers=master: 9092 a1.channels.c1.kafka.topic = test1 # Bind the source and sink to the channel a1.sources.r1.channels = c1 |
四、启动flume开始传输数据
1 | bin/flume-ng agent --conf conf --conf-file ./conf/job/flume_to_kafka2.conf --name a1 -Dflume.root.logger=INFO,consol |
五、往文件里写数据,查看fafka中的数据,发现已经能成功过滤出正常json文件,且含有date的key值的数据了
1 | /app/kafka/bin/kafka-console-consumer.sh --bootstrap-server 192.168 . 80.128 : 9092 --from-beginning --topic test1 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)