设为首页 收藏本站
查看: 1667|回复: 0

[经验分享] Flume源代码解读一

[复制链接]

尚未签到

发表于 2017-5-21 14:28:27 | 显示全部楼层 |阅读模式
  
  [ xcly原创于iteye,见
http://xcly.iteye.com
 ]

  年初团队接了搭建公司Hadoop平台的研发计划,负责公司产品日志的收集,分析两个工作。
  日志收集准备搭建flume(0.9.3)这个分布式日志收集集群.背景介绍完毕,马上开始。
  Flume分为agent,collector,master三个概念节点,agent负责收集日志,发到collector, collector一般负责接收agent发过来的事件流,写到存储器,这里一般是hdfs. master负责配置及通信管理,类似于hadoop中的NameNode,是心脏,是整个集群控制器。
  此次业务收集的日志主要是公司上千台服务器的产品日志,包括访问日志,搜索日志,下载日志,全部要入到hdfs, agent收集日志的source准备用tailDir来处理,今天我们就来看看tailDir的实现。 
  tailDir为EventSource的一种方式,source指日志信息产生源,在SourceFactoryImpl定义了我们可以使用的各种事件源,SourceFactoryImpl集成SourceFactory,是典型的工厂方法,通过getSource方法返回EventSource。 这里getSource的实现方法并不是简单的返回具体EventSource实现类,而是调用SourceBuilder的build方法返回。 SourceBuilder的实现类似于工厂方法,只是在每一个EventSource都必须含有builder的静态方法返回具体SourceBuilder的实现,这种方式实现有一定的优雅性,各个EventSource封装了自己对参数的不同处理,又可以根据不同的情况调用不同的构造函数,甚至是调用另一个EventSource的实现。 
  tailDir的实现类为TailDirSource, 有4个参数,dir要监听的文件夹,regex正则表达式限定命名文件,startFromEnd启动时是否从文件尾开始读取,recurseDepth要监听的文件夹级数。 在配置tailDir的时候容易被flume user guide误导,犯一个错误,参数的传递不需要参数名=,直接用逗号隔开的配置值即可,否则是使用默认值的。而且四个参数的顺序是固定的,必须是dir,regex,startFromEnd,recurseDepth,如果只使用前两个,可只传递两个参数,如果要使用recurseDepth,必须传递4个参数。
  TailDirSource对文件的监听调用 DirWatcher实现,在open方法中调用,每一个文件夹包括子文件夹对应一个DirWatcher实例,而DirWather用Periodic监听文件夹,每250毫秒遍历文件夹下所有文件一次, 同第一次新建DirWatcher实例一样,用fileCreated方法新建Cursor,Cursor是读取遍历文件的关键类。
  TailDirSource open方法还新建了TailSource实例,而TailSource新建了TailThread线程,TailThread线程不断循环从Cursor队列数组中遍历读取每一行事件,放到TailSource的队列中中。而TailDirSource 的next方法调用TailSource的next方法,  每100ms从TailSource的队列中取事件。主线程取数据,分线程放入数据。
  Cursor是读取文件信息的关键类,核心是用RandomAccessFile来读取文件,RandomAccessFile支持任意位置的随机读取,非常强大。默认每次是文件开头或者文件结尾读取,我们此次对于过大的文件加入了文件点读取记录功能,防止重复读取。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-379651-1-1.html 上篇帖子: 【转】Flume海量日志收集系统 下篇帖子: Flume源代码解读二
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表