Flume 定义

Flume是一个高可用、高可靠的,分布式海量日志采集聚合传输的系统。基于流式框架,灵活简单。

Agent

Agent 是一个JVM 进程,以事件的形式将数据从源头送至目的地,是Flume传输的基本单位

Source

负责接收数据到flume agent的组件

Channel

Channel 是位于Source和Sink 之间的缓存区。运行Source和Sink运行在不同的速率上; Channel是线程安全的,同时处理多个Source的写入操作和几个Sink的读取操作
Flume 自带两种Channel:Memory Channel和Source Channel

Sink

不断地轮询Channel中的数据并批量的移除他们,并将这些事件批量写入到存储或索引系统,或者发送到另一个Flume Agent
Sink是完全事务性的.Channel 批量删除数据之前,每个Sink用Channel启动一个事务,批量事件一旦写入存储系统或者送入下一个Agent,Sink就利用Channel提交事务,事务一旦被提交,该Channel从自己的内部缓冲区删除事件

Event

传输单元,以事件的形式将数据从源头送往目的地

重点一.Flume 组成架构

image.png
Flume三个主要组件:SourceChannelSink
一个flume被称为一个Agent

image.png

面试注意的点:

  • 注意flume处理的都是Batch data
  • 注意两种Channel:Memory Channel和File Channel
  • Put/Take Transaction 各个方法的名字及作用
  • 注意两个Rollback做的事情

Flume 拓扑结构

多个Agent可以串联及并联 中间通过AVRO串行化数据方式传输

还可以通过并联实现负载均衡
image.png
这里Agent1 一般内存比较大,2/3/4设置较小的内存

日志收集的拓扑结构
image.png
Agent 1/2/3收集来自不同Web Server的数据,不需要很大内存; 在Agent4这里聚合后 Sink到HDFS,需要较大内存.

重点二.Agent内部原理

大致过程:
Source => Channel 处理器 => 拦截器 => Channel选择器 => 根据选择器返回结果,分发到Channel=> Sink 处理器 => Sink

image.png

具体过程:

  1. Source接收事件,交给其Channel处理器处理事件
  2. 处理器通过拦截器Interceptor,对事件一些处理,比如压缩解码,正则拦截,时间戳拦截,分类等等,比较常用的是通过拦截器对日志分类
  3. 经过拦截器处理过的事件再传给Channel选择器,将事件写入相应的Channel.
    Channel Selector有两种: 1) Replicating Channel Selector(默认),会将source过来的Event发往所有Channel(比较常用的场景是,用多个Channel实现冗余副本,保证可用性); 2)Multiplexing Channel Selector,根据配置分发event;
  4. 最后由Sink处理器处理各个Channel的事件

这里需要注意的面试题

  • 用没用过拦截器,你用它做了什么事情?
    在项目里我是自定义了一个拦截器,根据日志存在哪些字段,对日志分类,把类别加入event.header,在配置中根据eventType 分发到不同的channel。
  • Channel Selector有哪些,他们的作用是什么?

Flume 面试题

Source、Channel、Sink的作用?你的项目里Source的类型?
Channel Selector的有哪些?
Flume 参数调优
  1. Source
    增大Source个数,可增加Source 读取数据的能力。比如某个目录产生文件过多,可将这个目录拆分成多个目录,使用多个Source去读取。
    适当调大batchsize,batchsize参数决定一次批量运输到Channel的Event数量,适当调大可以提高运输性能

2.Channel
1).使用 file channel时,dataDirs参数配置不同盘下的目录可以提高性能。
2).Capacity参数决定Channel可容纳的最大Event条数,transactionCapacity 参数决定Source往Channel里写的最大event条数,和Sink从Channel里读的最大event条数,transactionCapacity要大于Capacity

3.Sink
增大Sink个数可以增加Sink消费Event的能力,但也不是越多越好,Sink过多会占用系统资源。
类似于Source 适当调大batch size

flume事务机制

类似数据库的事务机制,不用说太复杂,能把上面架构里 put 和 take及回滚 说清楚就行。可以举例说明,比如spooling directory source为文件的每一行创建一个事件,一旦事务中的所有事件全部传送到channel且提交成功,那么Source就将该文件标记为完成,否则回滚操作,event回到PutList中。同理,channel到sink也是一样,如果某个event无法记录,事务会回滚,所有事件保持到channel,等待重新传递。

为什么设计 Flume=>Kafka=>HDFS的架构

为了削峰


猛男落泪为offer
22 声望5 粉丝

半路出家大数据


引用和评论

0 条评论