1.Flume 组件介绍

 

名称

解析

Event

一个数据单元,带有一个可选的消息头,其实就是一条消息, 一个日志;(Kafka 的消息没有消息头,因此,Flume 的消息进入 Kafka 后,消息头就丢失了)

Flow

数据流,Event 从源点到达目的点的迁移的抽象

Client

操作位于源点处的 Event,将其发送到 Flume Agent

Agent

一个独立的 Flume 进程,包含组件 Source、Channel、Sink

Source

用来获取 Event 并写入 Channel

Channel

中转 Event 的一个临时存储,保存有 Source 组件传递过来的 Event,可以认为是一个队列

Sink

从 Channel 中读取并移除 Event,将 Event 传递到 Flow Pipeline中的下一个 Agent 或者其他存储系统

 

 

2.Flume 组件选择

(1) 单层 Flume 

    Source:TailDirSource

    Channel:FileChannel

    Sink:KafkaSink

 

(2) 多层 Flume 

第一层 agent:

    Source:TailDirSource 

    Channel:FileChannel 

    Sink:AvroSink

    注意,TailDirSource 是 Flume 1.7 提供的 Source 组件,在 1.6 中并没有,因此,需要从 1.7 中移植到 1.6 中。

第二层 agent: 

    Source:AvroSource

    Channel:FileChannel 

    Sink:KafkaSink

 

 

3.Flume 采集系统组件解析

(1)  Source

① Avro Source

    侦听 Avro 端口并从外部 Avro 客户端流接收事件。当与另一个(上一跳)Flume 代理的内置 Avro Sink 配对时,它可以创建分层收集拓扑。

② Taildir Source

    在 Flume1.7 之前如果想要监控一个文件新增的内容,我们一般采用的 source 为 exec tail ,但是这会有一个弊端,就是当你的服务器宕机重启后,此时数据读取还是从头开始,这 显然不是我们想看到的! 在 Flume1.7 没有出来之前我们一般的解决思路为:当读取一条 记录后,就把当前的记录的行号记录到一个文件中,宕机重启时,我们可以先从文件中获取 到最后一次读取文件的行数,然后继续监控读取下去。保证数据不丢失、不重复。

    在Flume1.7时新增了一个source 的类型为taildir,它可以监控一个目录下的多个文件, 并且实现了实时读取记录保存的断点续传功能。

    但是 Flume1.7 中如果文件重命名,那么会被当成新文件而被重新采集。

 

(2) Channel

① Memory Channel

    Memory Channel 把 Event 保存在内存队列中,该队列能保存的 Event 数量有最大值上限。 由于 Event 数据都保存在内存中,Memory Channel 有最好的性能,不过也有数据可能会丢 失的风险,如果 Flume 崩溃或者重启,那么保存在 Channel 中的 Event 都会丢失。同时由于 内存容量有限,当 Event 数量达到最大值或者内存达到容量上限,Memory Channel 会有数 据丢失。

② File Channel

File Channel 把 Event 保存在本地硬盘中,比 Memory Channel 提供更好的可靠性和可恢

复性,不过要操作本地文件,性能要差一些。

③ Kafka Channel

    Kafka Channel 把 Event 保存在 Kafka 集群中,能提供比 File Channel 更好的性能和比Memory Channel 更高的可靠性。

 

(3) Sink

① Avro Sink

    Avro Sink 是 Flume 的分层收集机制的重要组成部分。 发送到此接收器的 Flume 事件变 为 Avro 事件,并发送到配置指定的主机名/端口对。事件将从配置的通道中按照批量配置的 批量大小取出。

②  Kafka Sink

    Kafka Sink 将会使用 FlumeEvent header 中的 topic 和 key 属性来将 event 发送给 Kafka。 如果 FlumeEvent 的 header 中有 topic 属性,那么此 event 将会发送到 header 的 topic 属性指 定的 topic 中。如果 FlumeEvent 的 header 中有 key 属性,此属性将会被用来对此 event 中的 数据指定分区,具有相同 key 的 event 将会被划分到相同的分区中,如果 key 属性 null,那 么 event 将会被发送到随机的分区中。

    可以通过自定义拦截器来设置某个 event 的 header 中的 key 或者 topic 属性。

Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐