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(原创)的更多相关文章

  1. flume-ng源码阅读memory-channel(原创)

    org.apache.flume.channel.MemoryChannel类是Flume-NG的memory-channel. private LinkedBlockingDeque<Even ...

  2. PHP源码阅读strtr

    strtr 转换字符串中特定的字符,但是这个函数使用的方式多种. echo strtr('hello world', 'hw', 'ab'); // 第一种 aello borld echo strt ...

  3. JDK1.8源码阅读系列之四:HashMap (原创)

    本篇随笔主要描述的是我阅读 HashMap 源码期间的对于 HashMap 的一些实现上的个人理解,用于个人备忘,有不对的地方,请指出- 接下来会从以下几个方面介绍 HashMap 源码相关知识: 1 ...

  4. [原创]chromium源码阅读-进程间通信IPC.消息的接收与应答

    chromium源码阅读-进程间通信IPC.消息的接收与应答   chromium源码阅读-进程间通信IPC.消息的接收与应答 介绍 chromium进程间通信在win32下是通过命名管道的方式实现的 ...

  5. [PHP源码阅读]explode和implode函数

    explode和implode函数主要用作字符串和数组间转换的操作,比如获取一段参数后根据某个字符分割字符串,或者将一个数组的结果使用一个字符合并成一个字符串输出.在PHP中经常会用到这两个函数,因此 ...

  6. ng2048源码阅读

    ng2048源码阅读 Tutorial: http://www.ng-newsletter.com/posts/building-2048-in-angularjs.html Github: http ...

  7. TiDB 源码阅读系列文章(一)序

    原创: 申砾 PingCAP  2018-02-28 在 TiDB DevCon2018 上,我们对外宣布了 TiDB 源码阅读分享活动,承诺对外发布一系列文章以及视频帮助大家理解 TiDB 源码.大 ...

  8. Pytorch版本yolov3源码阅读

    目录 Pytorch版本yolov3源码阅读 1. 阅读test.py 1.1 参数解读 1.2 data文件解析 1.3 cfg文件解析 1.4 根据cfg文件创建模块 1.5 YOLOLayer ...

  9. 【Dubbo源码阅读系列】服务暴露之远程暴露

    引言 什么叫 远程暴露 ?试着想象着这么一种场景:假设我们新增了一台服务器 A,专门用于发送短信提示给指定用户.那么问题来了,我们的 Message 服务上线之后,应该如何告知调用方服务器,服务器 A ...

随机推荐

  1. CSS 关于让页面的高度达到电脑屏幕的底部

    .sidebar:before {content: "";display: block;width: 190px;position: fixed;bottom: 0;top: 0; ...

  2. Java源码之Object

    本文出自:http://blog.csdn.net/dt235201314/article/details/78318399 一丶概述 JAVA中所有的类都继承自Object类,就从Object作为源 ...

  3. MySQL复制(二):二进制日志、二进制日志的结构和内容

    通常只有即将执行完毕的语句才会写入到二进制日志中.但是一些特殊情况:语句附加的信息或直接代替语句被写入. 二进制日志记录的内容 作用:记录数据库中表的更变,用于复制和PITP(即时恢复) 基于语句SB ...

  4. Django之REST_framework 框架基本组件使用

    快速实例 快速实例: 点击查看官方文档 阅读推荐:点击查看 序列化 创建一个序列化类 简单使用 开发我们的Web API的第一件事是为我们的Web API提供一种将代码片段实例序列化和反序列化为诸如j ...

  5. Python socket编程之IO模型介绍(多路复用*)

    1.I/O基础知识 1.1 什么是文件描述符? 在网络中,一个socket对象就是1个文件描述符,在文件中,1个文件句柄(即file对象)就是1个文件描述符.其实可以理解为就是一个“指针”或“句柄”, ...

  6. Hibernate一对多、多对一关联

    一对多.多对一关联:在多方加外键 示例:Group(一方)和User(多方),一个Group可以有多个User,每个User只能属于一个Group   多对一单向关联 在User(多方)中建Group ...

  7. 计算机网络概述 传输层 TCP流量控制

    TCP流量控制 所谓流量控制就是让发送发送速率不要过快,让接收方来得及接收.利用滑动窗口机制就可以实施流量控制.通过运用TCP报文段中的窗口大小字段来控制,发送方的发送窗口不可以大于接收方发回的窗口大 ...

  8. 【Head First Servlets and JSP】笔记4:HttpServletRequest req

    api:https://tomcat.apache.org/tomcat-5.5-doc/servletapi/ 1.GET和POST除去数据大小之外的区别. 安全性问题.使用GET的话,参数数据会出 ...

  9. Django 路由、模板和模型系统

    一.路由系统 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这 ...

  10. P4271 [USACO18FEB]New Barns

    题目 P4271 [USACO18FEB]New Barns 做法 这题很长见识啊!! 知识点:两棵树\((A,B)\)联通后,新树的径端点为\(A\)的径端点与\(B\)的径端点的两点 不断加边,那 ...