大数据笔记之Flume

概述

定义

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

组成架构

大数据笔记之Flume
Agent: Agent 是一个 JVM 进程,它以事件的形式将数据从源头发送至目的地,是 Flume 数据传输的基本单元。
Agent主要由三部分组成: Source、Channel、Sink

Source: Source 是负责接收数据到 Flume Agent 的组件。Source 组件可以处理各种类型、各种格式的日志数据,包括 avro、thrift、exec、jms、spooling directory、netcat等

Channel: Channel 是位于Source 和 Sink 之间的缓冲区。Channel 是线程安全的,可同时处理几个 Source 的写入操作和几个 Sink 的读取操作。
Flume自带两种Channel:Memory Channel、File Channel,第三方插件 Kafka Channel

Sink: Sink不断地轮询 Channel 中的事件且批量地移除它们,并将这些事件批量写入到存储或索引系统、或者被发送到另一个 Flume Agent。
Sink组件目的地包括:hdfs、logger、avro、thrift、HBase

Event: 传输单元,Flume 数据传输的基本单元,以事件的形式将数据从源头送至目的地。

拓扑结构

Flume Agent 连接
大数据笔记之Flume
单个source连接多个channel、sink
大数据笔记之Flume
Flume 负载均衡
大数据笔记之Flume
Flume Agent 聚合
大数据笔记之Flume

Flume 高可用

负载均衡

Flume NG 通过设置 SinkGroup 将多个沉潜节点分到一组中,然后设置该组启用负载均衡,沉潜时会自动轮转选择节点,如果节点宕机则选择其他节点。

事务机制

Flume 基于事务传输,使用两个独立的事务分别处理 source 到channel 和 channel 到 sink ,失败时会将所有数据都回滚到 source 或 channel 进行重试。

该事务机制遵循“最少一次”语义,因此数据绝不会丢失,但有可能重复。

source-channel之间的重复可以靠 TailDirSource 自带的断电续传功能解决;
channel-sink 之间的重复,可以延长等待时间。

Channel

File Channel

将 event 写入磁盘文件,与 Memory Channel 相比存储容量大,无数据丢失风险。File Channel 数据存储路径可以配置多磁盘文件路径,通过磁盘并行写入提高 FileChannel 性能。Flume 将 Event 顺序写入到 File Channel 文件末尾。可以在配置文件中通过设置 maxFileSize 参数配置数据文件大小,当被写入的文件大小达到上限时,Flume 会重新创建新的文件存储写入 Event 。当一个已经关闭的只读数据文件的 Event 被读取完成,并且 Sink 已经提交读取完成的事务,则 Flume 把存储该数据的文件删除。

Memory Channel

读写速度快,但是存储数据量小,Flume进程挂掉、服务器停机或者重启都会导致数据丢失。资源充足、不关心数据丢失的场景下可以使用。

Kafka Channel

Kafka Channel 容量大、容错能力强,但依然由丢失数据的风险。Kafka Channel 可以在日志收集层只配置 Source 组件和 Kafka 组件,不需要再配置 Sink 组件,减少了日志收集层启动的进程数,有效降低服务器内存、磁盘等资源的使用率。而日志汇聚层,可以只配置 Kafka Channel 和 Sink,不需要再配置 Source。

Flume 拦截器

Source 将 Event 写入到 Channel 之前可以使用拦截器对 Event 进行各种形式的处理,Source 和 Channel 之间可以有多个拦截器,不同拦截器使用不同的规则处理 Event,包括时间、主机、UUID、正则表达式等多种形式的拦截器。

Flume 选择器

Source 发送的 Event 通过 Channel 选择器来选择以哪种方式写入到 Channel 中,Flume 提供三种类型 Channel 选择器,分别是复制、复用和自定义选择器。

  1. 复制选择器: 一个 Source 以复制的方式将一个 Event 同时写入到多个 Channel 中,不同的 Sink 可以从不同的 Channel 中获取相同的 Event,比如一份日志数据同时写 Kafka 和 HDFS,一个 Event 同时写入两个 Channel,然后不同类型的 Sink 发送到不同的外部存储。
  2. 复用选择器: 需要和拦截器配合使用,根据 Event 的头信息中不同键值数据来判断 Event 应该写入哪个 Channel 中。

Flume 参数调优

  1. Source
    增加 Source 个数可以增大 Source 读取数据的能力。
    batchSize 参数决定 Source 一次批量运输到 Channel 的 Event 条数,适当调大这个参数可以提高 Source 搬运 Event 到 Channel 时的性能。
  2. Channel
    type 选择 memory 时 Channel 的性能最好 ,但是如果 Flume 进程意外挂掉可能会数据丢失。type 选择 file 时 Channel 的容错性比较好,但是性能比较差。
    使用 File Channel 时 dataDirs 配置多个不同盘下的目录可以提高性能
    Capacity 参数决定 Channel 可容纳最大的 Event 条数。 transactionCapacity 参数决定每次 Source 往 Channel 里面写的最大 Event 条数和每次 Sink 从 Channel 里面读取最大的 Event 条数。transactionCapacity需要大于 Source 和 Sink 的batchSize参数。
  3. Sink
    增加 Sink 数量也可以增加 Sink 消费 Event 的能力。Sink 也不是越多越好,过多的 Sink 会占用系统资源,造成系统资源不必要的浪费。
    batchSize 参数决定 Sink 一次批量从 Channel 读取的 Event 条数,适当调大该参数可以提高 Sink 从 Channel 搬出 Event 的性能。