HBase

简介

不做数据更新,制作数据分析适合clockhouse

HBase是一个高可靠性,高性能,面相列,可伸缩的分布式数据存储系统,目标是存储并处理大型的数据。HBase是一个非关系型数据库

HBase 是 Google Bigtable 的开源实现,不同之处在于:Google Bigtable 使用 GFS 作为其文件存储系统, HBase 利用 Hadoop HDFS 作为其文件存储系统;Google Bigtable 利用 Chubby 作为协同服务, HBASE 利用 Zookeeper 作为协同服务。

Hbase 是一个面向列存储的分布式存储系统,它的优点在于可以实现高性能的并发读写操作,同时 Hbase 还会对数据进行透明的切分,这样就使得存储本身具有了水平伸缩性。

列式存储数据库

列式数据库是以列相关存储架构进行数据存储的数据库,主要适合于批量数据处理和即时查询。相对应的是行式数据库,数据以行相关的存储体系架构进行空间分配,主要适合于大批量的数据处理,常用于联机事务型数据处理。

列存储数据库使用一个称为keyspace的概念。keyspace有点像关系模式中的模式。keyspace包含所有的列族(有点像关系型数据库模型中的表),其中包含行包含列。

一个列族包含三行,每一行包含他们自己的列

如上图

  • 列族由多行组成
  • 每一行可以包含与其他不同数量的列。而且这些列不必与其他的行的列匹配(例如,它们可以由不同的列名,数据类型,数量等)
  • 每行包含一列。它不像关系型数据库那样跨所有行。每个列包含一个名称值对,以及一个时间戳

表模式定义只能列族,也就是键值对。一个表由多个列族以及每一个列族可以由任意数量的列。后续列的值连续存储在磁盘上。表中的每个单元格值都具有时间戳。总之,在一个HBase:表是行的集合,行是列族的集合,列族是列的集合,列是键值对的集合

HBase的逻辑存储试图是由行键,时间戳,列族组成一个类似二维表一样的数据结构,但是在实际存储的时候,数据库存储数据是以列族为单位进行存储的,是完全将行数据按列族的方式进行分列的。

  • Row Key:每一行都由一个唯一的键,这是该行的唯一标识符
  • Column:每个列包含名称,值和时间戳
  • Name:KV对的K
  • Value:KV对的V
  • TimeStamp:这提供了插入数据的日期和事件。可以用来确定数据最新的版本

行比列族多了一个Row Key

  • 高效的压缩效率,节省磁盘空间和计算CPU和内存
  • 基于 CPU L2 缓存高效的数据迭代
  • 压缩算法:列式数据库由于其每一列都是分开储存的。所以很容易针对每一列的特征运用不同的压缩算法。常见的列式数据库压缩算法有Run Length Encoding , Data Dictionary , Delta Compression , BitMap Index , LZO , Null Compression 等等。根据不同的特征进行的压缩效率从10W:1 到10:1 不等。而且数据越大其压缩效率的提升越为明显。
  • 延迟物化:列式数据库由于其特殊的执行引擎,在数据中间过程运算的时候一般不需要解压数据而是以指针代替运算,直到最后需要输出完整的数据时。
  • 聚合查询:由于它们的结构,柱状数据库在聚合查询(如SUM、COUNT、AVG等)方面表现得特别好。
  • 可扩展性:列式存储数据库是可伸缩的。它们非常适合大规模并行处理(MPP),这涉及到将数据分散到一个大的机器集群中——通常是数千台机器。
  • 快速查询和写入:可以非常快地加载。可以在几秒钟内加载十亿行表。几乎可以立即开始查询和分析。

术语

Table

HBase 表由多行组成。

Row

HBase 的行由一个 rowkey 和一个或多个 column 组成,其中的值与它们相关联。行在存储时按行键的字母顺序排序。因此,行键的设计非常重要。其目标是以相关行彼此相邻的方式存储数据。

一个常见的 rowkey 模式是一个网站域名。如果您的 rowkey 是域,您可能应该以相反的方式存储它们(org.apache.www, org.apache.mail, org.apache.jira)。通过这种方式,所有Apache域在表中彼此接近,而不是基于子域的第一个字母展开。

Column

HBase 中的列由一个列族和一个列限定符组成,它们由一个:(冒号)字符分隔。

Column Family

出于性能原因,列族在物理上共使用一组列及其值。每个列族都有一组存储属性,比如它的值是否应该缓存在内存中,它的数据是如何压缩的,或者它的 rowkey 是如何编码的,等等。表中的每一行都有相同的列族,尽管给定行可能不会在给定列族中存储任何内容。

Column Qualifier

列限定符被添加到列族中,以提供给定数据块的索引。给定一个列族内容,一个列限定符可能是content:html,另一个可能是content:pdf。虽然列族在表创建时是固定的,但是列限定符是可变的,而且行之间可能会有很大差异。即每一行列的数量是不一样的。

Cell

由行和列的坐标交叉决定; 单元格是有版本的; 单元格的内容是未解析的字节数组; 由{row key, column( =<family> +<qualifier>), version} 唯一确定的单元。!!! cell中的数据是没有类型的,全部是字节码形式存贮。!!!

Timestamp时间戳(相当于版本!!!)

在HBase每个cell存储单元对同一份数据有多个版本,根据唯一的时间戳来区分每个版本之间的差异,不同版本的数据按照时间倒序排序,最新的数据版本排在最前面。 时间戳的类型是 64位整型。 时间戳可以由HBase(在数据写入时自动)赋值,此时时间戳是精确到毫秒的当前系统时间。 时间戳也可以由客户显式赋值,如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。

2.1 ROW KEY(相当于关系型数据库中的ID)

决定一行数据 按照字典顺序排序的。 Row key只能存储64k的字节数据

物理存储

Region是HBase中分布式存储和负载均衡的最小单元,不同的Region分到不同的RegionServer上,

3.1 Client 包含访问HBase的接口并维护cache来加快对HBase的访问 3.2 Zookeeper 保证任何时候,集群中只有一个master(HA) 存贮所有Region的寻址入口。(同时存储数据) 实时监控Region server的上线和下线信息。并实时通知Master(当某一个Region server挂掉时,通知Hmaster去将其上的数据分发给其他的region Server) 存储HBase的schema和table元数据(存储元数据信息)

3.3 Master 为Region server分配region 负责Region server的负载均衡 发现失效的Region server并重新分配其上的region 管理用户对table的增删改操作(是管理操作!!!) 3.4 RegionServer Region server维护当前节点的region,处理对这些region的IO请求 Region server负责切分在运行过程中变得过大的region

3.5 Region HBase自动把表水平划分成多个区域(region),每个region会保存一个表里面某段连续的数据 每个表一开始只有一个region,随着数据不断插入表,region不断增大,当增大到一个阀值的时候,region就会等分会两个新的region(裂变) 当table中的行不断增多,就会有越来越多的region。这样一张完整的表被保存在多个Regionserver 上。

3.6 Memstore 与 storefile 一个region由多个store组成,一个store对应一个CF(列族) store包括位于内存中的memstore和位于磁盘的storefile写操作先写入memstore,当memstore中的数据达到某个阈值,hregionserver会启动flashcache进程写入storefile,每次写入形成单独的一个storefile(有些类似Hadoop中的Mapper阶段的写数据) 当storefile文件的数量增长到一定阈值后,系统会进行合并(minor、major compaction),在合并过程中会进行版本合并和删除工作(majar),形成更大的storefile 当一个region所有storefile的大小和数量超过一定阈值后,会把当前的region分割为两个,并由hmaster分配到相应的regionserver服务器,实现负载均衡 客户端检索数据,先在memstore找,找不到再找storefile

注意:1.major会把HStore所有的HFile都compact为一个HFile,并同时忽略标记为delete的KeyValue(被删除的KeyValue只有在compact过程中才真正被"删除"),可以想象major会产生大量的IO操作,对HBase的读写性能产生影响。minor则只会选择数个HFile文件compact为一个HFile。

​ 2.HRegion是HBase中分布式存储和负载均衡的最小单元。最小单元就表示不同的HRegion可以分布在不同的 HRegion server上。HRegion由一个或者多个Store组成,每个store保存一个columns family。 每个Strore又由一个memStore和0至多个StoreFile组成。如图:StoreFile以HFile格式保存在HDFS上。(HFile只是另一个叫法而已,对应于HDFS上)

Last modification:November 17, 2023
如果觉得我的文章对你有用,请随意赞赏