1、Flume组成
1.1 taildir source
断点续传、多目录
1.哪个flume版本产生的?
Apache1.7、CDH1.6
2.没有断点续传功能时怎么做的?
自定义
3.taildir挂了怎么办?
不会丢数:断点续传
4.怎么处理重复数据?
不处理:生产环境通常不处理,因为会影响传输效率
处理:自身(在taildirsource里面增加自定义事务);找兄弟(下一级处理(hive dwd sparkstreaming flink布隆)、去重手段(groupby、开创取窗口第一条、redis))
5.是否支持递归遍历文件夹读取文件?
不支持
自定义:递归遍历文件夹 + 读取文件
1.2 file/memory/kafka channel
-
file channel
数据存储于磁盘
优势:可靠性高
劣势:传输速度低
默认容量:100万event
注意:FileChannel可以通过配置dataDirs指向多个路径,每个路径对应不同的硬盘,增大Flume吞吐量
-
memory channel
数据存储于内存
优势:传输速度快
劣势:可靠性差
默认容量:100个event
-
kafka channel
数据存储于Kafka,基于磁盘
优势:可靠性高,传输速度快(kafka channel > memory channel + kafka sink:原因省去了sink阶段)
kafka channel哪个版本产生的?
Flume1.6版本产生,但是并没有火,因为有bug topic-start、topic-event数据内容,true和false都不起作用,增加了额外清洗的工作量 Flume1.7解决了这个问题,开始火了
-
生产环境如何选择?
如果下一级是kafka,优先选择kafka channel 如果是金融、对钱要求准确的公司,选择file channel 如果就是普通的日志,通常可以选择memory channel
1.3 HDFS sink
时间(1-2小时)or 大小128m、event个数(0禁止)
具体参数:
hdfs.rollInterval=3600
hdfs.rollSize=134217728
hdfs.rollCount=0
2、Flume有哪些事务机制?
-
Put事务:Source到Channel
比如spooling directory source为文件的每一行创建一个事件,一旦事务中所有的事件全部传递到Channel且提交成功,那么Source就将该文件标记为完成
-
Take事务:Channel到Sink
事务以类似的方式处理从Channel到Sink的传递过程,如果没有某种原因使得事件无法记录,那么事务将会回滚,且所有的事件都会保持到Channel中,等待重新传递
3、Flume的Source,Sink,Channel的作用?你们Source是什么类型?
-
作用
Source组件是专门用来收集数据的,可以处理各种类型、各种格式的日志数据,包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy;
Channel组件对采集到的数据进行缓存,可以存放在Memory或File中;
Sink组件是用于把数据发送到目的地的组件,目的地包括hdfs、logger、avro、thrift、ipc、file、hbase、solr、自定义。
-
我们公司采用的Source类型为:
监控后台日志:exec
监控后台产生日志的端口:netcat
4、Flume采集数据会丢失吗?(防止数据丢失的机制)
根据Flume的架构原理,Flume是不可能丢失数据的,其内部有完善的事务机制,Source到Channel是事务性的,Channel到Sink是事务性的,因此这两个环节不会出现数据的丢失,唯一可能丢失数据的情况是Channel采用memoryChannel,agent宕机导致数据丢失,或者Channel存储数据已满,导致Source不再写入,未写入的数据丢失
Flume不会丢失数据,但是有可能造成数据的重复,例如数据已经成功由Sink发出,但是没有接收到响应,Sink会再次发送数据,此时可能会导致数据的重复
5、你是如何实现Flume数据传输的监控的?
使用第三方框架Ganglia实时监控Flume
监控到flume尝试提交的次数远远大于最终成功的次数,说明flume运行比较差
解决方法?
1. 自身:增加内存flume-env.sh 4-6g
-Xmx与-Xms最好设置一致,减少内存抖动带来的性能影响
如果设置不一致容易导致频繁fullgc
2. 找朋友:增加服务器台数
搞活动618 --> 增加服务器 --> 用完再退出
日志服务器配置:8-16g内存、磁盘8T
6、Flume的有哪些Channel Selectors(选择器)?
Channel Selectors:可以让不同的项目日志通过不同的Channel到不同的Sink中去
Channel Selectors有两种类型:Replicating Channel Selector(default)和Multiplexing Channel Selector
两者的区别是:Replicating会将source过来的events发往所有channel,而Multiplexing可以选择该发往哪些channel
7、Flume的拦截器是做什么的?
拦截器是简单的插件式组件,设置在source和channel之间
source接收到的时间,在写入channel之前,拦截器都可以进行转换或者删除这些事件
每个拦截器只处理同一个source接收到的事件
1.可以自定义拦截器
-
创建一个类,实现(implements)Interceptor
-
需要自己实现4个方法
initialize():初始化
public Event intercept(Event event):处理单个Event
public List<Event> intercept(List<Event> events):处理多个Event
close()
-
静态内部类,实现Interceptor.Builder
2.拦截器可以不用么?
可以不用:需要在下一级hive的dwd层和sparkstreaming里面处理
优势:只处理一次,轻度处理
劣势:影响性能,不适合做实时推荐这种对实时要求比较高的场景
8、Flume有哪些参数调优?
8.1 Source
增加Source个数(使用Tair Dir Source时可增加FileGroups个数),可以增大Source的读取数据的能力
batchSize参数决定Source一次批量运输到Channel的event条数,适当调大这个参数可以提高Source搬运Event到Channel时的性能
8.2 Channel
type选择memeoy时channel的性能最好,但是如果Flume进程意外挂掉可能会丢失数据
type选择file时channel的容错性更好,但是性能上会比memory channel差;
使用file channel时通过配置DataDir指向多个路径,每个路径对应不同的硬盘,增大Flume吞吐量;
checkpointDir和backupCheckpointDir也尽量配置在不同硬盘对应的目录中,保证checkpoint坏掉后,可以快速使用backupCheckpointDir恢复数据
Capacity参数决定Channel可容纳最大的event条数
transactionCapacity参数决定每次Source往Channel里面写的最大event条数和每次Sink从Channel里面读的最大event条数
transactionCapacity需要大于Source和Sink的batchSize参数
8.3 Sink
增加Sink的个数可以增加Sink消费event的能力
Sink也不是越多越好,够用就行,过多的Sink会占用系统资源,造成刺痛资源不必要的浪费
batchSize参数决定Sink一次批量从Channel读取的event条数,适当调大这个参数可以提高Sink从Channel搬出event的性能
HDFS存入大量小文件,有什么影响?
元数据层面:
每个小文件都有一份元数据,其中包括文件路径、文件名、所有者、所属组、权限、创建时间等
这些信息都保存在NameNode内存中
所以小文件过多,会占用NameNode服务器大量内存,影响NameNode性能和使用寿命
计算层面:
默认情况下MR会对每个小文件启用一个Map任务计算,非常影响计算性能
同时也影响磁盘寻址时间
在数据进入到hdfs之前,用flume采集,hdfs sink相关的配置HDFS小文件处理?
hdfs.rollInterval、hdfs.rollSize、hdfs.rollCount,官方默认的这三个参数配置写入HDFS后会产生小文件
基于以上hdfs.rollInterval=3600,hdfs.rollSize=134217728,hdfs.rollCount =0几个参数综合作用,效果如下:
1、文件在达到128M时会滚动生成新文件
2、文件创建超3600s时会滚动生成新文件