Flume 日志文件/实时数据流采集框架 概念及原理介绍

技术背景

由cloudera软件公司产出的可分布式日志收集系统,
后与2009年被捐赠了apache软件基金会,为hadoop相关组件之一。
尤其近几年随着flume的不断被完善以及升级版本的逐一推出,特别是flume-ng;
同时flume内部的各种组件不断丰富,用户在开发的过程中使用的便利性得到很大的改善,现已成为apache top项目之一.

设计目的

向hadoop集群批量导入基于事件的海量数据

设计思想

用以agent代理为单位的java进程进行数据的采集

技术本质

就是由一个个持续运行的source(数据源),sink(数据目标)以及channel(用于连接source源和sink目标地的通道)构成的以agent(代理)为基本单元的 Java进程

核心特性

功能强大

  1. flume提供了大量的数据源和目标数据接口
  2. 数据源支持: socket数据包,文件,文件夹,kafka
  3. 目标数据支持: hdfs,habase,hive,kafka

定制化

  1. 可定制各类数据发送方
  2. 可定制各类数据接受方

预处理

  1. 拦截器,选择器,处理器,支持对数据做预处理

开发便捷,学习成本低

  1. flume将功能接口都做了封装,使用时直接通过采集方案配置即可

灵活度高,支持二次开发

  1. 源代码是java,开放了开发接口,支持用户自定义

实时性

  1. 数据一生成,就会被采集

稳定性

  1. flume提供了负载均衡和HA的设计,保证数据传输的安全性

组件介绍

agent

  • 概念:agent是 flume的基本工作单位,包含source,channel,sink三个组件
  • 流程:
    1.source监听数据源的变化,如果一旦产生了新的数据,就会将数据源中新产生的数据变成数据流,数据 流中每一条数据都作为一个event,将每个event发送给channel
    2.channel将source发送过来的一个个event做临时缓存,并加以自定义处理
    3.sink从每个channel中取得一个个event,然后将event中的数据写入目的地

source

  • 概念:source是 flume的数据源组件,对接各个不同的数据源,用于数据的采集。根据采集方式分为驱动型和轮询型。驱动型是外部发送数据给flume,轮询型是flume周期性主动去获取数据。source必须和一个channel关联

  • 常用类型:

  1. exec source: 将一条命令的执行结果输出作为数据源进行采集,一般与tail 动态输出文件同用
    优点:可以动态的监听日志文件的变化
    缺点:只支持监听单个文件,不支持监听多个文件
  2. spooling directory source: 监控多个文件或者一个目录,若有新的文件产生,会立马采集文件的数据
    优点: 可以监听一个目录,采集新产生的文件,可以通过正则来指定采集哪些文件,过滤加载需要的数据
    缺点: 不支持监听文件内部数据的变化
  3. taildir source: flume 1.7版本中才有,能同时监控一个目录或者多个文件,也能动态监控每个文件的 变化.还支持断点续传
  4. avro source: 数据流,遵从rpc协议的采集网络中数据的source
  5. kafka source: 用来采集kafka数据的source
  6. 还有 thrift,http,syslog,jms 类型

source 拦截器

  • 应用场景: 在source采集数据时,将每条数据变成event阶段,此时可用拦截器做相应业务处理

  • 功能:
    1.在event的header中添加keyvalue数据
    2.过滤数据,选择性采集数据

  • 常用拦截器: host interceptor, static interceptor,regex filtering interceptor

  • 自定义拦截器:
    1.外部类实现interceptor接口
    2.静态内部类实现interceptor.Builder:flume channel 先调用内部类的configure方法,再调用builder方法
    3.外部类通过构造方法 把接受的配置参数赋值自己的成员变量
    4.核心处理的逻辑是在intercept(event e)方法中实现的

channel

  • 概念:channel是flume的中间数据临时缓存组件,聚合数据,临时缓存,用于数据的中转,数据发送成功后,events移除。支持事务,提供较弱的顺序保证,可以连接多个source和sink。

  • 常用类型:

  1. memory channel: 数据临时缓存在内存中,不持久
    优点: 性能较高,速度较快,高吞吐
    缺点: 缓存数据量较少,易丢失,不可靠
  2. file channel: 数据临时缓存在文件中,基于WAL预写日志
    优点: 缓存数据量大,较安全
    缺点: 性能较差,速度慢,需要配置checkpoint目录
  3. kafka channel:数据临时缓存在kafka中
  4. jdbc channel: 只支持derby数据库,目前仅在测试阶段,event级别的持久化

channel 选择器

  • 应用场景: flume简单架构中,一个source,多个channel情况下,source应该将数据给到哪个channel,此时可使用channel选择器指定,即实现channel数据的负载均衡
  • 默认方式: 轮询策略
  • 作用: 1.可配合拦截器使用,在采集方案中指定每条event数据给哪个channel

sink

  • 概念:sink是flume的数据下沉组件,用于对接各个不同的数据目的地,用于数据的输出
  • 常用类型:
    1. logger sink: 将采集到的数据下沉到flume的日志中,一般用于测试
    2. hdfs sink: 将采集到的数据下沉到hdfs中,默认1kb一个文件,
      优点: 可以通过采集方案指定采集的文件大小(有偏差,event),生成的文件和文件夹的规则
    3. hive sink: 将数据采集到hive中,hive表必须为桶表类型,数据格式必须为orc类型
    4. file roll sink:将数据采集到本地文件系统,一般在高可用架构中,充当缓冲角色,用于本地存储备份
    5. avro sink: 通过网络发送数据
    6. kafka sink: 将数据写入kafka
    7. hbase sink:将数据写入hbase

sink 处理器

  • 应用场景: 在flume复杂架构的级联中,避免磁盘io过高,最后使用一个agent统一写入hdfs,此agent具有spof危险,processors能够实现故障转移功能,可以将多个sink封装成一个group组
  • 分类:load_balance / failover

event

  • 概念: fulme的最基本的数据单元,类似于一种数据包结构,包含header和body,header默认为空,body存放原始数据
    可以通过拦截器来设置header中的kv类型值,然后通过%{key}来获取

采集架构

  • 简单架构: 一个agent 单独工作,但是启动多个source,channel,sink完成数据采集,聚合,下沉功能
  • 复杂架构: 多个agent的级联工作,避免多个flume同时写入hdfs造成磁盘io过高,多个级联节点内数据支持复制

闲置滚动

  • 概念:flume不仅可以通过sink来指定输出文件时间,文件的大小,文件的event条数,还可以指定生成文件夹的规则,而且若文件闲置,即一段时间内没有数据进来,也可以通过hdfs.idletimeout参数开启闲置滚动,接收当前收集文件,进入到下一个收集
  • 补充:注意flume客户端会等待hdfs数据传输并备份完成,这时会造成闲置滚动参数无效问题,可以通过hdfs.minblockReplicas = 1来设置,即flume误认为hdfs副本数只需要备份一个即可

相关框架

  • flume: 日志文件,数据流
  • sqoop: 数据库
  • logstash: 日志文件,数据库,数据流

你可能感兴趣的:(Flume 日志文件/实时数据流采集框架 概念及原理介绍)