1.4 Flume
1.4.1 Flume组成,Put事务,Take事务
1)Taildir Source
(1)断点续传、多目录
(2)taildir底层原理
(3)Taildir挂了怎么办?
不会丢数:断点续传
重复数据:有可能
(4)存在的问题及解决方案
①问题:
新文件判断条件 = iNode值 + 绝对路径(包含文件名)
日志框架凌晨修改了文件名称=》导致会再次重读一次昨天产生的数据
②解决:
方案一:建议生成的文件名称为带日期的。同时配置日志生成框架为不更名的;
方案二:修改TairDirSource源码,只按照iNode值去确定文件
修改源码视频地址:
https://www.bilibili.com/video/BV1wf4y1G7EQ?p=14&vd_source=891aa1a363111d4914eb12ace2e039af
2)file channel /memory channel/kafka channel
(1)File Channel
数据存储于磁盘,优势:可靠性高;劣势:传输速度低
默认容量:100万个event
注意:FileChannel可以通过配置dataDirs指向多个路径,每个路径对应不同的硬盘,增大Flume吞吐量。
(2)Memory Channel
数据存储于内存,优势:传输速度快;劣势:可靠性差
默认容量:100个event
(3)Kafka Channel
数据存储于Kafka,基于磁盘;
优势:可靠性高;
传输速度快 Kafka Channel 大于Memory Channel + Kafka Sink 原因省去了Sink阶段
(4)生产环境如何选择
-
-
-
- 如果下一级是Kafka,优先选择Kafka Channel。
- 如果是金融、对钱要求准确的公司,选择File Channel。
- 如果就是普通的日志,通常可以选择Memory Channel。
-
-
每天丢几百万数据 pb级 亿万富翁,掉1块钱会捡?
3)HDFS Sink
(1)时间(半个小时) or 大小128m 且 设置Event个数等于0,该值默认10
具体参数:hdfs.rollInterval=1800,hdfs.rollSize=134217728 且 hdfs.rollCount=0
4)事务
-
- Source到Channel是Put事务
- Channel到Sink是Take事务
1.4.2 Flume拦截器
1)拦截器注意事项
(1)时间戳拦截器:主要是解决零点漂移问题
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)拦截器可以不用吗?
时间戳拦截器建议使用。如果不用需要采用延迟15-20分钟处理数据的方式,比较麻烦。
1.4.3 Flume Channel选择器
Replicating:默认选择器。功能:将数据发往下一级所有通道。
Multiplexing:选择性发往指定通道。
1.4.4 Flume监控器
1)采用Ganglia监控器,监控到Flume尝试提交的次数远远大于最终成功的次数,说明Flume运行比较差。主要是内存不够导致的。
2)解决办法?
(1)自身:默认内存是20m,考虑增加flume内存,在flume-env.sh配置文件中修改flume内存为 4-6g
(2)找朋友:增加服务器台数
搞活动 618 =》增加服务器 =》用完在退出
日志服务器配置:8-16g内存、磁盘8T
1.4.5 Flume采集数据会丢失吗?
- 如果是kafka channel 或者FileChannel不会丢失数据,数据存储可以存储在磁盘中。
- 如果是MemoryChannel有可能丢。
1.4.6 Flume如何提高吞吐量
- 调整taildir source的batchSize大小可以控制吞吐量,默认大小100个Event。
- 吞吐量的瓶颈一般是网络带宽。