个人总结 Flume基础知识

声明: 1. 本文为我的个人复习总结, 并非那种从零基础开始普及知识内容详细全面, 言辞官方的文章
【个人总结Flume基础知识】2. 由于是个人总结, 所以用最精简的话语来写文章
3. 若有错误不当之处, 请指出
概述:
Flume用于离线日志的 采集与传输
Agent:
Event:
三大组件:
put(push推)给
Sink从中take(pull拉)
是位于和Sink之间的缓冲区, 因此和Sink可以速率不一致 但也别相差太多
内存级别的, 速度快, 但可靠性低 磁盘级别的, 速度慢, 但可靠性高
补救: 可以配置多目录, 不同目录挂载到不同磁盘, 减轻磁盘IO压力 可靠性高, 而且可以省去Flume的Sink发送数据到Kafka的这一步
Sink
多种:事务:
put事务 & take事务 都是借助临时缓冲区实现的
put事务:
doPut: 将数据写到临时缓冲区检查容量是否充足
take事务:
: 将数据取到(移动)临时缓冲区, 并将数据发到HDFS目的地如果数据全部成功发往目的地, 则, 清空如果数据没有全部成功发往目的地, 则, 把里的数据全部归还给; 此时再发送, 就造成了HDFS端的数据重复; 或者是Sink到HDFS时, 得不到应答, 然后Sink重复发数据也会导致重复 :
选出 Event 将要被发往哪个
(复制) 会将同一个 Event 发往所有的  , 
(多路复用) 会根据相应的原则,将不同的Event发往不同的
:
对应单个Sink
对应, 可以实现负载均衡
r 对应, 可以主备切换, 故障转移
拓扑结构:
简单串联
不建议桥接过多的 Flume 数量, 否则
影响传输速率
一旦某个节点宕机 , 会影响整个传输系统
复制 或 多路复用
将同一Event发到多个目的地, A目的地需要这个Event, B目的地也需要这个Event
负载均衡 或 故障转移
将不同的Event发到多个目的地, 某个Event发给A目的地了, 就不能重复再发给B目的地
聚合(最实用)
自定义拦截器:
ETL拦截器, 过滤掉非法的日志数据(比如非json格式)

个人总结  Flume基础知识

文章插图
时间戳拦截器, 提取日志的事件时间放到中
这是因为Flume的里默认放的是处理时间, 会根据这个key的值识别为时间, 写入到HDFS的不同日志文件中
零点漂移问题:
使用处理时间时, 00:00:01秒Flume收到了一条日志, 实际上这条日志是23:59:59秒产生的, 跨天了 。因为里时间戳跨天, 导致前一天日志落在了后一天的日志文件上
解决办法:
使用事件时间代替处理时间, 避免网络传输花费的时间损耗 造成了跨天误判对每天前3分钟的数据进行重新检查其事件时间, 如果发现其为前一天的日志, 则把它移动到前一天的日志文件中 面试题:
你是如何对Flume 数据传输进行监控的
使用第三方软件实时监控Flume
参数调优
Sink
事务机制
put事务 & take事务 都是借助临时缓冲区实现的
put事务:
doPut: 将数据写到临时缓冲区检查容量是否充足
take事务:
: 将数据取到(移动)临时缓冲区, 并将数据发到HDFS目的地如果数据全部成功发往目的地, 则, 清空如果数据没有全部成功发往目的地, 则, 把里的数据全部归还给; 此时再发送, 就造成了HDFS端的数据重复; 或者是Sink到HDFS时, 得不到应答, 然后Sink重复发数据也会导致重复
Flume采集数据会丢失数据吗?
用可能因为Agent宕机而丢失数据, 也会可能因take事务而导致数据重复
用时, 因为其事务机制一般不会丢数据, 但可能因take事务而导致数据重复
严格来说也会又可能丢数据, 万一take事务回滚时想把里的数据全部归还给, 万一这时宕机了里的数据丢了, 那就丢数据了