Flume正则拦截器(regex_filter) 以及自定义拦截器(转载)

前面已经给大家说过flume的简介以及安装,还有不明白的可以再去看看:
Flume简介以及详细安装教程

在当今大数据时代,在处理海量数据之前,收集数据,聚合和转换数据是绝对必要的,并最终将数据移动到那些使用不同分析和数据挖掘工具的存储库中。
执行所有这些步骤的流行工具之一是Apache Flume。 这些数据通常是以事件或日志的形式存储。 Apache Flume有三个主要组件:

Source:数据源可以是企业服务器,文件系统,云端,数据存储库等。
Channel:在事件被sink消耗前由Channel 存储。 Channel 是被动存储。 Channel 支持故障恢复和高可靠性; Channel 示例是由本地文件系统和基于内存的Channel 支持的文件通道。
Sink:Sink是可以存储数据的目标存储库。 它可以是一个集中的地方,如HDFS,像Apache Spark这样的处理引擎,或像ElasticSearch这样的数据存储库/搜索引擎。

Flume是高度可配置的,并且支持许多源,channel,serializer和sink。它还支持数据流。 Flume的强大功能是拦截器,支持在运行中修改/删除事件的功能。支持的拦截器之一是regex_filter。

regex_filter将事件体解释为文本,并将其与提供的正则表达式进行对比,并基于匹配的模式和表达式,包括或排除事件。我们将详细看看regex_filter。

案例:监听文件ss.txt,过滤掉以userid为开头的字段。
要监听的文件放在opt/sofft/datas目录下
ss.txt的文件内容如下:

userid username
hello hadoop
hello hive
hadoop hive
hello world
userid hello
hello cm
hello hadoop
hello hive

编写flume配置文件:
vi /opt/flumeconf/conf_0810_interceptor.properties

a3.channels=c3
a3.sources=s3
a3.sinks=k3

#定义具体的source类型
a3.sources.s3.type=spooldir
#定义监听的文件目录
a3.sources.s3.spoolDir=/opt/soft/datas
a3.sources.s3.interceptors=userid_filter

#定义正则拦截器filter
a3.sources.s3.interceptors.userid_filter.type=regex_filter
#定义正则,要拦截的字段
a3.sources.s3.interceptors.userid_filter.regex=userid.*
#满足正则就过滤掉当定义是true时,默认是false
a3.sources.s3.interceptors.userid_filter.excludeEvents=true

a3.sources.s3.deletePolicy=immediate
a3.sources.s3.pollDelay=500

a3.channels.c3.type=memory
a3.sinks.k3.type= logger

a3.sources.s3.channels=c3
a3.sinks.k3.channel = c3

注意:
pooldir默认是将处理完的新文件重命名,原文件名会自动添加后缀名.COMPLETE,但是遇到同名文件之后,处理完同名文件,在重命名时,发现已经有相同文件名的文件存在,此时flume会报错,然后停止监控线程(此线程默认500毫秒扫描一次目录,检查是否有新文件),目录中再有新的文件,也不会被处理。
处理方法为:
设置spooldir文件删除策略为:a3.sources.s1.deletePolicy=immediate

启动flume

flume-ng agent -n a3 -c conf -f /opt/flumeconf/conf_0810_interceptor.properties -Dflume.root.logger=INFO,console
这时被监听的文件内如果有userid为开头的字段就会被过滤掉!
如下图所示:

当文件读取完毕时,原文件名会自动添加后缀名.COMPLETE
如下图所示:

自定义拦截器
单个事件拦截
案例:
文件中出现“男”,就用1代替,文件中出现“女”,就用2代替,剩余的就用0代替
文件原始内容:
001,张三,男,24
002,李四,女,18
003,王五,women,34
… 类似这样的格式
处理之后的内容:
001,张三,1,24
002,李四,1,18
003,王五,0,34

自定义拦截器代码:

先导入依赖

org.apache.flume flume-ng-core 1.6.0 1 2 3 4 自定义拦截器代码: 创建CustomInterceptor类implements Interceptor 重写方法:

import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.interceptor.Interceptor;

import java.util.List;

public class CustomInterceptor implements Interceptor {
@Override
public void initialize() {

}
//单个事件拦截
@Override
public Event intercept(Event event) {
byte[] body = event.getBody();
String line = new String(body); //001,张三,男,24
String[] sps = line.split(",");
switch (sps[2]){
case “男” :
sps[2] = “1”;
break;
case “女”:
sps[2] = “2”;
break;
default:
sps[2] = “0”;
break;
}
String newstr = sps[0]+","+sps[1]+","+sps[2]+","+sps[3];
event.setBody(newstr.getBytes());
//自定义头信息
return event;
}
//批量事件拦截
@Override
public List intercept(List list) {
for (Event event : list) {
intercept(event);
}
return list;
}
@Override
public void close() {

}

//创建类Builder实现Interceptor.Builder
public static class Builder implements Interceptor.Builder{

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

}

编写flume配置文件:
vi /opt/flumeconf/conf_0810_custconf.properties

a4.channels=c4
a4.sources=s4
a4.sinks=k4

a4.sources.s4.type=spooldir
a4.sources.s4.spoolDir=/opt/soft/datas
a4.sources.s4.interceptors=myintec
#绑定自定义拦截器的类名
a4.sources.s4.interceptors.myintec.type=com.demo.interceports.filter.CustomInterceptor$Builder

a4.channels.c4.type=memory
a4.sinks.k4.type=logger

a4.sinks.k4.channel=c4
a4.sources.s4.channels=c4

启动flume

flume-ng agent -n a4 -c conf -f /opt/flumeconf/conf_0810_custconf.properties -Dflume.root.logger=INFO,console

原文链接:https://blog.csdn.net/zp17834994071/article/details/107921096?utm_medium=distribute.pc_feed.none-task-blog-cf-4.nonecase&depth_1-utm_source=distribute.pc_feed.none-task-blog-cf-4.nonecase&request_id=5f345ea9b51ffe58eedc0ccb

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值