Flume-NG中的Channel与Transaction关系(原创)
在sink和source中(不管是内置还是自定义的),基本都有如下代码,这些代码在sink中的process方法中,而在source中自己不需要去写,在source中getChannelProcessor().processEventBatch(events)方法中会自动创建下面类似的:
...
Channel channel = getChannel();
Transaction transaction = channel.getTransaction();
Event event = null;
Status result = Status.READY;
transaction.begin();
...
event = channel.take();//getChannelProcessor().processEvent(event);,前者用于sink后者用于source
...
transaction.commit();
transaction.rollback()
transaction.close();
...
那么有些人就要问了?从上述代码中似乎只需要获取channel就可以了,因为获取数据时只需要event = channel.take()或者
getChannelProcessor().processEvent(event)?这样对吗?你可以去掉transaction试试,结果显示是不行的,出错!
那么为什么呢?这确实有点让人疑惑,但实际上channel.take()操作是transaction.doTake()。也就是实际的put和take等操作都是在transaction中进行的,因此要用channel必须要先创建transcation才可以使用。而channel.getTransaction()方法就是获取(已经创建)或创建(还没有)transcation,BasicChannelSemantics的相对应代码如下:
@Override
public Transaction getTransaction() { if (!initialized) {
synchronized (this) {
if (!initialized) {
initialize();
initialized = true;
}
}
} BasicTransactionSemantics transaction = currentTransaction.get();//获取transcation
if (transaction == null || transaction.getState().equals(//如果transaction不存在或者已关闭就创建
BasicTransactionSemantics.State.CLOSED)) {
transaction = createTransaction();//创建
currentTransaction.set(transaction);//赋值给currentTransaction
}
return transaction;
}
该方法在所有channel的父类BasicChannelSemantics中,然后在具体实现的channel类中需要实现protected abstract BasicTransactionSemantics createTransaction()这个抽象方法来获取相应的transaction对象。BasicChannelSemantics把transaction.take()和transaction.put(event)方法进一步封装成take()和put(event)方法,这俩方法就是暴露在sink或者source中的channel.take()和channel.put(event)方法。
@Override
public void put(Event event) throws ChannelException {
BasicTransactionSemantics transaction = currentTransaction.get();
Preconditions.checkState(transaction != null,
"No transaction exists for this thread");
transaction.put(event);
} @Override
public Event take() throws ChannelException {
BasicTransactionSemantics transaction = currentTransaction.get();
Preconditions.checkState(transaction != null,
"No transaction exists for this thread");
return transaction.take();
}
由此,可以看出工作行程了吧!
Transaction transaction = channel.getTransaction();这一句至少要执行一次,因为执行一次之后就会将transcation对象缓存到currentTransaction中,后续就不会再创建transaction了。
Flume-NG中的Channel与Transaction关系(原创)的更多相关文章
- Flume NG中的ElasticSearch Sink
ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Apach ...
- Flume NG中的Kafka Channel
kafka(官网地址:http://kafka.apache.org)是一款分布式消息发布和订阅的系统 在Flume中的KafkaChannel支持Flume与Kafka整合,可以将Kafka当做ch ...
- Flume NG中的Netcat Source
NetCat是一个非常简单的Unix工具,可以读.写TCP或UDP网络连接(network connection)中数据 在Flume中的netcat支持Flume与NetCat整合,flume可以使 ...
- Flume NG Getting Started(Flume NG 新手入门指南)
Flume NG Getting Started(Flume NG 新手入门指南)翻译 新手入门 Flume NG是什么? 有什么改变? 获得Flume NG 从源码构建 配置 flume-ng全局选 ...
- 【转】Flume(NG)架构设计要点及配置实践
Flume(NG)架构设计要点及配置实践 Flume NG是一个分布式.可靠.可用的系统,它能够将不同数据源的海量日志数据进行高效收集.聚合.移动,最后存储到一个中心化数据存储系统中.由原来的Fl ...
- Flume NG 简介及配置实战
Flume 作为 cloudera 开发的实时日志收集系统,受到了业界的认可与广泛应用.Flume 初始的发行版本目前被统称为 Flume OG(original generation),属于 clo ...
- Flume NG 配置详解(转)
原文链接:[转]Flume NG 配置详解 (说明,名词对应解释 源-Source,接收器-Sink,通道-Channel) 配置 设置代理 Flume代理配置存储在本地配置文件.这是一个文本文件格式 ...
- FLUME NG的基本架构
Flume简介 Flume 是一个cloudera提供的 高可用高可靠,分布式的海量日志收集聚合传输系统.原名是 Flume OG (original generation),但随着 FLume 功能 ...
- Flume组件source,channel,sink源码分析
LifeCycleState: IDLE, START, STOP, ERROR [Source]: org.apache.flume.Source 继承LifeCycleAware{stop() + ...
随机推荐
- 微软Build 2017开发者大会午夜趴
时间:2017年5月10号半夜 地点:微软中关村会议室 一年一度的Build大会,微软今年特地组织了一波粉丝到“现场”远程观摩keynote直播,同时在新浪直播间里也有相应的专家进行同步翻译和讲(tu ...
- 第17章—前端分页(Bootstrap-Table)
spring boot 系列学习记录:http://www.cnblogs.com/jinxiaohang/p/8111057.html 码云源码地址:https://gitee.com/jinxia ...
- JavaScript四种数值取整方法
一.Math.trunc() 1.定义 Math.trunc()方法去除数字的小数部分,保留整数部分. 2.语法 Math.trunc(value) 3.示例 console.log(Math.tru ...
- 转!! Eclipse设定和修改文件字符编码格式和换行符
Window -> Preferences -> General -> Workspace : Text file encoding :Default : 选择此项将设定文件为系统默 ...
- 【pip】【conda】
1.指定python包安裝版本== 指定python包安裝源-i: pip2 -i https://pypi.tuna.tsinghua.edu.cn/simple 2.配置文件换源 vi ~/.p ...
- 在容器最前面添加DOM元素 parent.insertBefore(new, parent.children[0])
//判断容器当前有没有子级元素,如果没有直接appendChild就行了; if (p.children[0]) { p.insertBefore(span, p.children[0]); } el ...
- 一.数据库连接对象connection
1.python 3.5,需要把MySQLdb换成pymysql
- 自动更新SVN项目
@echo off@echo =================================@echo 定时在SVN上自动更新项目内容,可用于项目放在web服务器没有hudson的时候@echo ...
- rest_framework之访问频率控制
一 自定义频率控制类 class MyThrottle(): visitor_dic = {} def __init__(self): self.history = None def allow_r ...
- python多线程的两种写法
1.一般多线程 import threading def func(arg): # 获取当前执行该函数的线程的对象 t = threading.current_thread() # 根据当前线程对象获 ...