每一个Regionserver中都有一个HLog,一般情况下除非设置了SETWAL(false)否则对hbase的写操作在put到内存之前会append到log中以防止机器down 掉造成的数据丢失。
首先来看RS启动后对HLog的处理
private HLog setupWALAndReplication() throws IOException {
final Path oldLogDir = new Path(rootDir, HConstants.HREGION_OLDLOGDIR_NAME);
Path logdir = new Path(rootDir, HLog.getHLogDirectoryName(this.serverInfo));
if (this.fs.exists(logdir)) {// 若hbase/.logs存在则表明在该台机器上已经有regionserver启动了
throw new RegionServerRunningException("Region server already "
+ "running at " + this.serverInfo.getServerName()
+ " because logdir " + logdir.toString() + " exists");
}
.....
return instantiateHLog(logdir, oldLogDir);
}
看看instantiateHLog(logdir, oldLogDir);省略一些不重要的步骤,主要的步骤如下
if (!fs.mkdirs(dir)) { //创建.log目录下该regionserver目录,即为/hbase/.log/regionserver
throw new IOException("Unable to mkdir " + dir);
}
this.oldLogDir = oldLogDir;
if (!fs.exists(oldLogDir)) {//若/habse/.oldlogs目录不存在则创建之
if (!fs.mkdirs(this.oldLogDir)) {
throw new IOException("Unable to mkdir " + this.oldLogDir);
}
}
rollWriter();
rollWriter()函数主要完成以下功能:
1.新建一个 /regionserver目录下的文件
2.把旧文件移到/.oldlogs目录下
3.返回需要进行flush的regions
那么什么是旧文件呢?
hbase认为,如果一个文件的所有数据都已经刷到磁盘上了,该文件认为是旧文件,可以将其移除。如何判断一个文件的所有数据刷到磁盘了,用到的就是一个AtomicLong变量 seqnum来判定,这是一个递增的Long并且线程安全。一个文件的seqnum就是该文件最后写入entry的seqnum。
hbase默认一个小时会新建一个文件,并且会清除原先的旧文件。
a) Hlog维护一个ConcurrentSkipListMap<byte [], Long> lastSeqWritten的map其中byte是region的ecodedname,Long是每个entry写入Hlog的seqNum,当有新的entry写入Hlog 是putifabsent,而当memstore中的数据flush结束以后该map就会清除该region。因此该map维护的是最旧写入Hlog的entry的regionname和seqnum映射;
b) Hlog同时维护一个SortedMap<Long, Path> outputfiles,其中Path表示的是regionserver下的path,而Long指的是该Path的seqnum及path要关闭时此时的seqNum。
rollWriter()函数首先会创建一个新的文件,然后把原先的文件加入到outputfiles Map中,如果此时lastSeqWritten为空则说明当前所有的region都已经flush结束了,故可以把所有的outputfiles删除掉
否则需要选取合适的outputfiles进行删除,选取的是outputfiles中最老的且比lastSeqWritten中所有的value都小的path进行rename到oldlogs中。在整个过程中对该Hlog上锁防止在cleanoldlog是进行cacheflush
举个例子说明一下:
比如现在该rs下有4个文件,储存的是4个region的信息:
file1: RegionA,4表示的是文件名是file1,其中存储了一个entry其regionname是reginA,其seqNum是4,seqnum是递增的且新建的文件的seq比原先的大
file1: RegionA,4 RegionB,5 RegionC,6 RegionD,7
file2: RegionA,8 RegionB,9 RegionC,10
file3: RegionA,11 RegionB,12 RegionD,13
file4: RegionB,14
如上面所示,假设上面4个文件都存在,且假设此时lastSeqWritten 中存储的是RegionB,14
因为lastSeqWritten储存的是最新加入的entries且并没有被flush,这说明Region A,C,D都已经flush结束的,而file1,2,3,由于其seqnum都小于14,认为这些file都已经flush成功了,可以移除了,因为A,C,D都已经flush成功,而如果1,2,3中的Region B未flush那么此时lastSeqWritten存储的肯定不是14了而是小于十四的未flush的seq
分享到:
相关推荐
log4j.appender.RFAS.File=${hbase.log.dir}/${hbase.security.log.file} log4j.appender.RFAS.MaxFileSize=${hbase.security.log.maxfilesize} log4j.appender.RFAS.MaxBackupIndex=${hbase.security.log....
在Java开发中,日志记录是不可或缺的一部分,而Log4j作为一款广泛使用的日志框架,以其强大的功能和灵活性深受开发者喜爱。本篇文章将详细探讨一个感觉还不错的Log4j配置文件,旨在帮助读者深入理解其工作原理和配置...
5. 版本(Version):HBase中每个数据项都有一个时间戳,表示该数据的版本,可用于历史数据的管理。 四、总结HBase整体特点: HBase的主要特点包括: 1. 面向列的存储:易于存储结构化和非结构化数据,提高读写...
#### 一、log4j简介 log4j是Apache的一个开源项目,用于实现日志功能。它提供了一种简单的方式来管理和配置应用程序的日志输出,支持多种输出目的地(如控制台、文件等)以及多种格式化方式。log4j的一个关键特性是...
HBase是Apache软件基金会开发的一个开源、分布式、版本化、基于列族的NoSQL数据库,设计用于处理海量数据。在2.5.6这个版本中,HBase继续提供高性能、高可靠性以及可扩展性的特性,使得它成为大数据存储的理想选择。...
HBase是一种分布式的、面向列的数据库管理系统,它利用Hadoop HDFS作为其文件存储系统,使用Hadoop MapReduce来处理HBase中的海量数据,并且使用Zookeeper作为其协同服务。HBase以表的形式存储数据,表由行和列组成...
HBase是一个基于Hadoop的分布式Nosql数据库,提供了多种操作指令来管理和维护数据库。下面将对HBase shell commands进行分类和详细解释。 一、General HBase shell commands 1. status:显示集群状态,支持三种...
HBase是一个分布式、版本化的NoSQL数据库,构建在Hadoop文件系统(HDFS)之上,利用Hadoop的计算框架MapReduce进行批量处理。因此,连接HBase不仅需要HBase的相关jar包,还需要Hadoop的核心库。 以下是你需要导入的...
export HBASE_LOG_DIR=/home/wangkang/hbase-1.3.5/log ``` 接下来,还需要编辑`hbase-site.xml`文件,添加以下配置项: ```xml <name>hbase.rootdir <value>hdfs://master:9000/hbase <name>hbase....
HBase作为一个基于Hadoop文件系统的分布式列式存储数据库,其设计目标是处理大规模的数据并提供亚秒级的访问速度。为了在Java环境中顺利地操作HBase,开发者需要引入一系列的依赖库,这些库包含了与HBase通信所需的...
2. **Region管理**:HBase将表划分为多个Region,每个Region包含一定范围的行键,这有助于数据的分布和并行处理。 3. **RegionServer与Master**:RegionServer负责读写操作,而Master负责Region的分配和负载均衡,...
1. `HRegionServer`:负责处理客户端请求,管理一部分Region。 2. `Master`:HBase集群的主节点,负责Region的分配和平衡、监控RegionServer状态、处理表和Region的管理操作。 3. ZooKeeper:协调HBase集群,存储元...
- **HLog (HBase Log)**: 记录每次修改操作的日志文件,保证数据的一致性。 - **后台进程**: 包括Compaction、Split等,用于优化存储结构、提升性能。 #### 四、客户端访问HBase - **本地Java客户端**: 提供了直接...
1. **HRegionServer**:这是HBase集群中最基本的数据承载单元,每个HRegionServer负责管理一部分Region。Region是HBase表中的一种逻辑划分,每个Region包含一定数量的列族(Column Family)。 2. **HRegion**:它是...
HBase是Apache软件基金会开发的一个开源、分布式、版本化、基于列族的NoSQL数据库,设计用于处理海量数据。在大型分布式系统中,HBase提供实时读写访问,且能够支持PB级别的数据存储。"hbase-1.1.5-bin.tar"是一个...
这些库通常包括HBase自身的API,Zookeeper客户端用于协调集群,Hadoop的相关库用于与HDFS交互,以及其他的依赖,如protobuf用于序列化和反序列化,Guava提供实用工具类,SLF4J和Log4j用于日志记录等。 在实际使用中...
- HLog:HBase通过维护WAL(Write Ahead Log)来防止MemStore中的数据丢失,确保即使在系统崩溃的情况下也能恢复数据。 10. **HBase的主要操作** - Get:获取特定rowkey的数据。 - Put:插入或更新数据。 - ...
在进行HBase开发时,依赖包的选择和管理是至关重要的,因为它们提供了必要的功能和库,使得我们能够有效地与HBase交互。以下是标题和描述中提及的一些关键知识点: 1. **HBase**: HBase是一个开源的、分布式的、...
尚硅谷大数据技术之 HBase HBase 是一种基于 Hadoop 的分布式、面向列的 NoSQL 数据库,主要用于存储和...HBase 是一种强大的分布式数据库管理系统,具有很多特征和优势,非常适合处理大规模结构化和非结构化数据。
在HBase的架构中,HLog(Write-Ahead Log)扮演着至关重要的角色。HLog是一个持久化的日志,用于确保数据的一致性和可靠性。当客户端向RegionServer提交更新操作时,HLog会记录这些操作,确保即使在RegionServer故障...