Flume 1.7 源码分析(二)整体架构

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Lnho2015/article/details/58055919

Flume 1.7 源码分析(一)源码编译
Flume 1.7 源码分析(二)整体架构
Flume 1.7 源码分析(三)程序入口
Flume 1.7 源码分析(四)从Source写数据到Channel

3 整体架构

Flume有三大组件:Source、Channel、Sink。

Flume组件图

  • Source就是数据来源,例如Web Server产生日志后,可使用ExecSource执行tail -F命令后不断监听日志文件新生成的数据,然后传给Channel。
  • Channel就是一个缓存队列,由于读取数据和写入数据的速度可能不匹配,假如用同步完成的方式可能效率低下,所以Source把数据写到Channel这个队列里面,Sink再用另外的线程去读取。
  • Sink就是最终的存储,例如可以是HDFS或LOG文件输出等,Sink负责去Channel里面读取数据,并存储。

在程序启动时,会启动所有的SourceRunner、Channel、SinkRunner。其中Channel的启动,没做什么特别的事情,就是初始化一下状态、创建一下计数器,算做一个被动的角色。比较重要的是SourceRunner和SinkRunner。

  • SourceRunner会调用Source的start方法。以ExecSource为例,其start方法就是启动一个线程,去不断获取标准输出流写入一个列表(eventList),同时再启动一个线程去定期批量地把列表中的数据往Channel发,如下图所示。
  • SinkRunner则是不断循环调用SinkProcess的process的方法,SinkProcess有几种类型,用于决定选择哪个Sink进行存储(Sink可以有多个),选择了Sink后,调用其process方法。Sink的process方法,主要做的就是去Channel中读取数据,并写入对应的存储,如下图所示。

Flume整体流程图

猜你喜欢

转载自blog.csdn.net/Lnho2015/article/details/58055919