flume概述
Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。
使用Taildir Source采集文件夹数据到hdfs
- Taildir Source 是Apache flume1.7新推出的,但是CDH Flume1.6做了集成
- Taildir Source是高可靠(reliable)的source,他会实时的将文件偏移量写到json文件中并保存到磁盘。下次重启Flume时会读取Json文件获取文件O偏移量,然后从之前的位置读取数据,保证数据零丢失
- Taildir Source可同时监控多个文件夹以及文件。即使文件在实时写入数据。
- Taildir Source也是无法采集递归文件下的数据,这需要改造源码
- Taildir Source监控一个文件夹下的所有文件一定要用.*正则
1、Flume 采集数据会丢失吗?
不会,Channel 存储可以存储在 File 中,数据传输自身有事务。
2、flume 有哪些组件,flume 的 source、channel、sink 具体是做什么的?
1)source:用于采集数据,Source 是产生数据流的地方,同时 Source 会将产生的数据
流传输到 Channel,这个有点类似于 Java IO 部分的 Channel。
2)channel:用于桥接 Sources 和 Sinks,类似于一个队列。
3)sink:从 Channel 收集数据,将数据写到目标源(可以是下一个 Source,也可以是 HDFS
或者 HBase)。
3、你是如何实现Flume数据传输的监控的
使用第三方框架Ganglia实时监控Flume。
4、flume 调优 :
source :
1 ,增加 source 个数,可以增大 source 读取能力。
2 ,具体做法 : 如果一个目录下生成的文件过多,可以将它拆分成多个目录。每个目录都配置一个 source 。
3 ,增大 batchSize : 可以增大一次性批处理的 event 条数,适当调大这个参数,可以调高 source 搬运数据到 channel 的性能。
channel :
1 ,memory :性能好,但是,如果发生意外,可能丢失数据。
2 ,使用 file channel 时,dataDirs 配置多个不同盘下的目录可以提高性能。
3 ,transactionCapacity 需要大于 source 和 sink 的 batchSize 参数
sink :
增加 sink 个数可以增加消费 event 能力
5 、事务机制 :
channel : 是位于 source 和 sink 之间的缓冲区。
1 ,flume 自带两种缓冲区,file channel 和 memory channel
2 ,file channel : 硬盘缓冲区,性能低,但是安全。系统宕机也不会丢失数据。
3 ,memory channel :内存缓冲区,性能高,但是有可能丢数据,在不关心数据有可能丢失的情况下使用。
put 事务流程 : 源将数据给管道
1 ,doPut :把数据写入临时缓冲区 putList 。
2 ,doCommit :检查 channel 内存队列是否足够合并。
3 ,doRollBack : 如果 channel 不行,我们就回滚数据。
take 事务流程 :
1 ,先将数据取到临时缓冲区 takeList。
2 ,doCommit :如果数据全部发送成功,就清除临时缓冲区。
3 ,doRollBack :如果数据发送过程中出现异常,doRollBack 将临时缓冲区的数据还给 channel 队列
6、Flume拦截器
Flume拦截器之Event
- event是flume中处理消息的基本单元,由零个或者多个header和正文body组成。
- Header 是 key/value
形式的,可以用来制造路由决策或携带其他结构化信息(如事件的时间戳或事件来源的服务器主机名)。通过key-value的形式展示在表头 - Body是一个字节数组,包含了实际的内容。
- flume提供的不同source会给event添加不同的header信息。
内置拦截器(直接通过 .conf文件编写使用)
List item
Timestamp
Interceptor拦截器就是可以往event的header中插入关键词为timestamp的时间戳。
host拦截器
该拦截器可以往event的header中插入关键词默认为host的主机名或者ip地址(注意是agent运行的机器的主机名或者ip地址)
Regex Filtering Interceptor拦截器 (重要)
Regex Filtering Interceptor拦截器用于过滤事件,筛选出与配置的正则表达式相匹配的事件。可以用于包含事件和排除事件。常用于数据清洗,通过正则表达式把数据过滤出来。
自定义拦截器
使用场景:
在实际的开发中,一台服务器产生的日志类型可能有很多种,不同类型的日志可能需要发送到不同的分析系统。此时会用到 Flume 拓扑结构中的 Multiplexing(多路复用) 结构,Multiplexing的原理是,根据 event 中 Header 的某个 key 的值,将不同的 event 发送到不同的 Channel中,所以我们需要自定义一个 Interceptor,为不同类型的 event 的 Header 中的 key 赋予不同的值。
步骤:
1.创建一个项目,并且引入flume对应的依赖依赖
2.自定义拦截器,实现拦截器接口Interceptor
3,打成jar包,上传flume的job目录
4,编写.conf文件,在sources组件中通过拦截器类的全限名路径使用自定义拦截器
5,测试
7、Flume的工作机制是什么?
核心概念是agent,里面包括source,channel和sink三个组件。
Source运行在日志收集节点进行日志采集,之后临时存储在channel中,sink负责将channel中的数据发送到目的地。
只有发送成功channel中的数据才会被删除。
首先书写flume配置文件,定义agent、source、channel和sink然后将其组装,执行flume-ng命令。
8、flume的使用场景
基本数据过滤;多路日志合并;日志多路输出;端口监听;
9、flume中的通道选择器
1.复制Channel选择器 (replicating )
特点:数据同步给多个Channel
参考:企业开发案例 - 单数据源多出口案例(选择器)
2.多路复用Channel选择器 (multiplexing)
特点:数据分流到指定Channel
参考:自定义拦截器
本文来自博客园,作者:大码王,转载请注明原文链接:https://www.cnblogs.com/huanghanyu/