1.为什么要有Flume?
客户端服务器,与集群服务器是分开的,而日志文件业务数据都是在客户端服务器产生的,所以需要在客户端服务器安装一个工具,将数据发送到集群服务器或者其他地方,这个工具就是Flume。
2.Flume架构
source :专门用于收集数据的,可以处理各种类型、格式的数据。
channel:负责聚合数据,对采集到的数据进行缓存的,这是防止数据采集和发送速度不均衡完成拥堵。
sink:专门用于发送数据的,可以发送到不同的目的地,去hdfs,kafka,hbase。
event:Flume数据传输的基本单元,对数据进行序列化,包含header(头信息),body(数据本身)
拦截器:可以在拦截器内实时处理数据,对于数据非常有用
由于source收集和sink发送速度不均衡,容易造成拥堵,所以需要一个中转站暂时存放数据,就是channel
File Channel:数据存储于磁盘,安全可靠。
Memory Channel:数据存储于内存,速度快。
Kafka Channel:数据存储于 Kafka,传输速度最快,省去sink阶段,如果果下一级是 Kafka,优先选择。
数据可能有各种来源,收集的方式不同,这是source 的主要工作,可以设置不同的收集方式:
采集某个文件的数据
指定接收某个端口的数据
采集文件的增加数据
数据可能要发送给不同的对象,发送的方式不同,这是sink的主要工作,可以设置不同的发送方式:
打印到控制台
指定服务器:端口进行发送
发送到hdfs集群
发送到kafka
3.Flume 有哪些组件,Flume 的 source、channel、sink 具体是做什么的?
(1).source:用于采集数据,Source 是产生数据流的地方,同时 Source 会将产生的数据流传输到 Channel,这个有点类似于 Java IO 部分的 Channel。
(2).channel:用于桥接 Sources 和 Sinks,类似于一个队列。
(3).sink:从 Channel 收集数据,将数据写到目标源(可以是下一个 Source,也可以是 HDFS或者 HBase)。
4.如何实现Flume数据传输的实时监控
使用第三方框架Ganglia实时监控Flume。
1)采用Ganglia监控器,监控到Flume尝试提交的次数远远大于最终成功的次数,说明Flume运行比较差。主要是内存不够导致的。
2)解决办法?
(1)自身:Flume默认内存2000m。考虑增加Flume内存,在flume-env.sh配置文件中修改Flume内存为4-6g
-Xmx与-Xms最好设置一致,减少内存抖动带来的性能影响,如果设置不一致容易导致频繁fullgc。
(2)找朋友:增加服务器台数
搞活动 618 —> 增加服务器 —> 用完在退出
日志服务器配置:8-16g内存、磁盘8T
5.Channel selectors是什么
events或者说数据要可以通过不同的channel 发送到不同的sink中去,那么events要发送到哪个channel 就是由于channel selectors决定的。
channel selectors包括了
Replicating channel selectors 复制选择器
Multiplexing channel selectors 多路选择器
默认的是复制选择器,即每个channel的数据都是一样的,多路选择权就需要按照制定的规则去判断了。
6.Flume参数调优思路
首先就是启动多个Flume
source :如果采集速度比较慢,可以考虑
启动多个source 进行采集;
调整batchSize,决定了source 一次批量运输events到channel 的条数,适当调大可以提高source 搬运events到channel 的性能
channel:
缓存方式(type)选择内存(memory)时,channel性能最好,但是会有丢失数据的风险;选择磁盘(file)时,可靠性更好,但是性能差一点,可以选择多个不同盘下的目录来提高性能;
参数Capacity决定了channel 可容纳最大的events条数;参数transactionCapacity决定了每次source往channel写/sink从channel读的最大enents条数。注意:transactionCapacity要大于source和sink的batchsize
sink:增加sink的个数;参数batchsize决定了sink一次批量从channel 读取的events条数
7.Flume的事务机制
Flume使用两个独立事务put和take,分别负责从source 到channel 、channel 到sink,记录事件状态,保证两个过程的数据不会丢失
8.Flume的数据会丢失吗?
根据Flume的事务机制,Flume的数据一般不会丢失,除非使用的时候memory channel ,在机器宕机的时候会导致数据丢失,或者channel 满了,sources无法写入导致数据丢失
此外,也有可能完成数据重复,比如sink接收到一批数据,处理到一半宕机了,处理完的数据没有给channel 发送响应,导致channel 重新发送数据,造成数据重复。
9.零点漂移问题,在Flume中如何解决?
零点漂移问题:举个例子,我有一些日志文件,需要通过Flume按照日期存放到hdfs中,那么就需要用到日期了,而HdfsSink是默认继续event的heard生成的时间戳进行分区存放的,这个时间是生成event的时间,而不是数据的生成时间,所以存在一个时间差。如果刚好这个时间跨过了一天,那么就会导致日期增加了一天,这个就是零点漂移。
解决:在source组件内增加拦截器,从event的body中拿出数据生成时间,替换掉header的时间
10.Flume组成,Put事物,Task事务?
答:Flume组成,Put事物,Task事务
a. Taildir Source:断点续传、多目录
b. File Channel:数据存储在磁盘中,宕机数据可以保存。传输速率慢,适合对数据传输可靠性要求高的场景,例如:金融行业
c. Memory Channel:数据存储在内存中,宕机数据容易丢失。传输效率快,适合对数据传输可靠性要求不高的场景,例如:日志数据
d. Kafka Channel:减少Flume的Sink阶段,提高了传输效率
Source到Channel是Put事务
Channel到Sink是Task事务
11.Flume Event?
Event是数据流的基本单元,由一个装载数据的字节数组(byte payload)和一系列可选的字符串属性来组成(可选头部)。
12.Flume的事务机制
答:Flume的事务机制(类似数据库的事务机制):Flume使用两个独立的事务分别负责从Soucrce到Channel,以及从Channel到Sink的事件传递。比如spooling directory source 为文件的每一行创建一个事件,一旦事务中所有的事件全部传递到Channel且提交成功,那么Soucrce就将该文件标记为完成。同理,事务以类似的方式处理从Channel到Sink的传递过程,如果因为某种原因使得事件无法记录,那么事务将会回滚。且所有的事件都会保持到Channel中,等待重新传递。
13.Flume 和 Kafka 采集日志区别,采集日志时中间停了,怎么记录之前的日志?
答:(1)Flume 采集日志是通过流的方式直接将日志收集到存储层,而 kafka 是将缓存在 kafka集群,待后期可以采集到存储层。
(2)Flume 采集中间停了,可以采用文件的方式记录之前的日志,而 kafka 是采用 offset 的方式记录之前的日志。
14.数据怎么采集到 Kafka,实现方式?
答:使用官方提供的 flumeKafka 插件,插件的实现方式是自定义了 flume 的 sink,将数据从channle 中取出,通过 kafka 的producer 写入到 kafka 中,可以自定义分区等。
15.Flume拦截器
1)拦截器注意事项
(1)ETL拦截器:主要是用来判断json是否完整。没有做复杂的清洗操作主要是防止过多的降低传输速率。
(2)时间戳拦截器:主要是解决零点漂移问题
2)自定义拦截器步骤
(1)实现 Interceptor
(2)重写四个方法
- initialize 初始化
- public Event intercept(Event event) 处理单个Event
- public List<Event> intercept(List<Event> events) 处理多个Event,在这个方法中调用Event intercept(Event event)
- close方法
(3)静态内部类,实现Interceptor.Builder
3)拦截器可以不用吗?
ETL拦截器可以不用;需要在下一级Hive的dwd层和SparkSteaming里面处理
时间戳拦截器建议使用。 如果不用需要采用延迟15-20分钟处理数据的方式,比较麻烦。
标签:FLume,Flume,面试题,source,Channel,相关,数据,channel,sink From: https://www.cnblogs.com/yeyuzhuanjia/p/18586955