HBase读写路径的工作机制

HBase 写路径工作机制

在HBase 中无论是增加新行还是修改已有的行,其内部流程都是相同的。HBase
接到命令后存下变化信息,或者写入失败抛出异常。默认情况下,执行写入时会写到两个地方:预写式日志(write-ahead
log,也称HLog)和MemStore。HBase
的默认方式是把写入动作记录在这两个地方,以保证数据持久化。只有当这两个地方的变化信息都写入并确认后,才认为写动作完成。

MemStore 是内存里的写入缓冲区,HBase 中数据在永久写入硬盘之前在这里累积。当MemStore
填满后,其中的数据会刷写到硬盘,生成一个HFile。HFile 是HBase 使用的底层存储格式。HFile
对应于列族,一个列族可以有多个HFile,但一个HFile 不能存储多个列族的数据。在集群的每个节点上,每个列族有一个MemStore。

大型分布式系统中硬件故障很常见,HBase
也不例外。设想一下,如果MemStore还没有刷写,服务器就崩溃了,内存中没有写入硬盘的数据就会丢失。HBase
的应对办法是在写动作完成之前先写入WAL。HBase 集群中每台服务器维护一个WAL 来记录发生的变化。WAL
是底层文件系统上的一个文件。直到WAL 新记录成功写入后,写动作才被认为成功完成。这可以保证HBase
和支撑它的文件系统满足持久性。大多数情况下,HBase 使用Hadoop 分布式文件系统(HDFS)来作为底层文件系统。

如果HBase 服务器宕机,没有从MemStore 里刷写到HFile 的数据将可以通过回放WAL 来恢复。你不需要手工执行。Hbase
的内部机制中有恢复流程部分来处理。每台HBase 服务器有一个WAL,这台服务器上的所有表(和它们的列族)共享这个WAL。

写操作会写入WAL和内存写缓冲区MemStore,客户端在写的过程中不与底层的HFile直接交互

当MemStore写满时,会刷写到硬盘,生成一个新的HFile

你可能想到,写入时跳过WAL 应该会提升写性能。但我们不建议禁用WAL,除非你愿意在出问题时丢失数据。如果你想测试一下,如下代码可以禁用WAL:

Put p = new Put();
p.setWriteToWAL(false);

注意:不写入WAL 会在RegionServer 故障时增加丢失数据的风险。关闭WAL,出现故障时HBase 可能无法恢复数据,没有刷写到硬盘的所有写入数据都会丢失。

HBase 读路径工作机制

如果你想快速访问数据,通用的原则是数据保持有序并尽可能保存在内存里。HBase实现了这两个目标,大多情况下读操作可以做到毫秒级。HBase
读动作必须重新衔接持久化到硬盘上的HFile 和内存中MemStore 里的数据。HBase
在读操作上使用了LRU(最近最少使用算法)缓存技术。这种缓存也叫做BlockCache,和MemStore 在一个JVM
堆里。BlockCache 设计用来保存从HFile 里读入内存的频繁访问的数据,避免硬盘读。每个列族都有自己的BlockCache。

掌握BlockCache 是优化HBase 性能的一个重要部分。BlockCache 中的Block
是HBase从硬盘完成一次读取的数据单位。HFile 物理存放形式是一个Block 的序列外加这些Block的索引。这意味着,从HBase
里读取一个Block 需要先在索引上查找一次该Block 然后从硬盘读出。Block
是建立索引的最小数据单位,也是从硬盘读取的最小数据单位。Block大小按照列族设定,默认值是64
KB。根据使用场景你可能会调大或者调小该值。如果主要用于随机查询,你可能需要细粒度的Block 索引,小一点儿的Block
更好一些。Block变小会导致索引变大,进而消耗更多内存。如果你经常执行顺序扫描,一次读取多个Block,大一点儿的Block
更好一些。Block 变大意味着索引项变少,索引变小,因此节省内存。

从HBase 中读出一行,首先会检查MemStore 等待修改的队列,然后检查BlockCache看包含该行的Block 是否最近被访问过,最后访问硬盘上的对应HFile。HBase 内部做了很多事情,这里只是简单概括。读路径如图所示

注意,HFile 存放某个时刻MemStore 刷写时的快照。一个完整行的数据可能存放在多个HFile 里。为了读出完整行,HBase 可能需要读取包含该行信息的所有HFile。

时间: 2024-12-06 02:51:43

HBase读写路径的工作机制的相关文章

HBase学习总结(3):HBase的数据模型及工作机制

一.HBase数据模型 HBase模式里的逻辑实体包括: (1)表(table):HBase用表来组织数据.表名是字符串(String),由可以在文件系统路径里使用的字符组成. (2)行(row):在表里,数据按行存储.行由行键(rowkey)唯一标识.行键没有数据类型,总是视为字节数组byte []. (3)列族(column family):行里的数据按照列族分组,列族也影响到HBase数据的物理存放,因此,它们必须事前定义并且不轻易修改.表中每行拥有相同列族,尽管行不需要在每个列族里存储数

Hadoop读写文件时内部工作机制是怎样的?

读文件 &http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; 读文件时内部工作机制参看下图: 客户端通过调用FileSystem对象(对应于HDFS文件系统,调用DistributedFileSystem对象)的open()方法来打开文件(也即图中的第一步),DistributedFileSystem通过RPC(Remote Procedure Call)调用询问NameNode来得到此文件最开始几个block的文件位

深刻理解HDFS工作机制

深入理解一个技术的工作机制是灵活运用和快速解决问题的根本方法,也是唯一途径.对于HDFS来说除了要明白它的应用场景和用法以及通用分布式架构之外更重要的是理解关键步骤的原理和实现细节.本篇博文首先对HDFS的重要特性和使用场景做一个简要说明,之后对HDFS的数据读写.元数据管理以及NameNode.SecondaryNamenode的工作机制进行深入分析.过程中也会对一些配置参数做一个说明. 一.HDFS的重要特性 First. HDFS是一个文件系统,用于存储和管理文件,通过统一的命名空间(类似

基于Jave的Web服务工作机制(7)

web|web服务 sendStaticResource 方法是非常简单的.它首先传递父路径和子路径给File类的构造器,从而对java.io.File类进行了实例化. File file = new File(HttpServer.WEB_ROOT, request.getUri()); 然后它检查文件是否存在.如果存在,sendStaticResource 方法通过传递File对象来构造一个java.io.FileInputStream对象.然后调用FileInputStream 的read

Struts中的Action类的工作机制

Struts中的Action类的工作机制  所有的Action类都是org.apache.struts.action.Action的子类.Action子类应该覆写父类的execute()方法.当ActionForm Bean被创建,并且表单验证顺利通过后,Struts框架就会调用Action类的execute()方法.execute()方法的定义如下:    public ActionForward execute(ActionMapping mapping                   

DotText源码学习——ASP.NET的工作机制

--本文是<项目驱动学习--DotText源码学习>系列的第一篇文章,在这之后会持续发表相关的文章. 概论 在阅读DotText源码之前,让我们首先了解一下ASP.NET的工作机制,可以使我们更好的理解.ASP.NET是Web服务器(IIS)的 ISAPI(Internet Server API)扩展.当IIS接收到客户端浏览器发来的请求后,它根据请求的文件类型确定由哪个ISAPI扩展来处理该请求,并将请求转发给ASP.NET(如 果是ASP.NET处理的相应文件类型的话,如*.aspx.*.

实用 | Apache Kudu读写路径

Kudu的体系架构已经具备了提供良好分析性能的能力,同时还能够接收插入和更新操作的连续流.为了使用户能够专注于其最关心的内容,Kudu提供了简单的API,而封装了后台的复杂性.但是一些高级用户希望了解内部部件,以理解Kudu如何能够快速分析快速数据,以及如何更好地利用其功能.本篇博文旨在向用户介绍向Kudu内写入数据以及从Kudu中读取数据时在其后台会发生什么.本篇博文假设读者对本文中所介绍的Kudu架构已经有一个基本的了解. 多版本并发控制(MVCC) 数据库使用并发控制方法确保用户始终看到一

深入浅出之Smarty模板引擎工作机制(二)

源代码下载地址:深入浅出之Smarty模板引擎工作机制 接下来根据以下的Smarty模板引擎原理流程图开发一个自己的模板引擎用于学习,以便加深理解.   Smarty模板引擎的原理,其实是这么一个过程: 把模板文件编译成php文件,然后每次都去读取下模板的修改时间,没有修改就不编译.然后include这个"编译"后的PHP文件. 所谓编译也就是模板用正则替换成含PHP代码的过程. 实际上并不会每次请求都编译,所以性能尚可.  模板文件和php程序文件经过模板引擎的编译后合成为一个文件,

NAMENODE工作机制,元数据管理(元数据存储机制、元数据手动查看)、元数据的checkpoint、元数据目录说明(来自学习资料)

NAMENODE工作机制 学习目标:理解namenode的工作机制尤其是元数据管理机制,以增强对HDFS工作原理的理解,及培养hadoop集群运营中"性能调优"."namenode"故障问题的分析解决能力   问题场景: 1.集群启动后,可以查看目录,但是上传文件时报错,打开web页面可看到namenode正处于safemode状态,怎么处理? 解释: safemode是namenode的一种状态(active/standby/safemode安全模式) namen