技术背景
由cloudera软件公司产出的可分布式日志收集系统,
后与2009年被捐赠了apache软件基金会,为hadoop相关组件之一。
尤其近几年随着flume的不断被完善以及升级版本的逐一推出,特别是flume-ng;
同时flume内部的各种组件不断丰富,用户在开发的过程中使用的便利性得到很大的改善,现已成为apache top项目之一.
设计目的
向hadoop集群批量导入基于事件的海量数据
设计思想
用以agent代理为单位的java进程进行数据的采集
技术本质
就是由一个个持续运行的source(数据源),sink(数据目标)以及channel(用于连接source源和sink目标地的通道)构成的以agent(代理)为基本单元的 Java进程
核心特性
功能强大
- flume提供了大量的数据源和目标数据接口
- 数据源支持: socket数据包,文件,文件夹,kafka
- 目标数据支持: hdfs,habase,hive,kafka
定制化
- 可定制各类数据发送方
- 可定制各类数据接受方
预处理
- 拦截器,选择器,处理器,支持对数据做预处理
开发便捷,学习成本低
- flume将功能接口都做了封装,使用时直接通过采集方案配置即可
灵活度高,支持二次开发
- 源代码是java,开放了开发接口,支持用户自定义
实时性
- 数据一生成,就会被采集
稳定性
- 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关联
常用类型:
- exec source: 将一条命令的执行结果输出作为数据源进行采集,一般与tail 动态输出文件同用
优点:可以动态的监听日志文件的变化
缺点:只支持监听单个文件,不支持监听多个文件 - spooling directory source: 监控多个文件或者一个目录,若有新的文件产生,会立马采集文件的数据
优点: 可以监听一个目录,采集新产生的文件,可以通过正则来指定采集哪些文件,过滤加载需要的数据
缺点: 不支持监听文件内部数据的变化 - taildir source: flume 1.7版本中才有,能同时监控一个目录或者多个文件,也能动态监控每个文件的 变化.还支持断点续传
- avro source: 数据流,遵从rpc协议的采集网络中数据的source
- kafka source: 用来采集kafka数据的source
- 还有 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。
常用类型:
- memory channel: 数据临时缓存在内存中,不持久
优点: 性能较高,速度较快,高吞吐
缺点: 缓存数据量较少,易丢失,不可靠 - file channel: 数据临时缓存在文件中,基于WAL预写日志
优点: 缓存数据量大,较安全
缺点: 性能较差,速度慢,需要配置checkpoint目录 - kafka channel:数据临时缓存在kafka中
- jdbc channel: 只支持derby数据库,目前仅在测试阶段,event级别的持久化
channel 选择器
- 应用场景: flume简单架构中,一个source,多个channel情况下,source应该将数据给到哪个channel,此时可使用channel选择器指定,即实现channel数据的负载均衡
- 默认方式: 轮询策略
- 作用: 1.可配合拦截器使用,在采集方案中指定每条event数据给哪个channel
sink
- 概念:sink是flume的数据下沉组件,用于对接各个不同的数据目的地,用于数据的输出
- 常用类型:
- logger sink: 将采集到的数据下沉到flume的日志中,一般用于测试
- hdfs sink: 将采集到的数据下沉到hdfs中,默认1kb一个文件,
优点: 可以通过采集方案指定采集的文件大小(有偏差,event),生成的文件和文件夹的规则 - hive sink: 将数据采集到hive中,hive表必须为桶表类型,数据格式必须为orc类型
- file roll sink:将数据采集到本地文件系统,一般在高可用架构中,充当缓冲角色,用于本地存储备份
- avro sink: 通过网络发送数据
- kafka sink: 将数据写入kafka
- 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: 日志文件,数据库,数据流