Hbase简介
HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩、 实时读写的分布式数据库
利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理 HBase中的海量数据,利用Zookeeper作为其分布式协同服务
主要用来存储非结构化和半结构化的松散数据(列存NoSQL数据库)
HBase数据模型
命名空间
命名空间是对表的逻辑分组,不同的命名空间类似于关系型数据库中的不同的Database数据库。利用命名空间,在多租户场景下可做到更好的资源和数据隔离。
表
对应于关系型数据库中的一张张表,HBase以“表”为单位组织数据,表由多行组成。
行
表的主键,按照字典序排序。
列族
每一行由若干列族组成,每个列族下可包含多个列。物理上,同一列族的数据存储在一起。
列限定符
列由列族和列限定符唯一指定,像如上的name、age即是列族的列限定符。
单元格
单元格由RowKey、列族、列限定符唯一定位,单元格之中存放一个值(Value)和一个版本号。
时间戳
单元格内不同版本的值按时间倒序排列,最新的数据排在最前面
hbase 的架构
Client 是客户端,要求读写数据的发起者。
ZK 集群是负责转发 Client 的请求和提供心跳机制,会让 HRegion Server 和 HRegion 注册进来,同时保存着 Rowkey 和 Region 的映射关系。
HMaster 中可以有多个待命,只有一个在活跃。
HRegion Server 就是一个机器节点,维护多个region,处理对这些region的IO请求,向HDFS文件系统中读写数据,是服务器中的一个进程。
HRegion是HBase中分布式存储和负载均衡的最小单元。Hbase 中的每张表都通过行键 (rowkey) 按照一定的范围被分割成多个子表(HRegion),默认一个 HRegion 超过 256M 就要被分割成两个,由 HRegionServer 管理,管理哪些 HRegion 由 Hmaster 分配。
HStore 一个 HStore 由 MemStore 和 StoreFile 组成,是 HBase 的核心存储单元,表的每个列族 (Column Family) 创建一个 store 实例.每个 store 都会有 0个或多个 StoreFile 与之对应,每个 StoreFile 都会对应一个 HFile .
hbase 和 hive 有什么区别?
共同点:
hbase与hive都是架构在hadoop之上的。都是用hadoop作为底层存储。
区别:
1.Hive是建立在Hadoop之上为了减少MapReducejobs编写工作的批处理系统,HBase是为了支持弥补Hadoop对实时操作的缺陷的项目 。
2.想象你在操作RMDB数据库,如果是全表扫描,就用Hive+Hadoop,如果是索引访问,就用HBase+Hadoop;
3.Hive query就是MapReduce jobs可以从5分钟到数小时不止,HBase是非常高效的,肯定比Hive高效的多;
4.Hive本身不存储和计算数据,它完全依赖于 HDFS 和 MapReduce,Hive中的表纯逻辑;hive借用hadoop的MapReduce来完成一些hive中的命令的执行;
hbase是物理表,不是逻辑表,提供一个超大的内存hash表,搜索引擎通过它来存储索引,方便查询操作;
5.hbase是列存储;hdfs 作为底层存储,hdfs 是存放文件的系统,而 Hbase 负责组织文件;hive 需要用到 hdfs 存储文件,需要用到 MapReduce 计算框架。
hbase 实时查询的原理
实时查询,可以认为是从内存中查询,一般响应时间在 1 秒内。HBase 的机制是数据先写入到内存中,当数据量达到一定的量(如 128M),再写入磁盘中, 在内存中,是不进行数据的更新或合并操作的,只增加数据,这使得用户的写操作只要进入内存中就可以立即返回,保证了 HBase I/O 的高性能。
Hbase 的 rowKey 的设计原则
联系 region 和 rowkey 关系说明,设计可参考以下三个原则.
rowkey 长度原则
rowkey 是一个二进制码流,可以是任意字符串,最大长度 64kb,实际应用中一般为 10-100bytes,以 byte[] 形式保存,一般设计成定长。建议越短越好,不要超过 16 个字节, 原因如下:
数据的持久化文件 HFile 中是按照 KeyValue 存储的,如果 rowkey 过长会极大影响 HFile 的存储效率 MemStore 将缓存部分数据到内存,如果 rowkey 字段过长,内存的有效利用率就会降低,系统不能缓存更多的数据,这样会降低检索效率
rowkey 散列原则
如果 rowkey 按照时间戳的方式递增,不要将时间放在二进制码的前面,建议将 rowkey 的高位作为散列字段,由程序随机生成,低位放时间字段,这样将提高数据均衡分布在每个 RegionServer,以实现负载均衡的几率。如果没有散列字段,首字段直接是时间信息,所有的数据都会集中在一个 RegionServer 上,这样在数据检索的时候负载会集中在个别的 RegionServer 上,造成热点问题,会降低查询效率。
rowkey 唯一原则
必须在设计上保证其唯一性,rowkey 是按照字典顺序排序存储的,因此, 设计 rowkey 的时候,要充分利用这个排序的特点,将经常读取的数据存储到一块,将最近可能会被访问的数据放到一块。
Hbase 中 scan 和 get 的功能以及实现的异同
get 方法() 按指 定 RowKey 获 取 唯 一 一 条 记 录 Get的方法处理分两种 : 设置了ClosestRowBefore和没有设置的 rowlock 主要是用来保证行的事务性,即每个get 是以一个 row 来标记的.一个 row 中可以有很多 family 和 column。
scan 方法()按指定的条件获取一批记录,实现条件查询功能使用的就是 scan 方式
scan 可以通过 setCaching 与 setBatch 方法提高速度(以空间换时间);
scan 可以通过 setStartRow 与 setEndRow 来限定范围([start,end]start? 是闭区间,end 是开区间)。范围越小,性能越高;scan 可以通过 setFilter 方法添加过滤器,这也是分页、多条件查询的基础。 全表扫描,即直接扫描整张表中所有行记录。
hbase写数据 和 读数据过程
获取region存储位置信息
写数据和读数据一般都会获取hbase的region的位置信息。大概步骤为:
从zookeeper中获取.ROOT.表的位置信息,在zookeeper的存储位置为/hbase/root-region-server;
根据.ROOT.表中信息,获取.META.表的位置信息;
META.表中存储的数据为每一个region存储位置;
向hbase表中插入数据
hbase中缓存分为两层:Memstore 和 BlockCache
首先写入到 WAL文件 中,目的是为了数据不丢失;
再把数据插入到 Memstore缓存中,当 Memstore达到设置大小阈值时,会进行flush进程;
flush过程中,需要获取每一个region存储的位置。
从hbase中读取数据
BlockCache 主要提供给读使用。读请求先到 Memtore中查数据,查不到就到 BlockCache 中查,再查不到就会到磁盘上读,并把读的结果放入 BlockCache 。
BlockCache 采用的算法为 LRU(最近最少使用算法),因此当 BlockCache 达到上限后,会启动淘汰机制,淘汰掉最老的一批数据。
一个 RegionServer 上有一个 BlockCache 和N个 Memstore,它们的大小之和不能大于等于 heapsize * 0.8,否则 hbase 不能启动。默认 BlockCache 为 0.2,而 Memstore 为 0.4。对于注重读响应时间的系统,应该将 BlockCache 设大些,比如设置BlockCache =0.4,Memstore=0.39。这会加大缓存命中率。
来源:CSDN
作者:glamour2015
链接:https://blog.csdn.net/glamour2015/article/details/104579232