Flume-ng 源码分析
简介
近期由于项目需要开发独特的flume-source,因此简单看了下flume的源码。Flume的架构还是比较简单,各个模块功能源码比较清晰。
源码目录结构
flume-ng-channels
里面包含了filechannel和jdbcchannel的实现;没有追过早期的flume代码,不过从这目录结构看来,memorychannel并不在这个目录中,猜测file channel和jdbc channel是后期实现的功能;
flume-ng-clients
内部就实现了一个log4j相关的几个Appender,使得log4j的日志输出可以直接发送给flume-agent;其中有一个LoadBalancingLog4jAppender的实现,提供了多个flume-agent的load balance和ha功能,采用flume作为日志收集的可以考虑将这个appender引入内部的log4j中;
flume-ng-configuration
顾名思义,所有的配置均在此目录下。flume的配置设计的还是比较好的,内部在使用上抽象了ComponentConfiguration,多种角色(channel、channelselector、sink、sinkprocessor、source)都有自己的配置,因为flume的设计中在同一个process(flume-agent实例)中,可能会有多个source、sink、channel等角色,当配置多个source时,不同source会有自己的名字(component name)作为区分、会有自己的类型;阅读其他代码前,可以将conf的关系梳理清楚,有助于理解各个角色之间的关系;
flume-ng-core
flume整个核心框架,包括了各个模块的接口以及逻辑关系实现。其中instrumentation是flume内部实现的一套metric机制,metric的变化和维护,其核心也就是在MonitoredCounterGroup中通过一个Map<key, AtomicLong>来实现metric的计量。ng-core下几乎大部分代码任然几种在channel、sink、source几个子目录下,其他目录基本完成一个util和辅助的功能。
channel:
channel中实现了memorychannel;memory channel不提供数据可靠性,当agent down掉