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的核心概念、架构以及如何通过源代码学习进行深入探讨。 HBase,作为Apache Hadoop生态系统的一部分,是一个基于列族的分布式数据库,特别适合处理海量结构化数据。它的设计目标是在廉价...
《HBase权威指南》是一本深入探讨分布式大数据存储系统HBase的专业书籍,其源代码的提供为读者提供了更直观的学习材料。HBase是基于Apache Hadoop的非关系型数据库(NoSQL),它在大规模数据存储方面表现卓越,尤其...
通过阅读和理解这段代码,可以深入学习如何在实际项目中将HDFS数据导入HBase,这对于大数据平台的开发和运维人员来说是非常有价值的实践。 总的来说,将HDFS上的文件导入HBase是一个涉及数据处理、数据库设计和编程...
这个源代码包是针对Java开发者的宝贵资源,可以帮助他们深入理解HBase的内部工作原理,优化自己的应用,以及对HBase进行定制化开发。 HBase的核心概念包括: 1. 表(Table):HBase的数据存储在表中,每个表由行键...
VC代码 hbase1.0 (实用代码源).rarVC代码 hbase1.0 (实用代码源).rarVC代码 hbase1.0 (实用代码源).rarVC代码 hbase1.0 (实用代码源).rarVC代码 hbase1.0 (实用代码源).rarVC代码 hbase1.0 (实用代码源).rarVC代码 ...
《深入剖析HBase源代码:hbase-0.98.23》 HBase,作为Apache的一个开源项目,是构建在Hadoop之上的分布式、版本化、列族式的NoSQL数据库,它提供了高可靠性、高性能、可伸缩的数据存储解决方案。本文将基于hbase-...
基于Hadoop的大数据编程,主要涉及HDFS,MapRedue,HBase+源代码+文档说明 -------- 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分...
通过阅读《HBase权威指南》并结合源代码,开发者能够更好地掌握HBase的核心概念和技术,从而在实际项目中有效地运用HBase解决大数据问题。这些源代码实例对于学习HBase的开发、调试和运维都具有很高的参考价值。
Hbase权威指南 随书源代码 源码包 绝对完整版 maven工程,带pom文件,可以直接作为一个完整工程导入eclipse等ide。
“HBase MR样例代码”则指的是使用Hadoop的MapReduce框架来操作HBase,HBase是一个基于Google的Bigtable论文设计的开源NoSQL数据库,运行在Hadoop之上。HBase提供高吞吐量的数据读写能力,适合存储非结构化和半结构...
通过阅读《HBase 权威指南》的源代码,开发者不仅可以理解HBase的设计理念,还能学习到如何利用HBase解决实际问题,提升大数据处理的能力。无论是初学者还是经验丰富的开发者,这本书都将是提升HBase技能的宝贵资源...
hbase操作必备客户端源代码
1. **连接HBase**:在Java代码中,我们使用`HBaseConfiguration.create()`来创建一个配置对象,然后可以设置各种配置参数,如Zookeeper的地址(`HBASE_ZOOKEEPER_QUORUM`),端口(`HBASE_ZOOKEEPER_CLIENT_PORT`)...
关于压缩包内的子文件,"hbase-2.0.0-alpha3"可能指的是HBase的源代码或者二进制发行版。如果是源代码,开发者可以深入理解HBase的工作原理,甚至对其进行定制或贡献代码。如果是二进制发行版,用户可以直接编译安装...
在Java中操作HBase数据库时,我们经常需要对大量数据进行高效的检索和处理。...提供的源代码应该包含如何创建、应用PageFilter以及处理扫描结果的完整示例,这对于学习和实践HBase的分页查询非常有帮助。
本资源"**HBase-Research**"提供了对HBase数据库源代码的深入学习材料,包括代码注释、相关文档以及用于代码分析的测试用例,这对于理解HBase的工作原理、优化其性能以及进行二次开发非常有帮助。 **HBase的基本...
本示例代码主要展示了如何使用Java API连接HBase数据库,并执行基本的CRUD(创建、读取、更新、删除)操作,同时也包括了批量操作的支持。下面我们将详细探讨这些知识点。 首先,连接HBase需要引入HBase的客户端库...
HBase基本操作 增删改查 java代码 要使用须导入对应的jar包
【标签】"源码"提示我们,博主可能在笔记中深入到了HBase的源代码层面,分析了HBase的内部工作原理,比如RegionServer如何处理数据分布,HMaster的角色,以及HBase如何通过Zookeeper实现集群管理。"工具"则可能意味...