Hbase简介

来源:互联网 发布:优易数据网站 编辑:程序博客网 时间:2024/06/09 16:42

HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。

HBase是Google Bigtable的开源实现,类似Google Bigtable利用GFS作为其文件存储系统,HBase利用Hadoop HDFS作为其文件存储系统;Google运行MapReduce来处理Bigtable中的海量数据,HBase同样利用Hadoop MapReduce来处理HBase中的海量数据;Google Bigtable利用 Chubby作为协同服务,HBase利用Zookeeper作为对应。

HBase系统架构如图所示

 

Client

HBaseClient使用HBase的RPC机制与HMaster和HRegionServer进行通信,对于管理类操作,Client与HMaster进行RPC;对于数据读写类操作,Client与HRegionServer进行RPC。

 

Zookeeper

ZookeeperQuorum中除了存储了-ROOT-表的地址和HMaster的地址,HRegionServer也会把自己以Ephemeral方式注册到Zookeeper中,使得HMaster可以随时感知到各个HRegionServer的健康状态。此外,Zookeeper也避免了HMaster的单点问题,见下文描述

 

HMaster

HMaster没有单点问题,HBase中可以启动多个HMaster,通过Zookeeper的MasterElection机制保证总有一个Master运行,HMaster在功能上主要负责Table和Region的管理工作:

1.      管理用户对Table的增、删、改、查操作

2.      管理HRegionServer的负载均衡,调整Region分布

3.      在Region Split后,负责新Region的分配

4.      在HRegionServer停机后,负责失效HRegionServer 上的Regions迁移

 

HRegionServer

HRegionServer主要负责响应用户I/O请求,向HDFS文件系统中读写数据,是HBase中最核心的模块。


HRegionServer内部管理了一系列HRegion对象,每个HRegion对应了Table中的一个Region,HRegion中由多个HStore组成。每个HStore对应了Table中的一个ColumnFamily的存储,可以看出每个Column Family其实就是一个集中的存储单元,因此最好将具备共同IO特性的column放在一个ColumnFamily中,这样最高效。

 

-ROOT-&& .META.

HBase中有两张特殊的Table,-ROOT-和.META.

Ø .META.:记录了用户表的Region信息,.META.可以有多个regoin

Ø -ROOT-:记录了.META.表的Region信息,-ROOT-只有一个region

Ø Zookeeper中记录了-ROOT-表的location


Client访问用户数据之前需要首先访问zookeeper,然后访问-ROOT-表,接着访问.META.表,最后才能找到用户数据的位置去访问,中间需要多次网络操作,不过client端会做cache缓存。

 

存储: 

         HBase以表的形式存储数据。表有行和列组成,存储时,数据按照Row key的字典序(byte order)排序存储。设计key时,要充分考虑到排序存储这个特性,将经常一起读取的行存储放到一起(位置相关性) 。

 

列存储

         HStore存储是HBase存储的核心了,其中由两部分组成,一部分是MemStore,一部分是StoreFiles。MemStore是 Sorted Memory Buffer,用户写入的数据首先会放入MemStore,当MemStore满了以后会Flush成一个StoreFile(底层实现是HFile), 当StoreFile文件数量增长到一定阈值,会触发Compact合并操作,将多个StoreFiles合并成一个StoreFile,合并过程中会进行版本合并和数据删除,因此可以看出HBase其实只有增加数据,所有的更新和删除操作都是在后续的compact过程中进行的,这使得用户的写操作只要进入内存中就可以立即返回,保证了HBase I/O的高性能。当StoreFilesCompact后,会逐步形成越来越大的StoreFile,当单个StoreFile大小超过一定阈值后,会触 发Split操作,同时把当前Region Split成2个Region,父Region会下线,新Split出的2个孩子Region会被HMaster分配到相应的HRegionServer 上,使得原先1个Region的压力得以分流到2个Region上。HFile里面的每个KeyValue对就是一个简单的byte数组

          HRegion是Hbase中分布式存储和负载均衡的最小单元。最小单元就表示不同的Hregion可以分布在不同的HRegion server上。但一个Hregion是不会拆分到多个server上的。

 

RowKey&& Column family

         a) Rowkey: Hbase 中的记录是按照rowkey来排序的;

         b) Column family:(列族)是在系统启动之前预先定义好的;

                  hbase表中的每个列,都归属与某个列族。列名都以列族作为前缀。

                 HBase中的列可以动态新增。

 

存储类型: 

         TableName 是字符串

         RowKey 和 ColumnName 是二进制值(Java 类型 byte[])

         Timestamp 是一个 64 位整数(Java 类型 long)

         value 是一个字节数组(Java类型 byte[])

 

存储结构:

         即HTable按Row key自动排序,每个Row包含任意数量个Columns,Columns之间按Columnkey自动排序,每个Column包含任意数量个Values。理解该存储结构将有助于查询结果的迭代。

        (RowKey,List(SortedMap(column,List(value,TimeStamp))))

 

存储单元:

         HBase中通过row和columns确定的为一个存贮单元称为cell。

       每个cell都保存着同一份数据的多个版本。版本通过时间戳来索引。

         HBase为null的Column不会被存储,这样既节省了空间又提高了读性能

         cell中的数据是没有类型的,全部是字节码形式存贮

 

两种数据版本回收方式:

         一是保存数据的最后n个版本

         二是保存最近一段时间内的版本(比如最近七天)

 

用户可以针对每个列族进行设置值value:每个值由4个键唯一索引

         tableName+RowKey+ColumnKey+Timestamp=>value

 

访问方式:

访问hbase table中的行,只有三种方式:

         1 通过单个row key访问

         2 通过row key的range

         3 全表扫描

         Row key:行键 (Row key)可以是任意字符串(最大长度是 64KB,实际应用中长度一般为 10-100bytes),在hbase内部,row key保存为字节数组。

 

Hbase优缺点:

         1.不支持条件查询以及order by等查询;

         2.列可以动态增加,列为空则不存储数据,节省存储空间;

         3.会自动切分数据;

         4.可以提供高并发读写操作的支持;

 

 

学习HBase至少应该掌握四点:

1.    深入理解HTable,掌握如何结合业务设计高性能的HTable。

2.    掌握与HBase的交互,通过HBase Shell命令及Java API进行数据的增删查改。

3.    掌握如何用MapReduce分析HBase里的数据。

4.    掌握如何测试HBase MapReduce。

原创粉丝点击