随着 Storm,Spark 等实时计算框架不断应用到企业级大数据平台, 对实时数据采集的技术选型要求也越来越高. 因此, 迫切急需一套易扩展, 高容错, 高可用, 可恢复的高性能数据采集系统来保证实时数据的收集. Flume 是一套分布式, 高可用的数据收集系统, 可以通过简单配置实现不同数据源的海量数据采集, 无需修改 Flume 的任何代码, 并将采集数据准确, 高效地传输到不同的存储媒介. Flume 属于 Hadoop 关键组件之一, 可与 Kafka,Elasticsearch,Hive,HBase 等主流框架实现对接, 为企业级大数据平台提供简单, 高效, 准确的轻量级数据采集工具.
Flume 原始版本为 Flume-OG, 经过升级改造已经更名为 Flume-NG, 由 Apache 开源发布. Flume-NG 采用分层架构设计, 共包括三个层次: 数据采集层(Source), 数据缓冲层(Channel), 数据处理层(Sink), 如下图所示:
基本架构
Agent: 包含 Source,Channel,Sink 的 Flume 进程称为 Agent,Flume 的数据采集是通过一系列的 Agent 组件构成, Agent 从原始数据源接收数据, 传递到下一个 Agent, 直到到达目标存储系统. 如下图所示:
Flume 进程
Event: 在构成 Flume 数据流水线的 Agent 中传递的数据称为 Event, 每个 Event 由数据头和数据体 (字节数组) 两部分构成. 其中, 数据头由一系列的 key/value 键值对构成, 可用于数据路由. 数据体由字节数组存储实际要传递的数据. Event 由定制开发的客户端程序生成, 然后调用 Flume 提供的二次开发包将 Event 对象发送给 Agent. 如下图所示:
Event 对象
Source: 是 Agent 中接收 Event 对象的组件, Source 从定制开发的客户端或上一个 Agent 接收 Event 对象数据, 并将其写入一个或多个 Channel, 相当于 Channel 的生产者. 为了快速, 简便使用, Flume 提供很多的 Source 实现, 包括: Avro Source,Exec Source,Kafka Source,Taildir Source,Spooling Directory
Source 等, 详细功能请查阅 Flume-NG 官方介绍. 当然, 用户也可以根据自己的需要定制开发 Source.
Channel: 是 Event 中转临时缓冲区, 存储 Source 收集并且没有被 Sink 读取的 Event, 相当于 Flume 内部的消息队列. Channel 是线程安全的, 并提供事务性操作. 常用的 Channel 实现包括: Memory Channel,File Channel,Kafka Channel 等, 详细功能请查阅 Flume-NG 官方介绍.
Sink: 负责从 Channel 中读取 Event 数据, 并发送给下一个 Agent 的 Source 或者将 Event 保存至目标存储系统, 相当于是 Channel 的消费者. 常见的 Sink 实现包括: HDFS Sink,HBase Sink,Avro/Thrift Sink,Elasticsearch Sink,Kafka Sink 等, 详细功能请查阅 Flume-NG 官方介绍.
Flume 采用事务机制保证 Event 传递的可靠性. Sink 必须在 Event 被成功传递给下一个 Agent 后, 才能把 Event 从 Channel 中删除掉. 这样数据流里的 Event 无论是在一个 Agent 还是在多个 Agent 之间流转, 都能保证可靠性.
结束语: 除了 Source,Channel 和 Sink 外, Flume Agent 还提供 Interceptor,Channel Selector 和 Sink Processor 等组件, 具体组件实现功能将在后续文章中介绍.
来源: http://www.jianshu.com/p/816ccdff13cb