目的:功能1:判断json文件,如何格式合格则正常传输,否则就不传输

功能2:判断出合格的json文件,并且key值中包含“date”才进行传输

一、创建一个Json的工具类

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方法即可

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的配置文件

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开始传输数据

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值的数据了

/app/kafka/bin/kafka-console-consumer.sh --bootstrap-server 192.168.80.128:9092 --from-beginning --topic test1

flume 拦截器的更多相关文章

  1. Flume 拦截器(interceptor)详解

    flume 拦截器(interceptor)1.flume拦截器介绍拦截器是简单的插件式组件,设置在source和channel之间.source接收到的事件event,在写入channel之前,拦截 ...

  2. 大数据学习——flume拦截器

    flume 拦截器(interceptor)1.flume拦截器介绍拦截器是简单的插件式组件,设置在source和channel之间.source接收到的事件event,在写入channel之前,拦截 ...

  3. Flume拦截器、监控器

    一.拦截器 1.拦截器:拦截器主要作用在source和channel之间,用于给event设置header消息头,如果没有设置拦截器,则event中只有message. 常见的拦截器有: Timest ...

  4. flume【源码分析】分析Flume的拦截器

    h2 { color: #fff; background-color: #7CCD7C; padding: 3px; margin: 10px 0px } h3 { color: #fff; back ...

  5. flume中的拦截器

    Flume中的拦截器(interceptor),用户Source读取events发送到Sink的时候,在events header中加入一些有用的信息,或者对events的内容进行过滤,完成初步的数据 ...

  6. Hadoop生态圈-Flume的组件之自定义拦截器(interceptor)

    Hadoop生态圈-Flume的组件之自定义拦截器(interceptor) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客只是举例了一个自定义拦截器的方法,测试字节传输速 ...

  7. Hadoop生态圈-Flume的组件之拦截器与选择器

      Hadoop生态圈-Flume的组件之拦截器与选择器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客只是配置的是Flume主流的Interceptors,想要了解更详细 ...

  8. Flume自定义拦截器(Interceptors)或自带拦截器时的一些经验技巧总结(图文详解)

    不多说,直接上干货! 一.自定义拦截器类型必须是:类全名$内部类名,其实就是内部类名称 如:zhouls.bigdata.MySearchAndReplaceInterceptor$Builder 二 ...

  9. 第1节 flume:15、flume案例二,通过自定义拦截器实现数据的脱敏

    1.7.flume案例二 案例需求: 在数据采集之后,通过flume的拦截器,实现不需要的数据过滤掉,并将指定的第一个字段进行加密,加密之后再往hdfs上面保存 原始数据与处理之后的数据对比 图一  ...

  10. 第1节 flume:13、14、更多flume案例一,通过拦截器实现不同类型的数据区分

    1.6.flume案例一 1. 案例场景 A.B两台日志服务机器实时生产日志主要类型为access.log.nginx.log.web.log 现在要求: 把A.B 机器中的access.log.ng ...

随机推荐

  1. anaconda新建的虚拟环境更改默认位置

    anaconda虚拟环境默认安装位置 https://blog.csdn.net/weixin_48373309/article/details/127830801 vscode中切换路径问题 在vs ...

  2. matlab算符合集

    1.逻辑算符 1)且 : A & B -- 两个逻辑数组之间 逐个元素 进行逻辑"与"操作 AB可为矩阵. 首先判断表达式A的逻辑值,然后判断B,继而进行逻辑"与 ...

  3. GIS空间分析和建模复习重点3

    22.网络分析的相关算法 (1)Dijkstra算法(求解给定点与其他所有点之间的最短路径即单源点最短路径问题) (2)Floyd算法(直接计算任意两节点之间最短路) (3)最小生成树即Prim算法. ...

  4. git 命令 使用记录

    这是ider 在pull 代码是报的异常大概意思是本机有未处理的合并可是点击view files都之前删除的一些文件 这种问题可以使用一下命令 git fetch --all && g ...

  5. 通过系统函数分配内存sbrk/sbrk

    #include <unistd.h> #include <stdio.h> int main(void) { printf("================brk ...

  6. Centos SSH 免密操作

    1. 在本机生成公钥+私钥      ssh-keygen -t rsa 2. 发送密钥到目标服务器      ssh-copy-id root@192.168.137.111 3.尝试登录目标服务器 ...

  7. 网络-7 IPv6(下)

    Ipv6实验 一.华为 思科与华为在接口启用ipv6 思科会自动产生local地址 华为不会自动产生local地址 以太网接口有mac地址,所以肯定是有eui64 serial接口是没有mac地址,他 ...

  8. Spring Web MVC注解

        @RequestMapping @RequestMapping注解的主要用途是将Web请求与请求处理类中的方法进行映射. Spring MVC和Spring WebFlux都通过RquestM ...

  9. flink 版本

    从1.10.0开始,flink版本是一个分界线,所以如果用>1.10版本的特性,一些flink引用可以从1.10官网文档中查 后面版本中没有这些说明了. flink代码文档地址:https:// ...

  10. BIP去掉弹框中的参照的新增按钮

    viewModel.get("material_class_name").on("afterInitVm", function (arg) {         ...