从本文开始对Flume 1.9.0 源码进行分析, 首先从启动入手.
一.源码包下载.
源码包: https://archive.apache.org/dist/flume/1.9.0/apache-flume-1.9.0-src.tar.gz
官方用户API:https://flume.apache.org/releases/content/1.9.0/FlumeUserGuide.html
官方开发API: https://flume.apache.org/releases/content/1.9.0/FlumeDeveloperGuide.html
官网是英文,下面是本人按官网的翻译, 有条件的话,建议阅读官方API
用户API: https://zhangboyi.blog.csdn.net/article/details/88525489
开发API: https://zhangboyi.blog.csdn.net/article/details/88565862
二.构建项目
mvn clean install -Dmaven.test.skip=true -X
解压到工作目录. 使用 maven 构建项目. 项目结构如图:
三. 核心目录说明
-
flume-ng-channels
里面包含了filechannel,jdbcchannel,kafkachannel,memorychannel通道的实现。 -
flume-ng-clients
实现了log4j相关的几个Appender,使得log4j的日志输出可以直接发送给flume-agent;其中有一个LoadBalancingLog4jAppender的实现,提供了多个flume-agent的load balance和ha功能,采用flume作为日志收集的可以考虑将这个appender引入内部的log4j中。 -
flume-ng-configuration
这个主要就是Flume配置信息相关的类,包括载入flume-config.properties配置文件并解析。其中包括了Source的配置,Sink的配置,Channel的配置,在阅读源码前推荐先梳理这部分关系再看其他部分的。 -
flume-ng-core
flume整个核心框架,包括了各个模块的接口以及逻辑关系实现。其中instrumentation是flume内部实现的一套metric机制,metric的变化和维护,其核心也就是在MonitoredCounterGroup中通过一个Map<key, AtomicLong>来实现metric的计量。ng-core下几乎大部分代码任然几种在channel、sink、source几个子目录下,其他目录基本完成一个util和辅助的功能。 -
flume-ng-node
实现启动flume的一些基本类,包括main函数的入口(Application.java中)。在理解configuration之后,从application的main函数入手,可以较快的了解整个flume的代码。
四.源码解析入口
以执行脚本命令举例
./flume-ng agent --conf conf --conf-file example.conf --name a1 -Dflume.root.logger=INFO,console
会调用flume-ng 脚本. 执行命令. 启动Java 程序
阅读后发现, 不管怎样都会调用 run_flume 方法, 只是根据参数不同,传入的参数不同而已.
我们看一下 run_flume 方法
执行命令
./flume-ng agent --conf conf --conf-file example.conf --name a1 -Dflume.root.logger=INFO,console
那么输出是什么呢???
exec
/Library/java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/bin/java
-Xmx20m
-Dflume.root.logger=INFO,console
-cp conf:/workspace/apache-flume-1.9.0-src/lib/*
-Djava.library.path= org.apache.flume.node.Application
--conf-file example.conf --name a1
得出结论: org.apache.flume.node.Application 启动类. 接下来直接看代码就好了.