HBase Flush操作流程以及对读写服务的影响
HBase的Flush操作的触发条件:
1)Manual调用,HRegionInterface#flushRegion,可以被用户态org.apache.hadoop.hbase.client.HBaseAdmin调用flush操作实现,该操作会直接触发HRegion的internalFlush。
2)HRegionServer的一次更新操作,使得整个内存使用超过警戒线。警戒线是globalMemStoreLimit, RS_JVM_HEAPSIZE * conf.getFloat(“hbase.regionserver.global.memstore.upperLimit”),凡是超过这个值的情况,会直接触发FlushThread,从全局的HRegion中选择一个,将其MemStore刷入hdfs,从而保证rs全局的memstore容量在可控的范围。
RS上HRegion的选择算法:
步骤1:RS上的Region,按照其MemStore的容量进行排序。
步骤2:选出Region下的Store中的StoreFile的个数未达到hbase.hstore.blockingStoreFiles,并且MemStore使用最多的Region。— bestFlushableRegion
步骤3:选出Region下的MemStore使用最多的Region。— bestAnyRegion
步骤4:如果bestAnyRegion的memstore使用量超出了bestFlushableRegion的两倍,这从另外一个角度说明,虽然当前bestAnyRegion有超过blockingStoreFiles个数的文件,但是考虑到RS内存的压力,冒着被执行Compaction的风险,也选择这个Region,因为收益大。否则,直接使用bestFlushableRegion。
指定的Region写入hdfs的过程:
步骤1:获得updatesLock的写锁,阻塞所有对于该Region的更新操作。由此,可知Flush操作会阻塞Region区域内Row的更新操作(Put、Delete、Increment),因为在阻塞更新操作期间,涉及到Memstore的snapshot操作,如果不做限制,那么很可能一个put操作的多个KV,分别落在kvset和snapshot当中,从而与hbase保证row的原子性相悖。
步骤2:mvcc推进一次写操作事务。每个Region维护了一个mvcc对象(Multi Version
Consistency Control),用来控制读写操作的事务性。
步骤3:从HLog中获取一个新的newSeqNum,更新HLog的lastSeqWritten。由于此时该Region的更新操作会暂停,因此,会暂时删除lastSeqWritten记录的<RegionName,lastSeqNum>,写入<”snp”+RegionName, newSeqNum>到lastSeqWritten中。这里的lastSeqWritten是HLog用来存储每个Regiond到当前时刻最后一次提交操作的SeqNum。
步骤4:为Region下的每个Store的MemStore执行snapshot操作。
如上图所示,HRegion上Store的个数是由Table中ColumnFamily的个数确定,每个Store是由一个MemStore和数个StoreFile(HFile)文件组成,在正常的更新操作过程中,更新的内容会写入MemStore里的kvset结构中。HRegion执行Flush操作,实际上是把MemStore的内容全部刷入hdfs的过程。虽然,目前更新操作已经通过加写锁阻塞,可是读操作仍然可以继续,因此,在memstore执行snapshot的过程中,通过reference,snapshot会指向kvset,然后给kvset指向一个全新的内存区域。代码如下:
步骤5:释放updatesLock的写锁,此时该HRegion可以接收更新操作。
步骤6:更新mvcc读版本到当前写版本号。
这里有一个小插曲,在更新操作时,mvcc. completeMemstoreInsert 的操作在updatesLock的范围之外,这样在多线程高并发情况下,就存在已经写入MemStore的kvset当中,但是事务还未完成提交的情况。该场景相关代码如下:
从4358行,我们可以清晰看到,通过updatesLock保证了更新操作写入了MemStore的kvset,但假定Flush线程在其它更新线程4363行之后,获得了updatesLock写锁,并执行了snapshot操作。那么,这里的mvcc就会出现读写的事务号不一致的情况,因此,在Region的Flush线程就需要使用waitForRead(w),等待更新到目前写版本号。
步骤7:将Store内的snapshot写成一个StoreFile临时文件。
步骤8:重命名storefile文件,更新Store里文件和Memstore状态。
在步骤8完成之前,整个Hregion的读请求,是和之前没有影响的。因为在读请求过程中,StoreScanner对于kvset和snapshot进行进行同步读取,即使kvset切换成snapshot,scan的操作仍然可以继续,这部分的内容是由MemStoreScanner来控制。
在读过程中,Store里的scanner有两部份,一个是StoreFileScanner,另外一个是MemStoreScanner,它们都继承了KeyValueScanner接口,并通过StoreScanner中的KeyValueHeap封装起来。于此类似,在RegionScannerImpl也是通过一个KeyValueHeap把每个Store的StoreScanner封装起来,从而直接提供对外的服务。
读到这里,可能细心的工程师们,就会有一个疑问:Flush操作对于读的影响究竟有没有呢?
有影响,但比较小。在步骤8以前那些阶段,MemStoreScanner做到了对于kvset与snapshot的自由切换。
如上所示,如果kvset被重置,那么theNext将不再等于kvsetNextRow,从而切换成开始从snapshot迭代器中获取数据。
因此,在步骤1~7之间,对于读服务影响不大。但是在步骤8操作最后一步时,需要把生成storefile更新到可用的Store中的StoreFile列表,并清除snapshot的内容。
于是,此时ChangedReaderOberver就开始起作用了。
// Tell listeners of the change in readers.
notifyChangedReadersObservers();
这里最为关键的是,将storescanner用来封装全部StoreFileScanner和MemStoreScanner的heap清空,它会触犯的作用是在执行next()操作时,会触发resetScannerStack操作,会重新加载Store下的所有Scanner,并执行seek到最后一次更新的key。这个过程会使得flush操作对于某些next操作变得突然顿一下。
From Binospace, post HBase Flush操作流程以及对读写服务的影响
文章的脚注信息由WordPress的wp-posturl插件自动生成
相关推荐
而Spring Data Hadoop是Spring框架的一部分,它提供了与Hadoop生态系统集成的工具,包括对HBase的操作支持。本篇文章将详细讲解如何利用Spring Data Hadoop中的HbaseTemplate来操作HBase。 首先,我们需要理解...
本人原创, 1.Hbase连接需要改Hbase包中的两个配置文件,加上Hbase所在机器ip及端口 2.HBaseDMLT初始化环境 3.MapDataIni为建表 4.MapDataInsert为写数据 5.MapDataDelete为删除数据 6.MapDataRead为读数据
根据提供的文件信息,本文将详细介绍HBase的Shell操作及其应用场景,包括如何创建表、插入数据、查询数据等关键操作。 ### HBase Shell简介 HBase Shell是HBase提供的一种交互式命令行工具,用于执行HBase操作。它...
实验的目标是让你理解HBase在Hadoop架构中的地位,以及掌握通过Shell命令和Java API进行基本操作的方法。 首先,让我们来看看实验的平台配置。实验要求的操作系统是Linux,这通常是大数据处理的首选平台,因为它...
HBASE 赋权操作是指对 HBASE 系统中的用户和资源进行权限管理和控制的操作。该操作通常结合 KERBEROS 进行身份认证和授权,以确保 HBASE 系统中的数据安全。 一、Kerberos 操作 在 HBASE 赋权操作中,首先需要在 ...
在HBase中更新数据与插入数据使用相同的`put`命令,因为HBase对每个单元格的操作都是覆写的。当你使用`put`命令时,如果列已存在,其值将被新的值替换。 7. 删除数据 删除数据包括删除整行和删除单列。删除一行使用...
HBase基本操作 增删改查 java代码 要使用须导入对应的jar包
在使用 HBase 时,用户需要熟悉 HBase Shell 命令行工具或者 HBase 提供的 Java API 来进行数据的读写操作。HBase Shell 提供了一个交互式的界面,允许用户执行数据操作、管理表结构、以及维护集群状态等。Java API ...
HBase具体操作指令 HBase是一个基于Hadoop的分布式Nosql数据库,提供了多种操作指令来管理和维护数据库。下面将对HBase shell commands进行分类和详细解释。 一、General HBase shell commands 1. status:显示...
在本文中,我们将详细讲解Hbase的安装过程以及基本操作,特别针对在Linux环境下使用清华大学镜像进行下载的情况。Hbase是一个分布式的、面向列的数据库,常用于大数据存储,是Apache Hadoop生态系统的一部分。以下是...
与传统关系型数据库不同,HBase是分布式存储的,且不使用SQL进行数据操作,它的设计目标是横向扩展并且支持大数据量的实时读写。HBase使用Hadoop的HDFS作为其文件存储系统,能够容忍节点故障,并自动进行数据复制以...
Java 操作 Hbase 进行建表、删表以及对数据进行增删改查 一、Hbase 简介 Hbase 是一个开源的、分布式的、基于 column-family 的 NoSQL 数据库。它是基于 Hadoop 的,使用 HDFS 作为其存储层。Hbase 提供了高性能、...
【大数据技术原理及应用实验3:熟悉常用的HBase操作】 HBase是一种分布式、列式存储的NoSQL数据库,它是构建在Hadoop文件系统(HDFS)之上的,用于处理大规模数据集的应用。在Hadoop生态体系中,HBase提供实时读写...
Zookeeper用于协调HBase集群的状态,保证服务的高可用性。 总之,"hbase的操作数据demo"这个压缩包可能包含了一些实用的脚本或代码示例,用于演示HBase的基本操作,包括查询、获取和删除数据。通过学习这些示例,...
- **MapReduce集成**:HBase支持MapReduce任务直接对存储在HBase中的数据进行处理,这大大简化了数据处理流程,提高了效率。 #### 四、HBase的关键特性 - **可扩展性**:HBase能够轻松地扩展到数百甚至数千台服务器...
本文将深入探讨HBase的安装过程以及基本使用方法,旨在帮助初学者快速上手。 **一、HBase简介** HBase是Google Bigtable的开源实现,它在Hadoop文件系统(HDFS)之上构建,提供了高度可扩展性和实时读写能力。HBase...
HBase的设计目标是对超大型表进行随机、实时读写操作。而HDFS则是Hadoop的核心组件,作为一个分布式文件系统,它能够跨多台服务器存储和处理大量数据。 在Java中操作HBase,我们需要使用HBase的Java客户端API。首先...
下面将详细介绍如何使用Spark及pyspark进行HBase数据的读写,以及HBase的安装配置。 首先,要进行HBase的安装与配置。这通常包括以下几个步骤: 1. 将HBase安装包上传到服务器(如Ubuntu)上,并解压缩。将其移动...
HBase的核心特性包括强一致性、高可扩展性以及实时读写能力,使得它在大数据领域扮演着重要的角色。 《HBase企业应用开发实战》主要面向实际应用开发人员,提供了大量实际案例和解决方案,帮助读者了解如何在企业...
通过上述步骤,我们可以使用C#语言通过Thrift2接口实现对Hbase数据库的全面操作。这个项目中的代码文件`C# thrift2ToHbase`应该包含了实现这些功能的具体代码示例,可以帮助我们深入理解这一过程。学习并实践这个...