flume 1.9 源码阅读(一)
Flume源码阅读
参考:
https://www.jianshu.com/p/0187459831af
http://flume.apache.org/FlumeUserGuide.html
Flume NG
Flume 是一个分布式的、可靠的、高效的日志采集、聚合、转移系统。他可以从多个不同的Source(源)将数据存储到中心数据仓库中
Flume NG 全称是 Flume (Next Generation) ,他是相对于 Flume OG (Original Genetration)而言的,他比Flume OG 要更简单、更轻量、更容易部署。
和 Flume OG 相比
首先 Flume NG 是从 Flume OG 开始的:
- Flume NG 依然使用 sources 和 sinks ,我们使用 channel 来连接他们
- channels 是可插拔(配置的), in-memory channel 用于快速但非持久事件传递、持久性事件传递使用file-based channel
- 不在区分逻辑节点和物理节点,所有节点被称为 agent, 每个agent可以运行0个或多个 sources 和 sinks
- 取消了 master,不在依赖于zookeeper
- 所有的东西都是以插件形式存在的,有些是面相最终用户的,有些则是面相开发人员的,可插拔组件包括 channels、sources、sinks、interceptors(拦截器)、sink processors 和 event serializers(事件序列化器)
Flume 源码目录结构
- 主要模块说明
-
flume-ng-channels
实现了flume channels,包含了flume-file-channel、flume-jdbc-channel、flume-kafka-channel、flume-spillable-memory-channel 四类 -
flume-ng-sources
实现了 flume sources, 如 flume-kafka-source、flume-taildir-source 等 -
flume-ng-sinks
实现了 flume sinks, 如 flume-hdfs-sink、 flume-ng-hbase-sink、flume-ng-elasticsearch-sink、flume-ng-kafka-sink 等 -
flume-ng-core
flume整个核心框架,包括了各个模块的接口以及逻辑关系实现 -
flume-ng-node
实现启动flume的一些基本类,包括main函数的入口(Application.java中) -
flume-ng-configuration
这个主要就是Flume配置信息相关的类,包括载入flume-config.properties配置文件并解析。其中包括了Source的配置,Sink的配置,Channel的配置 -
flume-ng-clients
实现了log4j相关的几个Appender,使得log4j的日志输出可以直接发送给flume-agent
Flume 结构
数据流模型
- Event: 一个 event 是对于 flume 来说就是一个最小数据单元
- Source: 获取数据(event)组件
- Channel: 用来存储source获取的数据(event)直到sink将其消费
- Sink: 消费Channel中数据,将其存储到外部设备或者发送到中间件中
简单的来说 Flume 使用 source 组件来获取数据(event), 然后将其存储到一个或者多个 channel 中,然后 sink 组件将其消费发送到外部存储或者中间件中(如kafka)。