【数据采集工具】Flume从入门到深入学习总结

国科大学习生活(期末复习资料、课程大作业解析、大厂实习经验心得等): 文章专栏(点击跳转)
大数据开发学习文档(分布式文件系统的实现,大数据生态圈学习文档等): 文章专栏(点击跳转)

1. Flume概述

1.1 什么是Flume?

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

在这里插入图片描述

  1. 分布式:Flume可以运行在多个节点上,支持数据在节点间流动。
  2. 可扩展性:Flume可以轻松扩展以处理从几百KB到几PB的数据。
  3. 可靠性:Flume提供了数据不丢失的机制,即使在节点故障的情况下也能确保数据的完整性
  4. 有效性:Flume提供了多种数据源和数据接收器,可以有效地从各种数据源收集数据,并将其传输到不同的数据接收器。
  5. 灵活性:Flume允许用户自定义数据源和数据接收器,以适应不同的数据收集和传输需求。

1.2 Flume基础架构

在这里插入图片描述

Agent:一个JVM进程,它以事件的形式将数据从源头送至目的。Agent 主要有3个部分组成,Source、Channel、Sink。

  • Source数据源,负责从外部系统收集数据,Source组件可以处理各种类型、各种格式的日志数据,包括avro、thrift、exec、jms、spooling directory、netcat、taildir、sequence generator、syslog、http、legacy。

  • Channel位于Source 和Sink之间的缓冲区。因此,Channel允许Source和Sink运作在不同的速率上。Channel 是线程安全的,可以同时处理几个Source 的写入操作和几个 Sink 的读取操作。Flume 自带两种Channel:Memory Channel 和 File Channel。

    • Memory Channel :内存中的队列。Memory Channel在不需要关心数据丢失的情景下适用。如果需要关心数据丢失,那么Memory Channel就不应该使用,因为程序死亡、机器宕机或者重启都会导致数据丢失。
    • File Channel:将所有事件写到磁盘。因此在程序关闭或机器宕机的情况下不会丢失数据。
  • Sink数据接收器,会不断地轮询 Channel 中的事件且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者被发送到另一个Flume Agent。

Event数据传输单元,Flume以 Event 的形式将数据从源头送至目的地。 Event 由Header 和Body 两部分组成,Header用来存放该event的一些属性,为K-V结构, Body 用来存放该条数据,形式为字节数组。
在这里插入图片描述

2. Flume进阶内容

2.1 Flume事务

在 Apache Flume 中,事务是一种确保数据在不同组件之间可靠传递的机制。

在这里插入图片描述

由上图可以看出Flume Agent中Sources和Sinks分别在事务中封装了事件的存储/检索,这些事务是由Channel提供的。这确保了事件集合能够可靠地从一个点传递到另一个点。

  1. Source端Put事务流程
    doPut:将批数据先写入临时缓冲区putList
    doCommit:检查Channel内存队列是否足够合并
    doRollback:Channel内存队列空间不足,回滚数据(此处可能会丢数据)
  2. Sink端Take事务流程
    doTake:将数据取到临时缓冲区takeList,并将数据发送到外部文件系统(如HDFS)或另一个Flume Agent
    doCommit:如果数据全部发送成功,则清除临时缓冲区takeList
    doRollback:数据发送过程中如果出现异常,rollback将临时缓冲区takeList(双端队列)中的数据归还给Channel内存队列(双端队列)(此处可能会导致重复数据产生)

2.2 Flume Agent 内部原理

数据在Flume流动示意图:

在这里插入图片描述

总体流程:

  • 外部数据被Source监听获取后,会发往ChannelProcessor处理事件(Event);
  • 此时数据并不会被直接发往Channel,而是先由Interceptors拦截器链对数据做一些预处理,然后再发往ChannelSelector选出事件(Event)将要被发往哪个Channel;
  • ChannelSelector会返回事件Channel列表给ChannelProcessor,然后才根据事件Channel列表将事件发往相应的Channel
  • 数据到达Channel后并不是直接发往下游Sink的,而是由SinkProcessor处理后决定发往哪个Sink。

重要组件:

  1. ChannelSelector
    ChannelSelector 的作用就是选出Event将要被发往哪个Channel。其共有两种类型,分别是Replicating(复制)和Multiplexing(多路复用)。
    • Replicating Selector 会将同一个Event发往所有的Channel(类似与广播)
    • Multiplexing 会根据相应的原则,将不同的Event发往不同的Channel
  2. SinkProcessor
    SinkProcessor 共 有 三 种 类 型 , 分 别 是 DefaultSinkProcessor (对应的是单个的 Sink)、
    LoadBalancingSinkProcessor 和 FailoverSinkProcessor 对应的是Sink Group,LoadBalancingSinkProcessor 可以实现负载均衡的功能,FailoverSinkProcessor可以实现错误恢复的功能(通过配置Sink优先级实现)。

2.3 Flume 拓扑结构

2.3.1 简单串联
在这里插入图片描述

这种模式是将多个flume顺序连接起来了,从最初的source开始到最终sink 传送到目的存储系统。此模式不建议桥接过多的flume数量,因为flume数量过多不仅会影响传输速率,而且一旦传输过程中某个节点flume宕机,会影响整个传输系统。

2.3.2 复制和多路复用
在这里插入图片描述

Flume 支持将事件流向一个或者多个目的地。这种模式可以将相同数据**复制(广播)**到多个 channel 中(Channel Selector使用Replicating),或者将不同数据分发到不同的 channel 中(Channel Selector使用Multiplexing 并配合自定义Interceptor),Sink 可以选择传送到不同的目的地。
具体实现见下文Flume 企业开发案例

2.3.3 负载均衡和故障转移
在这里插入图片描述

Flume支持使用将多个Sink逻辑上分到一个Sink组,Sink组配合不同的SinkProcessor 可以实现负载均衡(SinkProcessor使用LoadBalancingSinkProcessor)和错误恢复(SinkProcessor使用FailoverSinkProcessor并在配置文件中设置各个Sink的优先级)的功能。

2.3.4 聚合
在这里插入图片描述

这种模式是我们最常见的,也非常实用,日常web应用通常分布在上百个服务器,大者甚至上千个、上万个服务器。产生的日志,处理起来也非常麻烦。用f

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蹒跚者_Stan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值