HLog
当客户端往RegionServer上提交了一个更新操作后,会调用HLog的append方法往WAL上写一个节点,入口方法就是append
1.append
public void append(HRegionInfo info, byte [] tableName, WALEdit edits,
final long now)
throws IOException {
if (edits.isEmpty()) return;
if (this.closed) {
throw new IOException("Cannot append; log is closed");
}
synchronized (this.updateLock) {
long seqNum = obtainSeqNum();
byte [] hriKey = info.getEncodedNameAsBytes();
this.lastSeqWritten.putIfAbsent(hriKey, seqNum);//存的是一个最老的sqeNum,这是代表,比该值等于或大于的数据都是没有持久化的
HLogKey logKey = makeKey(hriKey, tableName, seqNum, now);
doWrite(info, logKey, edits);//写数据,关键方法
this.numEntries.incrementAndGet();
}
// Sync if catalog region, and if not then check if that table supports
// deferred log flushing
if (info.isMetaRegion() ||
!info.getTableDesc().isDeferredLogFlush()) {
this.sync();//如果是Meta表或是表不允许延迟同步,则立即同步
}
}
2.doWrite
protected void doWrite(HRegionInfo info, HLogKey logKey, WALEdit logEdit)
throws IOException {
if (!this.enabled) {
return;
}
if (!this.listeners.isEmpty()) {
for (WALObserver i: this.listeners) {
i.visitLogEntryBeforeWrite(info, logKey, logEdit);//观察者模式,以便调起其他需要通知的方法
}
}
try {
long now = System.currentTimeMillis();
this.writer.append(new HLog.Entry(logKey, logEdit));//重要方法是这句
long took = System.currentTimeMillis() - now;
writeTime += took;
writeOps++;
if (took > 1000) {
long len = 0;
for(KeyValue kv : logEdit.getKeyValues()) {
len += kv.getLength();
}
LOG.warn(String.format(
"%s took %d ms appending an edit to hlog; editcount=%d, len~=%s",
Thread.currentThread().getName(), took, this.numEntries.get(),
StringUtils.humanReadableInt(len)));//记录用时,如果超一秒则警告
}
} catch (IOException e) {
LOG.fatal("Could not append. Requesting close of hlog", e);
requestLogRoll();//如果写出错日志会被截断
throw e;
}
}
SequenceFileLogWriter
3.append
public void append(HLog.Entry entry) throws IOException {
this.writer.append(entry.getKey(), entry.getEdit());
}
SequenceFile.Writer
4.append
最终是调用hadoop的SequenceFile.Writer.append将数据持久化的。
当Region的memstore flush之后,会往HLog里写一条日志,标明哪个表的哪个分区在哪个sequenceId这里持久化过一遍
1.completeCacheFlush
public void completeCacheFlush(final byte [] encodedRegionName,
final byte [] tableName, final long logSeqId, final boolean isMetaRegion)
throws IOException {
try {
if (this.closed) {
return;
}
synchronized (updateLock) {
long now = System.currentTimeMillis();
WALEdit edit = completeCacheFlushLogEdit();//这一句表名是Flush这种操作的日志
HLogKey key = makeKey(encodedRegionName, tableName, logSeqId,
System.currentTimeMillis());//这一句表明该日志记录下了表名、分区名、当前的日志SequenceId
this.writer.append(new Entry(key, edit));//这一句写入日志文件
writeTime += System.currentTimeMillis() - now;
writeOps++;
this.numEntries.incrementAndGet();
Long seq = this.lastSeqWritten.get(encodedRegionName);
if (seq != null && logSeqId >= seq.longValue()) {
this.lastSeqWritten.remove(encodedRegionName);//每个Region最后更新SequenceId被删除,表明该Region没有数据需要持久化。
}
}
// sync txn to file system
this.sync();//这种flush操作很重要,一定要同步到hdfs的其他节点上
} finally {
this.cacheFlushLock.unlock();
}
}
分享到:
相关推荐
Hbase HLog源代码阅读笔记 HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)...
介绍了大数据平台如何将hdfs中的分布式文件导入hbase 。源代码在cloudera-SCM 的cdh 4.8.1产品环境中验证通过。
《hbase权威指南》随书示例源代码.方便学习
hbase权威指南.源代码.绝对经典。。 下载后评分+评论,即可返回分数.
hbase0.94java源代码 希望对大家有帮助
VC代码 hbase1.0 (实用代码源).rarVC代码 hbase1.0 (实用代码源).rarVC代码 hbase1.0 (实用代码源).rarVC代码 hbase1.0 (实用代码源).rarVC代码 hbase1.0 (实用代码源).rarVC代码 hbase1.0 (实用代码源).rarVC代码 ...
基于Hadoop的大数据编程,主要涉及HDFS,MapRedue,HBase+源代码+文档说明 -------- 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分...
hbase权威指南书中的源代码, hbase the definitive guide 源代码
Hbase权威指南 随书源代码 源码包 绝对完整版 maven工程,带pom文件,可以直接作为一个完整工程导入eclipse等ide。
hbase权威指南 源代码 英文
hbase源码,适合研究分析底层实现。对hbase的原理的理解很有好处
hbase 的java代码 集合 hbase 0.96
hbase操作必备客户端源代码
java操作Hbase之Hbase专用过滤器PageFilter的使用源代码,附带全部所需源代码,欢迎下载学习。
使用Java API连接虚拟机HBase并进行数据库操作,Java源代码
HBase研究 HBase数据库源代码学习研究(包括代码注释,文档,用于代码分析的测试用例)
HBase基本操作 增删改查 java代码 要使用须导入对应的jar包
本代码是java链接hbase数据库并对hbase进行增删改查操作的实例代码,包括批量操作
NULL 博文链接:https://xaocaotanghui.iteye.com/blog/2154210
│ Day15[Hbase 基本使用及存储设计].pdf │ ├─02_视频 │ Day1501_Hbase的介绍及其发展.mp4 │ Day1502_Hbase中的特殊概念.mp4 │ Day1503_Hbase与MYSQL的存储比较.mp4 │ Day1504_Hbase部署环境准备.mp4 │ Day...