[ xcly原创于iteye,见http://xcly.iteye.com ]
接上次介绍tailDir的实现后,这次介绍节点的启动。节点的启动实现在高版本中会有所区别,这次针对flume0.9.3.
启动Flume Master或者Node一般都用FlumeWatchdog启动,生成pid文件,判断配置读取,利用Watchdog, 利用Runtime的exec来启动新的进程, 与新进程通信,如果子进程异常终止,就会不断尝试重新启动子进程。
我们看FlumeNode,由Watchdog调用FlumeNode的main方法, 在参数的传递上,使用Commons CLI.Commons CLI是一个不错的处理传递参数的工具类。
FlumeNode构造函数初始化nodesMan为LogicalNodeManager,WALManager实例为NaiveFileWALManager。初始化liveMan 为LivenessManager实例,将nodesMan,walMans作为参数传递給了liveMan。
FlumeNode start方法,启动LivenessManager,即启动HeartbeatThread线程,连接master获取最新配置。
HeartbeatThread循环执行heartbeatChecks,调用checkLogicalNodes从master获取逻辑节点名称,新建LogicalNode对象放入LogicalNodeManager,然后调用checkLogicalNodeConfigs对每一个逻辑节点从master取source,sink配置,LogicalNode对象根据是否更新调用openLoadNode,openSourceSink,最后调用 loadNode,实例化DirectDriver对象,传入source,sink,唯一线程名称,DirectDriver对象内含PumperThread线程,循环调用source里的next方法取得信息事件,然后调用sink的append的方法完成事件的传递。