上一张初识里面谢了一些flume入门的内容,其实在真正工作环境里面这种情况使用的是很少的,大部分情况,我们可能需要从多台设备的日志里面汇总收集数据并存储到HDFS上,以便于后期对数据进行处理,真实的情况可能是这样的,分别根据不同的消息来源进行不同的处理,不同的存储..

    

  上面只是一个大致情况,一般情况下,我们会将Flume里面可以做的还有很多,大批量的日志数据我们不能说都不加以处理就直接推送出去,一般的,我们会在数据源头对数据进行过滤(即对source进行属性配置),目前来说采用日志数据过滤的方式有两种,一种是Flume自带的拦截器,另外就是我们自己自定义拦截器,下面就分别采用这两种方式实现以下日志过滤相关工作;

1.采用Flume自带的过滤器进行过滤,目前小生了解到的Flume自带的拦截器分别有,详见 http://flume.apache.org/releases/content/1.9.0/FlumeUserGuide.html#flume-interceptors

Timestamp Interceptor

Host Interceptor

a1.sources = r1
a1.sinks = k1
a1.channels = c1
a1.sources.r1.interceptors = i1 i2
## 这里是给事件的Header中添加一个Host标识
a1.sources.r1.interceptors.i1.type = org.apache.flume.interceptor.HostInterceptor$Builder
a1.sources.r1.interceptors.i1.preserveExisting = false
a1.sources.r1.interceptors.i1.hostHeader = hostname
## 这里是给事件添加一个时间戳
a1.sources.r1.interceptors.i2.type = org.apache.flume.interceptor.TimestampInterceptor$Builder
a1.sinks.k1.filePrefix = FlumeData.%{CollectorHost}.%Y-%m-%d
a1.sinks.k1.channel = c1

Static Interceptor(用于给Header中添加静态值数据)

Remove Header Interceptor(用于删除匹配的Header数据)

UUID Interceptor(用于给被截取的所有事件设置一个通用的唯一标识符)

Search and Replace Interceptor(用于对数据字符串的查找替换功能)

a1.sources.avroSrc.interceptors = search-replace
a1.sources.avroSrc.interceptors.search-replace.type = search_replace # Remove leading alphanumeric characters in an event body.
a1.sources.avroSrc.interceptors.search-replace.searchPattern = ^[A-Za-z0-9_]+
a1.sources.avroSrc.interceptors.search-replace.replaceString =
此段代码用于去除字母和数字

Regex Filtering Interceptor(此拦截器通过将事件体解释为文本并根据配置的正则表达式匹配文本来选择性地筛选事件。提供的正则表达式可用于包括事件或排除事件)

Regex Extractor Interceptor(此拦截器使用指定的正则表达式提取regex匹配组,并将匹配组作为事件的标题追加。它还支持可插入的序列化程序,以便在将匹配组添加为事件头之前对其进行格式化)

   具体配置办法详见 http://flume.apache.org/releases/content/1.9.0/FlumeUserGuide.html#flume-interceptors

2.自定义拦截器

2.1. 编写自定义过滤器

2.1.1 新建一个maven项目,引入一下依赖

<properties>

  <version.flume>1.7.0</version.flume>

</properties>

-------------------------
<dependency>
<groupId>org.apache.flume</groupId>
<artifactId>flume-ng-core</artifactId>
<version>${version.flume}</version>
</dependency>
<dependency>
<groupId>org.apache.flume</groupId>
<artifactId>flume-ng-configuration</artifactId>
<version>${version.flume}</version>
</dependency>

2.1.2 新建一个MyInterceptor 继承Interceptor 类

import com.google.common.base.Charsets;
import com.google.common.collect.Lists;
import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.interceptor.Interceptor; import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern; import static org.apache.flume.interceptor.RegexFilteringInterceptor.Constants.DEFAULT_REGEX;
import static org.apache.flume.interceptor.RegexFilteringInterceptor.Constants.REGEX; /**
* Created by yangyibo on 17/1/6.
*/
public class MyInterceptor implements Interceptor {
private final Pattern regex; private MyInterceptor(Pattern regex) {
this.regex = regex;
} @Override
public void initialize() {
// NO-OP...
} @Override
public void close() {
// NO-OP...
}
// JAVA中用于处理字符串常用的有三个类:
//
// java.lang.String、
//
// java.lang.StringBuffer、
//
// java.lang.StringBuilder,
//
// 这三者的共同之处都是 final 类,不允许被继承,这主要是从性能和安全性上考虑的,因为这几个类都是经常被使用着的,且考虑到防止其中的参数被修改影响到其它的应用。
//
// StringBuffer 与 StringBuilder 两个基本上差不多,只是 StringBuffer 是线程安全,可以不需要额外的同步用于多线程中;
//
// StringBuilder 是非同步,运行于多线程中就需要使用着单独同步处理,但是速度就比 StringBuffer 快多了;二者之间的共同点都可以通过append、insert进行字符串的操作。
//
// String 实现了三个接口:Serializable、Comparable<String>、CharSequence,
//
// 而 StringBuffer 及 StringBuilder 只实现了两个接口 Serializable、CharSequence,相比之下 String 的实例可以通过 compareTo 方法进行比较,而其它两个就不可以。
@Override
public Event intercept(Event event) {
String body = new String(event.getBody(), Charsets.UTF_8); //匹配日志信息中以 Parsing events: 为开头关键字,以END 为结尾关键字 的日志信息段
String pattern= "(Parsing events)(.*)(END)";
// 创建 Pattern 对象
Pattern r= Pattern.compile(pattern);
// 现在创建 matcher 对象
Matcher m= r.matcher(body);
StringBuffer bodyoutput = new StringBuffer();
if(m.find())//此处可以用多个正则进行匹配,多条件可以用&& 或者|| 的方式约束连接。
{
//多个正则匹配后可以将多个匹配的结果append 到bodyoutput
bodyoutput=bodyoutput.append(m.group());
event.setBody(bodyoutput.toString().getBytes());
}else{
event=null;
}
return event;
} @Override
public List<Event> intercept(List<Event> events) {
List<Event> intercepted = Lists.newArrayListWithCapacity(events.size());
for (Event event : events) {
Event interceptedEvent = intercept(event);
if (interceptedEvent != null) {
intercepted.add(interceptedEvent);
}
}
return intercepted;
} public static class Builder implements Interceptor.Builder {
private Pattern regex;
//使用Builder初始化Interceptor
@Override
public Interceptor build() {
return new MyInterceptor(regex);
} @Override
public void configure(Context context) {
String regexString = context.getString(REGEX, DEFAULT_REGEX);
regex = Pattern.compile(regexString);
}
}
}

2.1.3 将此maven项目打成jar包,将jar 包放到flume的lib 目录下。

关于jar 包管理请看flume自定义组件的 jar 包管理

b. 编写flume配置文件

#filter
a1.sources.r1.interceptors=i1
a1.sources.r1.interceptors.i1.type=regex_filter
#a1.sources.r1.interceptors.i1.type= com.us.MyInterceptor$Builder
a1.sources.r1.interceptors.i1.regex=(Parsing events)(.*)(END) 此处略去sink和channel

至此,自定义拦截器已经操作完成。

以上内容仅为个人拙见,如有错误,还请指正,不胜感激

flume进阶的更多相关文章

  1. flume 进阶

    一.flume事务 put事务流程: 1.doPut:将批量数据先写入临时缓冲区putList 2.doCommit:检查Channel内存队列是否足够, (1)达到一定时间没有数据写入到putLis ...

  2. Flume 详解&实战

    Flume 1. 概述 Flume是一个高可用,高可靠,分布式的海量日志采集.聚合和传输的系统.Flume基于流式架构,灵活简单. Flume的作用 Flume最主要的作用就是,实时读取服务器本地磁盘 ...

  3. Flume(三)【进阶】

    [toc] 一.Flume 数据传输流程 重要组件: 1)Channel选择器(ChannelSelector) ​ ChannelSelector的作用就是选出Event将要被发往哪个Channel ...

  4. 基于Hadoop技术实现的离线电商分析平台(Flume、Hadoop、Hbase、SpringMVC、highcharts)

    离线数据分析平台是一种利用hadoop集群开发工具的一种方式,主要作用是帮助公司对网站的应用有一个比较好的了解.尤其是在电商.旅游.银行.证券.游戏等领域有非常广泛,因为这些领域对数据和用户的特性把握 ...

  5. Flume简介及安装

    Hadoop业务的大致开发流程以及Flume在业务中的地位: 从Hadoop的业务开发流程图中可以看出,在大数据的业务处理过程中,对于数据的采集是十分重要的一步,也是不可避免的一步,从而引出我们本文的 ...

  6. 大数据学习之Linux进阶02

    大数据学习之Linux进阶 1-> 配置IP 1)修改配置文件 vi /sysconfig/network-scripts/ifcfg-eno16777736 2)注释掉dhcp #BOOTPR ...

  7. Java进阶步骤

    一.基础篇 面向对象 什么是面向对象 面向对象.面向过程 面向对象的三大基本特征和五大基本原则 平台无关性 Java如何实现的平台无关 JVM还支持哪些语言(Kotlin.Groovy.JRuby.J ...

  8. 转:java 进阶之路

    转: https://www.zhihu.com/question/39139518 一.基础篇1.1 JVM1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收 http:// ...

  9. Java进阶专题(二十一) 消息中间件架构体系(3)-- Kafka研究

    前言 Kafka 是一款分布式消息发布和订阅系统,具有高性能.高吞吐量的特点而被广泛应用与大数据传输场景.它是由 LinkedIn 公司开发,使用 Scala 语言编写,之后成为 Apache 基金会 ...

随机推荐

  1. 用python 发 帝国cms 文章

    在e\extent下面放一个jiekou.php     #!/usr/bin/env python3 # -*- coding: utf-8 -*- import time import urlli ...

  2. 【bfs】最少转弯问题

    题目描述 给出一张地图,这张地图被分为n×m(n,m<=100)个方块,任何一个方块不是平地就是高山.平地可以通过,高山则不能.现在你处在地图的(x1,y1)这块平地,问:你至少需要拐几个弯才能 ...

  3. Zabbix通过Orabbix监控Oracle数据库

    一.背景 公司业务使用的是一直Oracle数据库,因为多次出现表空间满的时候不能及时发现,每次都是业务组的人员通知处理,这样下来DBA这边就比较被动,所以老大要求监控表空间剩余大小并且当剩余过小时能够 ...

  4. 寒冬之下,移动开发没人要了? 浅谈 iOS 开发者该 何去何从?

    前言: 作者 | 梅梅    文章来源 CSDN 对于移动互联网而言,2018 年像是球场上的一声裁判哨.哨声响起,高潮迭起的上半场结束.本该再创辉煌的下半场,还没开赛却被告之:规则改变.场地收缩.教 ...

  5. Kubernetes集群调度器原理剖析及思考

    简述 云环境或者计算仓库级别(将整个数据中心当做单个计算池)的集群管理系统通常会定义出工作负载的规范,并使用调度器将工作负载放置到集群恰当的位置.好的调度器可以让集群的工作处理更高效,同时提高资源利用 ...

  6. 剑指Offer_编程题_21

    题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. class Solution { public: void push(int value) { st.push(val ...

  7. 状态压缩动态规划 状压DP

    总述 状态压缩动态规划,就是我们俗称的状压DP,是利用计算机二进制的性质来描述状态的一种DP方式 很多棋盘问题都运用到了状压,同时,状压也很经常和BFS及DP连用,例题里会给出介绍 有了状态,DP就比 ...

  8. wiki中文语料的word2vec模型构建

    一.利用wiki中文语料进行word2vec模型构建 1)数据获取 到wiki官网下载中文语料,下载完成后会得到命名为zhwiki-latest-pages-articles.xml.bz2的文件,里 ...

  9. python的os.system函数的应用

    os的system原理 system函数可以将字符串转化成命令在服务器上运行:其原理是每一条system函数执行时,其会创建一个子进程在系统上执行命令行,子进程的执行结果无法影响主进程 上述原理会导致 ...

  10. python 实现简单卷积网络框架

    第一步定义卷积核类: class Filter(object): # 滤波器类 对卷积核进行初始化 def __init__(self,width,height,depth): # initializ ...