`
punishzhou
  • 浏览: 142676 次
社区版块
存档分类
最新评论

Hbase的log管理(一)

阅读更多

每一个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

 

 

分享到:
评论

相关推荐

    HBase开启审计日志

    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....

    一个Log4j配置文件,感觉还不错

    在Java开发中,日志记录是不可或缺的一部分,而Log4j作为一款广泛使用的日志框架,以其强大的功能和灵活性深受开发者喜爱。本篇文章将详细探讨一个感觉还不错的Log4j配置文件,旨在帮助读者深入理解其工作原理和配置...

    搭建HBase完全分布式数据库

    5. 版本(Version):HBase中每个数据项都有一个时间戳,表示该数据的版本,可用于历史数据的管理。 四、总结HBase整体特点: HBase的主要特点包括: 1. 面向列的存储:易于存储结构化和非结构化数据,提高读写...

    log4j.properties配置详解 使用教程

    #### 一、log4j简介 log4j是Apache的一个开源项目,用于实现日志功能。它提供了一种简单的方式来管理和配置应用程序的日志输出,支持多种输出目的地(如控制台、文件等)以及多种格式化方式。log4j的一个关键特性是...

    hbase2.5.6最新版本下载

    HBase是Apache软件基金会开发的一个开源、分布式、版本化、基于列族的NoSQL数据库,设计用于处理海量数据。在2.5.6这个版本中,HBase继续提供高性能、高可靠性以及可扩展性的特性,使得它成为大数据存储的理想选择。...

    【HBase企业应用开发】工作中自己总结的Hbase文档,非常全面!

    HBase是一种分布式的、面向列的数据库管理系统,它利用Hadoop HDFS作为其文件存储系统,使用Hadoop MapReduce来处理HBase中的海量数据,并且使用Zookeeper作为其协同服务。HBase以表的形式存储数据,表由行和列组成...

    HBASE具体操作指令

    HBase是一个基于Hadoop的分布式Nosql数据库,提供了多种操作指令来管理和维护数据库。下面将对HBase shell commands进行分类和详细解释。 一、General HBase shell commands 1. status:显示集群状态,支持三种...

    eclipse链接hbase所需jar包,hbase版本1.2.6,Hadoop版本2.7.1

    HBase是一个分布式、版本化的NoSQL数据库,构建在Hadoop文件系统(HDFS)之上,利用Hadoop的计算框架MapReduce进行批量处理。因此,连接HBase不仅需要HBase的相关jar包,还需要Hadoop的核心库。 以下是你需要导入的...

    3.基于hadoop集群搭建hbase

    export HBASE_LOG_DIR=/home/wangkang/hbase-1.3.5/log ``` 接下来,还需要编辑`hbase-site.xml`文件,添加以下配置项: ```xml &lt;name&gt;hbase.rootdir &lt;value&gt;hdfs://master:9000/hbase &lt;name&gt;hbase....

    java访问hbase所需的jar包

    HBase作为一个基于Hadoop文件系统的分布式列式存储数据库,其设计目标是处理大规模的数据并提供亚秒级的访问速度。为了在Java环境中顺利地操作HBase,开发者需要引入一系列的依赖库,这些库包含了与HBase通信所需的...

    HBase入门与使用

    2. **Region管理**:HBase将表划分为多个Region,每个Region包含一定范围的行键,这有助于数据的分布和并行处理。 3. **RegionServer与Master**:RegionServer负责读写操作,而Master负责Region的分配和负载均衡,...

    hbase-0.94.13 jar和源码

    1. `HRegionServer`:负责处理客户端请求,管理一部分Region。 2. `Master`:HBase集群的主节点,负责Region的分配和平衡、监控RegionServer状态、处理表和Region的管理操作。 3. ZooKeeper:协调HBase集群,存储元...

    HBASE编程指南word版

    - **HLog (HBase Log)**: 记录每次修改操作的日志文件,保证数据的一致性。 - **后台进程**: 包括Compaction、Split等,用于优化存储结构、提升性能。 #### 四、客户端访问HBase - **本地Java客户端**: 提供了直接...

    HBASE基础应用的介绍

    1. **HRegionServer**:这是HBase集群中最基本的数据承载单元,每个HRegionServer负责管理一部分Region。Region是HBase表中的一种逻辑划分,每个Region包含一定数量的列族(Column Family)。 2. **HRegion**:它是...

    hbase-1.1.5-bin.tar

    HBase是Apache软件基金会开发的一个开源、分布式、版本化、基于列族的NoSQL数据库,设计用于处理海量数据。在大型分布式系统中,HBase提供实时读写访问,且能够支持PB级别的数据存储。"hbase-1.1.5-bin.tar"是一个...

    hbase-client_lib.rar

    这些库通常包括HBase自身的API,Zookeeper客户端用于协调集群,Hadoop的相关库用于与HDFS交互,以及其他的依赖,如protobuf用于序列化和反序列化,Guava提供实用工具类,SLF4J和Log4j用于日志记录等。 在实际使用中...

    大数据HBASE考题材料

    - HLog:HBase通过维护WAL(Write Ahead Log)来防止MemStore中的数据丢失,确保即使在系统崩溃的情况下也能恢复数据。 10. **HBase的主要操作** - Get:获取特定rowkey的数据。 - Put:插入或更新数据。 - ...

    hbase开发依赖包

    在进行HBase开发时,依赖包的选择和管理是至关重要的,因为它们提供了必要的功能和库,使得我们能够有效地与HBase交互。以下是标题和描述中提及的一些关键知识点: 1. **HBase**: HBase是一个开源的、分布式的、...

    尚硅谷大数据技术之HBase.docx

    尚硅谷大数据技术之 HBase HBase 是一种基于 Hadoop 的分布式、面向列的 NoSQL 数据库,主要用于存储和...HBase 是一种强大的分布式数据库管理系统,具有很多特征和优势,非常适合处理大规模结构化和非结构化数据。

    深入学习hbase原理资料整理

    在HBase的架构中,HLog(Write-Ahead Log)扮演着至关重要的角色。HLog是一个持久化的日志,用于确保数据的一致性和可靠性。当客户端向RegionServer提交更新操作时,HLog会记录这些操作,确保即使在RegionServer故障...

Global site tag (gtag.js) - Google Analytics