flume-ng源码阅读RollingFileSink(原创)
org.apache.flume.sink.RollingFileSink 这个类比较简单。
source的种类有两种:一种是PollableSource;另外一种是EventDrivenSource。前者“必须有它自己的callback机制,该机制用于捕获新数据并将数据存储到通道中”,后者“不是由其自身的线程驱动”。在自定义source时,前者必须要实现process方法,通过调用这个方法将event放入channel中;后者没有这个方法,可以自由发挥。
sink不像source,只有一种sink,需要extends AbstractSink implements Configurable。
sink用于从通道中提取事件,并将事件传送到流中的下个flume或者将事件存储到一个外部数据仓库。一个sink与一个或者多个通道相连,在flume属性文件中配置。
有一个SinkRunner实例与各个配置好的sink相连。当flume框架调用 SinkRunner.start(),一个新的线程产生来驱动该sink(使用SinkRunner.PollingRunner as the thread’s Runnable)。该线程管理这个sink的生命周期。sink需要实现start()和stop()方法,这两个方法是LifecycleAware接口的一部分。Sink.start()方法会初始化sink,让该sink可以将事件传输到下个目的地。Sink.process()方法是一个核心操作,它将事件从通道中提取并传输事件。Sink.stop()方法为必要的清理方法(例如释放资源)。sink的实现还需要实现Configurable 接口,用于处理其自身的参数配置。
RollingFileSink类中需要理解的有start()方法和process()方法。
一、start()方法
主要作用在于启动了一个线程,用来每隔rollInterval秒就创建一个新的文件(程序启动的时间戳+文件编号为名称,配置文件动态修改后,时间戳会变动)。并且通知process可以将正在写的这个文件关闭,准备写新的文件。
需要注意这个变量shouldRotate,初始的时候即start之前,是false的,执行start之后由于线程启动之后首次运行需要等待rollInterval秒,所以这个时间段shouldRotate一直是false,在此期间process方法会一直向一个文件写数据,直到shouldRotate=true,也就是线程每隔rollInterval秒运行之后(shouldRotate会设置为true,并且会获得下一个写入的文件名),这会周期性的运行。
二、process方法
这个方法会一直被重复调用。
它会首先判断是否需要关闭当前的文件shouldRotate=true就会关闭文件。并且重新
shouldRotate=false;//可以对下一个文件一直写
pathController.rotate();//表示当前的文件写入完毕,并且可以准备写入下一个文件
File currentFile = pathController.getCurrentFile();//在pathController.rotate()之后该方法就可以获取下一个将要写入的文件名,
//start方法中也有这句代码,目测start中的这句代码没啥作用,因为shouldRotate = true会导致文件的滚动
rollService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
logger.debug("Marking time to rotate file {}",
pathController.getCurrentFile());//这句没啥作用。。。。。。。。
shouldRotate = true; //表示当前文件写满,准备写下一个文件
}
}, rollInterval, rollInterval, TimeUnit.SECONDS);
serializer默认是org.apache.flume.serialization.BodyTextEventSerializer
接下来就是向channel发送数据了。。。
Status result = Status.READY;
transaction.begin();
event = channel.take();
//自己的处理逻辑,本类中就是序列化到文件中serializer.write(event)
transaction.commit();
transaction.rollback();
transaction.close();
这个比较简单,可以用来熟悉sink的处理流程,以及学习如何自定义sink。
flume-ng源码阅读RollingFileSink(原创)的更多相关文章
- flume-ng源码阅读memory-channel(原创)
org.apache.flume.channel.MemoryChannel类是Flume-NG的memory-channel. private LinkedBlockingDeque<Even ...
- PHP源码阅读strtr
strtr 转换字符串中特定的字符,但是这个函数使用的方式多种. echo strtr('hello world', 'hw', 'ab'); // 第一种 aello borld echo strt ...
- JDK1.8源码阅读系列之四:HashMap (原创)
本篇随笔主要描述的是我阅读 HashMap 源码期间的对于 HashMap 的一些实现上的个人理解,用于个人备忘,有不对的地方,请指出- 接下来会从以下几个方面介绍 HashMap 源码相关知识: 1 ...
- [原创]chromium源码阅读-进程间通信IPC.消息的接收与应答
chromium源码阅读-进程间通信IPC.消息的接收与应答 chromium源码阅读-进程间通信IPC.消息的接收与应答 介绍 chromium进程间通信在win32下是通过命名管道的方式实现的 ...
- [PHP源码阅读]explode和implode函数
explode和implode函数主要用作字符串和数组间转换的操作,比如获取一段参数后根据某个字符分割字符串,或者将一个数组的结果使用一个字符合并成一个字符串输出.在PHP中经常会用到这两个函数,因此 ...
- ng2048源码阅读
ng2048源码阅读 Tutorial: http://www.ng-newsletter.com/posts/building-2048-in-angularjs.html Github: http ...
- TiDB 源码阅读系列文章(一)序
原创: 申砾 PingCAP 2018-02-28 在 TiDB DevCon2018 上,我们对外宣布了 TiDB 源码阅读分享活动,承诺对外发布一系列文章以及视频帮助大家理解 TiDB 源码.大 ...
- Pytorch版本yolov3源码阅读
目录 Pytorch版本yolov3源码阅读 1. 阅读test.py 1.1 参数解读 1.2 data文件解析 1.3 cfg文件解析 1.4 根据cfg文件创建模块 1.5 YOLOLayer ...
- 【Dubbo源码阅读系列】服务暴露之远程暴露
引言 什么叫 远程暴露 ?试着想象着这么一种场景:假设我们新增了一台服务器 A,专门用于发送短信提示给指定用户.那么问题来了,我们的 Message 服务上线之后,应该如何告知调用方服务器,服务器 A ...
随机推荐
- 【BZOJ4066】简单题 KDtree
[BZOJ4066]简单题 Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x,y& ...
- n++ ++n
n = 100 + m++ n = 100 +m; ++m n = 100 + ++m; ++m; n = 100 +m ;
- android菜鸟学习笔记29----Android应用向用户发送提示信息的方式总结
常见的向用户发送提示信息的方式有3种,分别为: 1)发送Toast信息 2)弹出对话框 3)发送通知 总结如下: 方式1:发送Toast信息: 这种方式最简单,在之前的学习中多次使用过.Toast是在 ...
- 【python】-- Django ORM(基础)
Django ORM(基础) Django 框架十分强大,自带数据库操作功能.Django 跟 SQLAchemy 一样,也是通过ORM(Object Relational Mapping,关系对象映 ...
- Django 路由系统(URL)
介绍 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. 你就是以这种方式告 ...
- W5100硬件设计和调试要点
文章来源:成都浩然 与MCU的接口 W5100与MCU接口採用并行总线方式(假设要使用SPI接口,建议採用W5200),因此W5100与MCU的接口设计相对简单.以AT89C52为例,例如以下图所看到 ...
- Js用户引导插件intro
1.demo直接贴上来了,有什么不懂的,直接去官网上看,地址:https://introjs.com/. 2.这个intro插件的版本是v2.7.0,复制下来代码,引入库应该直接可以运行. 3.点评一 ...
- 运行jupyter notebook 出错 Error executing Jupyter command 'notebook'
实际上是安装jupyter时候有错误, 仔细看日志发现需要缺少 Microsoft Visual C++ Compiler for Python 2.7 下载安装后,重新安装jupyter即可 htt ...
- equal?, == and eql?, ===,
1.BasicObject中定义了 == 和equal?这两个方法,两个方法等价,用来比较两个对象是否是同一个对象,是的话结果就为true. 既然两者相同,为何要定义两个呢?只是为了再命名一个别名吗? ...
- Admin添加字段
后台扩展用户信息,注意要到settings里面进行设定,有关联和继承两种方式 首先的关联表可以关联到user表但,主键在user表当中,所以没法直接在user表当中看到相关信息,要是通过继承扩展的话, ...