Hbase物理模型设计
Hbase的存储结构
1、Hbase宏观架构
从上图可以看hbase集群由一个master和多个RegionServer组成,右下角是一个RegionServer的内部图。
Hbase的服务器角色构成:
l Master:
负责启动的时候分配Region到具体的RegionServer,执行各种管理操作,比如Region的分割和合并。在hbase中的Master的角色功能比其他类型的集群弱很多。在hbase集群中,master几点宕机之后,业务系统仍旧可以正常运行。但是在其他类似Hadoop和MongoDB的主节点宕机之后,集群无法正常使用。
但是hbase的master也不能宕机太久,很多必要的操作,比如创建表,修改列族配置,一级分割和合并操作,都需要用到master节点。
l RegionServer
RegionServer上有一个或者多个Region,读写的数据就存储在Region上,如果你的Hbase是基于HDFS的,那么Region所有所有数据存取操作都调用了HDFS的客户端来实现的。
l Region
表的一部分数据,Hbase是一个会自动分片的数据库,一个Region就相当于关系数据库中的分区表的一个分区。
l HDFS
Hadoop的一部分。Hbase并不直接跟服务器的硬盘交互,而是和HDFS交互,所以HDFS是真正承载数据的载体。
l ZooKeeper
ZooKeeper索然是虽然是自成一家的第三方组件,不属于Hbase体系,但是他在hbase中的重要性甚至超过了Master。因为读写数据需要的元数据表hbase:meate的位置就存储在ZooKeeper上。
2、RegionServer内部结构
从上图可见,RegionServer内部结构包含:
l WAL
一个WAL:预写日志,是Write-Ahead Log的缩写。从名字可见用途,就是预先写入。当操作到达Region的时候,Hbase先将操作写入到WAL中。Hbase会先把数据放到基于内存实现的Memstore里,等数据到达一定数量时才刷写到最终存储Hfile内。如果这个过程中服务器宕机或者断电,数据就会丢失。WAL是一个保险机制,数在写到Memstore之前,已经被写到WAL。这样,当故障恢复是,可从WAL重恢复数据。
预写日志,就是用来涉及解决宕机之后的操作恢复问题的。数据到达Region的时候是先写入WAL,然后在被加载到Memstore的,就算Region的机器宕机之后,由于WAL的数据是存储在HDFS上的,所以数据并不会丢失。
2.1、Region
多个Region,region相当于一个数据分片,每一个Region都有开始rowkey和结束rowkey,代表了它所存储的rowkey的范围。
Region的内部结构:
一个Region包含:多个Store,每一个Region内部都包含有多个Store实例,一个Store对应一个列族的数据,如果一个表有两个列族,那么在一个Region里面就有两个Store。在最右边的单个Store的结构图上,可以看到Store内部有MemStore和HFile这两部分组成。
2.2、Store内部结构
在Store中有两个组成部分,
l MemStore:每个Store中有一个MemStore实例。数据写入WAL之后就会被放入MemStore。MemStore是内存的存储对象,只有当MemStore满了的时候才会将数据刷写到HFile中。
l HFile:在Store中有多和HFile。当MemStore满了之后Hbase会在HDFS上新生成一个新的Hfile,然后把MemStore中的内容写到这个Hfile中。Hfile直接和HDFS打交道,是数据的存储实体。
2.3、MemStore内部结构
数据被写入到WAL之后就会被加载到MemStore中去。MemStore的大小增加到超过一定阈值的时候就会被刷写到HDFS 上,以Hfile的形式被持久化起来。
MemStore涉及思想:
1)由于HDFS上的文件不可修改,为了让数据顺序存储从而提高读取效率,Hbase使用了LSM树结构来存储数据。数据会现在MemStore中整理成LSM树,最后在刷写到Hfile上。但是在读数据时,先读取BlockCache缓存,如果读不到,在读取HFILE+MemStore。
2)优化数据存储效率;如果一个数据被添加后马上就又被删除,这个在刷写时就可以直接不用刷写到HDFS了。Hbase是一个随机读写数据库,MemStore会在数据被最终刷写到HDFS上之前对文件进行排序处理,这样随机写入的数据就变成了顺序存储的顺序,可以提高读写效率,也可以实现Hbase的LSM树数据结构。
2.4、HFile内部结构
Hfile是数据存储的实际载体,我们所创建的表,列等数据都存储在Hfile里面,Hfile类似于Hadoop的Tfile。Hfile的结构图如下:
Hfile是由一个一个的块组成的,在Hbase中一个快的大小默认为64kb,有列族上的BLOCKSIZE属性定于。这些快区分不同的角色。
Data:数据块。每个HFile有多个Data块。我们存储在Hbase表中的数据就在数据块中。Data块其实是可选的,但是几乎很难看到不包含Date块的HFile。
Meta:元数据块。Meta也是可选的,Meta块只有在文件关闭的时候才会写入,Meta存储了该文件的元数据信息。
FileInfo:文件信息,其实也是一种数据存储快,FileInfo是HFile的必要组成部分。它只有在文件关闭的时候写入,存储的是这个文件的信息。比如最后一个Key。平均的key长度等。
DataIndex:存储Date块索引信息的块文件。索引的信息其实也就是Date块的偏移量。DateIndex也是可选的,有Daye块才有DateIndex.
Trailer:必选的,它存储了FileInfo,DateIndex,MetaIndex块的偏移量。
2.5、Data的内部结构
Data数据块的第一位存储的是块的类型,后面存储的是多个KeyValue键值对,也就是单元格(Cell)的实现类。Cell是一个接口,KeyValue是它的实现类。
2.6、KeyValue的结构
一个KeyValue类里面最后一个部分是存储数据的Value,而前面的部分都是存储跟该单元格相关的元数据信息。如果你存储的value很小,那么这个单元格的绝大部分空间就是rowkey,cf,column等的元数据。
采用适当的压缩算法可以极大的节省存储列族,列等信息的空间。
3、Hbase的增删改
Hbase的数据持久化基于HDFS,但是HDFS只能新增和删除,hbase却可以增删改查。实际上,真实的情况是,Hbase几乎总是在做新增操作。
当新增一个单元格的时候,Hbase会在HDFS上新增一条数据。
当修改一个单元格的时候,Hbase会在HDFS又新增一条数据,只是版本号比之前那个大。
当删除一个单元格的时候,Hbase还是会新增一条数据。只是这条数据没有value,类型为DELETE,这条数据较墓碑标记。
实际上在Hbase中真正的数据删除发生在Hfile合并的时候。
4、Hbase的模型结构图
其实就是
Hbase物理模型设计的更多相关文章
- Hbase物理存储
物理模型 每个column family存储在HDFS上的一个单独文件中,空值不会被保存. Key 和 Version number在每个column family中均有一份: HBase为每个值维护 ...
- HBase 物理视图
- HBase数据模型剖析
出处:http://wuyudong.com/1987.html HBase 进行数据建模的方式和你熟悉的关系型数据库有些不同.关系型数据库围绕表.列和数据类型——数据的形态使用严格的规则.遵守这些严 ...
- Hbase学习笔记01
最近做项目接触到了HDFS.mapreduce以及Hbase,有了实战机会,今天打算将这些知识好好总结下,以备不时之需.首先从Hbase开始吧. Hbase是建立在HDFS上的分布式数据库,下图是Hb ...
- 在powerdesigner中创建物理数据模型
物理数据模型(PDM)是以常用的DBMS(数据库管理系统)理论为基础,将CDM/LDM中所建立的现实世界模型生成相应的DBMS的SQL语言脚本.PDM叙述数据库的物理实现,是对真实数据库的描述 PDM ...
- Hbase随笔2
Hbase是建立在HDFS上的分布式数据库,下图是Hbase表的模型: Hbase这个数据库其实和传统关系数据库还是有很多类似之处,而不是像mongodb,memcached以及redis完全脱离了表 ...
- hbase概念解析
hbase是一种nosql数据库.是一个高可靠,高性能,面向列,可伸缩,实时读取的分布式数据库. hbase一般由行键,时间戳,列族,列,表格单元,行组成. 行一般由一个行键和一个或多个具有关联关系值 ...
- HBase详细概述
原文地址:https://blog.csdn.net/u010270403/article/details/51648462 本文首先简单介绍了HBase,然后重点讲述了HBase的高并发和实时处理数 ...
- Hbase记录-Hbase介绍
Hbase是什么 HBase是一种构建在HDFS之上的分布式.面向列的存储系统,适用于实时读写.随机访问超大规模数据的集群. HBase的特点 大:一个表可以有上亿行,上百万列. 面向列:面向列表(簇 ...
随机推荐
- C++学习(二十)(C语言部分)之 函数1
函数 printf 输出的函数 scanf 输入的函数函数是什么 怎么写 是一组一起执行一个任务的语句 一个程序的基本组成单位是函数 只需要知道函数名字和括号里面要填的内容 就可以调用函数 1.如果代 ...
- 《DSP using MATLAB》Problem 5.15
代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...
- web网页【2】
前端代码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.as ...
- 【BZOJ3244】【UOJ#122】【NOI2013]树的计数
NOI都是酱的题怎么玩啊,哇.jpg 原题: 我们知道一棵有根树可以进行深度优先遍历(DFS)以及广度优先遍历(BFS)来生成这棵树的DFS序以及BFS序.两棵不同的树的DFS序有可能相同,并且它们的 ...
- Java解析property文件(和静哥说的,SQL执行限定时间写在xml中,增加扩展,在不改源代码基础上)
在Java项目中一些配置参数保存在Property文件中,这样能保证不修改原代码直接修改Property文件. 简单的很,就是在java文件中读取外界的properyt配置文件 PropertyPar ...
- ASP.NET Core WebApi使用Swagger生成api说明文档
1. Swagger是什么? Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件 ...
- How to implement a windbg plugin
How to implement a windbg plugin Define EXT_CLASS #include "lauxlib.h" class EXT_CLASS : p ...
- [转]RPC 框架通俗介绍
关于RPC 你的题目是RPC(远程过程调用,Remote Procedure Call)框架,首先了解什么叫RPC,为什么要RPC,RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服 ...
- Redis:五种数据类型的简单增删改查
Redis简单增删改查例子 例一:字符串的增删改查 #增加一个key为ay_key的值 127.0.0.1:6379> set ay_key "ay" OK #查询ay_ke ...
- python MySQL-Slave从服务器状态检测脚本
#!/bin/bash mysql -e "show slave status\G" > mysql_status.txt array=($(egrep 'Slave_IO_ ...