博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Editlog与FileChannel Log的Group Commit
阅读量:5928 次
发布时间:2019-06-19

本文共 1765 字,大约阅读时间需要 5 分钟。

前阶段看Hadoop源码看到editlog部分,和flume file-channellogfile部分注意到一个相同之处:Groupcommit.其实最早接触这个概念是在MySQLredo log(注:binlog group commitmariadb/procona是支持的,或者mysqlsync_binlog=0;细节移步:);

先来看看Hadoop是怎么处理的:

Editlog是可以被多个线程并发写入的,每个线程维护了自己最新的一个事务ID

privatestaticfinalThreadLocal<TransactionId> myTransactionId = newThreadLocal<TransactionId>() {

protectedsynchronizedTransactionId initialValue() {

returnnewTransactionId(Long.MAX_VALUE);

}

};

在提交的时候,首先获得提交时最新的事务ID

synchronized(this){

TransactionId id = myTransactionId.get();

id.txidtxid;

}

然后开始同步(代码被删减)

//拿到自己的事务ID

longmytxid = myTransactionId.get().txid;

booleansync = false;

try{

EditLogOutputStream logStream = null;

synchronized(this){

try {

//如果自己的事务未被同步,但是同步正在被其他线程处理,那么就阻塞

while (mytxid > synctxid && isSyncRunning) {

try {

wait(1000);

catch (InterruptedException ie) {}

}

//当被唤醒或者超时发现自己的事务已经被group commit了,那么就返回

if (mytxid <= synctxid) {

return;

}

//否则开始进行sync

isSyncRunning = true;

sync = true;

//Hadoopeditlog使用了double buffer来达到刷新和写不阻塞;这里置换buffer

editLogStream.setReadyToFlush();

logStream = editLogStream;

try{

if (logStream != null) {

logStream.flush();

}

catch(IOException ex) {}

finally{

synchronized(this){

if (sync) {

isSyncRunning = false;

}

//刷新完成,唤醒阻塞线程

this.notifyAll();

}

}

而在Flume File-channel里的group commit也是类似的方式,不过更为简洁:

一样是分两个阶段,每个阶段都是同步方法,并且Flumetransactionidposition是分开的,每次只需同步文件末尾位置:

Commit();

Sync();

//在提交的时候更新最后提交位置

synchronizedvoidcommit(ByteBuffer buffer) throws IOException {

write(buffer);

lastCommitPosition= position();

}

//若已经被同步了则什么也不做,返回

synchronizedvoidsync() throwsIOException {

if(lastSyncPositionlastCommitPosition){

getFileChannel().force(false);

lastSyncPosition = position();

syncCount++;

}

}

本文转自MIKE老毕 51CTO博客,原文链接:http://blog.51cto.com/boylook/1300543,如需转载请自行联系原作者
你可能感兴趣的文章
Oracle 行列转置
查看>>
移动三大平台和三大开发模式对照分析
查看>>
[NOIP 2014复习]第二章:搜索
查看>>
[转]OpenMP中的private/firstprivate/lastprivate/threadprivate之间的比较
查看>>
HDU 2830 Matrix Swapping II
查看>>
P2258 子矩阵
查看>>
linux驱动编写之中断处理
查看>>
python判断一个对象是否可迭代
查看>>
自然语言交流系统 phxnet团队 创新实训 项目博客 (十二)
查看>>
第六届华为创新杯编程大赛-进阶1第3轮
查看>>
设计模式之问题集锦(一)
查看>>
IIS 服务或万维网公布服务,或者依赖这 服务可能在启动期间错误发生或者已禁用...
查看>>
web前端超出两行用省略号表示
查看>>
Java -- JDBC 学习--使用 DBUtils
查看>>
自写的开发框架,胜于官方的clientAPP的实战开发。(已开源)
查看>>
Jquery on方法绑定事件后执行多次
查看>>
Linux编程之有限状态机FSM的理解与实现
查看>>
bootstrap与jQuery结合的动态进度条
查看>>
Discuz论坛提速优化技巧
查看>>
JAVA NIO
查看>>