HBase入门

HBase入门

1.1 HBase 简介

HBase(HadoopDatabase),是一个高可靠性、高性能、面向列、可伸缩、实时读写的分布式数据库。 利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,,利用Zookeeper作为其分 布式协同服务主要用来存储非结构化和半结构化的松散数据(列存NoSQL数据库)

1.1.1 为什么要用HBase

HBase的存储是基于Hadoop的。Hadoop是这些年崛起的拥有着高性能,高稳定,可管理的大数据应用平台。Hadoop已经快要变为大数据的 代名词了,基于Hadoop衍生出了大量优秀的开源项目。

Hadoop实现了一个分布式文件系统(HDFS)。HDFS有高容错性的特点,被设计用来部署在低廉的硬件上,而且它提供高吞吐量以访问应用程序的数据,适合那些有着超大数据集的应用程序。基于Hadoop意味着HBase与生俱来的超强的扩展性和吞吐量。 HBase采用的是Key/Value的存储方式,这意味着,即使随着数据量增大,也几乎不会导致查询的性能下降。HBase又是一个列式数据库(对比于传统的行式数据库而言),当你的表字段很多的时候,你甚至可以把其中几个字段放在集群的一部分机器上,而另外几个字段放到另外一部分机器上,充分分散了负载压力。然而,如此复杂的存储结构和分布式的存储方式带来的代价就是:哪怕只是存储少量数据,它也不会很快。HBase并不快,只是当数据量很大的时候它慢的不明显

凡事都不可能只有优点而没有缺点。数据分析是HBase的弱项,因为对于HBase乃至整个NoSQL生态圈来说,基本上都是不支持表关联的。当你想实现group by或者order by的时候,你会发现,你需要写很多的代码来实现Mapreduce。

因此,请不要盲目地使用HBase。当你的情况大体上符合以下任意一种的时候:主要需求是数据分析,比如做报表。单表数据量不超过千万时请不要使用HBase,使用MySQL或者Oracle之类的产品可以让你的脑 细胞免受折磨。

什么时候用Hbase? Hbase不适合解决所有的问题:

●首先数据库量要足够多,如果有十亿及百亿行数据,那么Hbase是一个很好的选项,如果只有几百万行甚至不 到的数据量,RDBMS是一个很好的选择。 因为数据量小的话,真正能工作的机器量少,剩余的机器都处于空闲 的状态

●其次,如果你不需要辅助索引,静态类型的列,事务等特性, 一个已经用RDBMS的系统想要切换到Hbase,则 需要重新设计系统。

●最后,保证硬件资源足够,每个HDFS集群在少于5个节点的时候,都不能表现的很好。因为HDFS默认的复制数 量是3,再加上一个NameNode。

●Hbase在单机环境也能运行,但是请在开发环境的时候使用。

1.1.2 在哪里使用HBase

  • Apache HBase用于对大数据进行随机,实时的读写访问。

  • 它在商用硬件集群的顶部托管着很大的表。

  • Apache HBase是根据Google的Bigtable建模的非关系数据库。Bigtable在Google File System上起作用,Apache HBase同样在Hadoop和HDFS之上工作。

1.1.3 HBase的应用

  • 它在需要编写繁重的应用程序时使用。

  • 每当我们需要提供对可用数据的快速随机访问时,都会使用HBase。

  • Facebook,Twitter,Yahoo和Adobe等公司在内部使用HBase。

1.1.4 HBase优点

HBase优点

●容量大: HBase单表可以有百亿行、百万列, 数据矩阵横向和纵向两个维度所支持的数据量级都非常具有弹性

●面向列: 面向列的存储和权限控制,并支持独立检索,可以动态增加列,即,可单独对列进行各方面的操作 列式存储,其数据在表中是按照某列存储的,这样在查询只需要少数几个字段的时候,能大大减少读取的数量

●多版本: Hbase的每一个列的数据存储有多 个Version,比如住址列,可能有多个变更,所以该列可以有多个version

●稀疏性: 为空的列并不占用存储空间,表可以设计的非常稀疏。 不必像关系型数据库那样需要预先知道所有列名然后再进行nul填充

●拓展性: 底层依赖HDFS,当磁盘空间不足的时候,只需要动态增加datanode节点服务(机器)就可以了

●高可靠性: WAL机制,保证数据写入的时候不会因为集群异常而导致写入数据丢失 Replication机制,保证了在集群出现严重的问题时候,数据不会发生丢失或者损坏 Hbase底层使用HDFS,本身也有备份。

●高性能: 底层的LSM数据结构和RowKey有序排列等架构.上的独特设计,使得Hbase写入性能非常高。Region切分、主键索引、缓存机制使得Hbase在海量数据下具备一定的随机读取性能, 该性能针对Rowkey的查询能够到达毫秒级别,LSM树,树形结构,最末端的子节点是以内存的方式进行存储的,内存中的小树会flush到磁盘中(当子节点达到一定阈值以后,会放到磁盘中,且存入的过程会进行实时merge成-个主节点,然后磁盘中的树定期会做merge操作,合并成一棵大树,以优化读性能。)

LSM树的介绍: LSM树由来、设计思想以及应用到HBase的索引 - yanghuahui - 博客园

1.1.5 HBase与Hive比较

关于Hive

1、可以理解为一种SQL执行引擎,对SQL的支持最终转换为MR任务

2、不支持更新、删除操作,但可以插入

3、任务不是实时执行,用时一般为数分钟到数小时

4、本身可以不存储数据,只存储关于数据的元数据,偏重于逻辑结构,是一种数据仓库

5、适合于静态大数据量的查询、分析、汇总,不适合联机实时数据处理

6、操作一般以全表数据为基础,但也有分区等概念

关于HBase

1、不支持SQL

2、支持增删改查操作

3、任务实时执行

4、本身存储数据,有复杂的物理存储结构,是一种真正的数据库

5、适合联机实时数据处理

6、操作以列为基础

HBase中的每一个行都是离散的。因为有列族的存在,所以一个行里面的不同列甚至被分 配到了不同的服务器上。行的概念被减弱到只 有一个抽象的存在。在实体上,把多个列标定为一个行的关键词是 row key,这也是行这个概念在HBase中的唯一体现。 在HBase中,每一个存储语句都必须精确地写出数据是要被存储到 哪个单元格,而单元格是由表:列族:行:列来定义的。翻译过来就是你要精确地写出数据要被存储到哪个表的哪个列族的哪个行的哪个列。如果一行有10列,那存储一行的数据得写10行的语句;而在传统数据库中存储语句(insert语句)可以把整个行的数据一次性写在行语句里面。

1.2HBase数据模型

HBase数据类型,存储的都是字节Byte就一种

  1. Namespace:

    ●命名空间是类似于关系数据库系统中的数据库的概念,他其实是表的逻辑分组。这种抽象为多租户相关功能奠 定了基础

    ●命名空间是可以管理维护的,可以创建,删除或更改命名空间。

    ●HBase有两个特殊预定义的命名空间: ①default -没有明确指定名称空间的表将自动落入此名称空间 ②HBase -系统命名空间,用于包含HBase内部表

  2. Region 类似于关系型数据库的表概念。不同的是,HBase 定义表时只需要声明列族即可,不需 要声明具体的列。这意味着,往HBase写入数据时,字段可以动态、按需指定。因此,和关 系型数据库相比,HBase能够轻松应对字段变更的场景。

  3. Row 行 HBase表中的每行数据都由一个Rowkey和多个Column (列) 组成,数据是按照Rowkey 的字典顺序存储的,并且查询数据时只能根据Rowkey进行检索,所以Rowkey的设计十分重要

  4. Rowkey 行键

    ●Rowkey 是用来检索记录的主键,是一行数据的唯一标识

    ●Rowkey行键(Rowkey)可以是任意字符串(最大长度是64KB, 实际应用中长度一般为10-100bytes), Rowkey以字 节数组保存。

    ●存储时,数据按照Rowkey的字典序(byte order)排序存储。设计Rowkey时,要充分排序存储这个特性,将经常 一起读取的行存储放到一起。

  5. Column 列 HBase中的每个列都由Column Family (列族)和Column Qualifier (列限定符)进行限定,例如info: name,info: age。建表时,只需指明列族,而列限定符无需预先定义。

  6. Column Family 列族

    ●列族在物理上包含了许多的列与列的值,每个列簇都有一些存储的属性可配置。例如是否使用缓存,压缩类型,存储版本数等。在表中,每一行都有相同的列簇,尽管有些列簇什么东西也没有存。

    ●将功能属性相近的列放在同一个列族,而且同一个列族中的列会存放在同一个Store中

    ●列族一般需要在创建表的时候就进行声明,而且一般一个表中的列族数不要超过3。

    ●列隶属于列族,列族隶属于表

  7. Column Qualifier 列限定符

    ●列族的限定词,理解为列的唯一标识。但是列标识是可以改变的,因此每一行可能有不同的列标识

    ●使用的时候必须是列族:列限定符的格式

    ●列可以根据需求动态添加或者删除,同一个表中不同行的数据列都可以不同

  8. Cell 单元格

    一个列中可以存储多个版本的数据。而每个版本就称为一个单元格(Cell),所以在HBase中的单元格跟传统

    关系型数据库的单元格概念不一样。HBase中的数据细粒度比传统数据结构更细一级,同一个位置的数据还细分成多个版本。

    ●Cell是由row, column family,column qualifier,version组成的

    ●cell中的数据是没有类型的,全部是字节码形式存贮。因为HDFS上的数据都是字节数组。

  9. Timestamp:

    你既可以把它称为是时间戳,也可以称为是版本号,因为它是用来标定同一个列中多个单元格的版本号的。当你不指定版本号的时候,系统会自动采用当前的时间戳来作为版本号;而当你手动定义了一个数字来当作版本号的时候,这个Timestamp就真的是只有版本号的意义了(所以我一直觉得“版本号”这个名字更适合这个概念。

    ●HBASE中通过Rowkey和column family,column qualifier确定的一个存贮单元称为cell。每个cell都保存着同一份 数据的多个版本。

    ●版本通过时间戳来索引。时间戳的类型是64位整型

    ■默认时间戳是精确到毫秒的当前系统时间。时间戳也可以由客户显式赋值。

    ■如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。

    ●每个cell中, 不同版本的数据按照时间倒序排序,即最新的数据排在最前面。 查询数据的时候,如果不指定版本数,默认显示版本号最新(高)的数据

    ●为了避免数据存在过多版本中造成管理(包括存贮和索引)负担, HBASE 提供了两种数据版本回收方式。 一,是保存数据的最后n个版本 二,是保存最近一段时间内的版本(比如最近七天)。

    1.3Hbase的架构

    HBase有三个主要组成部分,客户端库client、主服务器和区域服务器region server,区域服务器可以按要求添加或者删除。

    Client客户端

    ●客户端负责发送请求到数据库

    ●客户端连接的方式有很多种:HBase shell、类JDBC

    ●发送的请求主要包括: DDL:数据库定义语言(表的建立,删除,添加删除列族,控制版本) 。DML:数据库操作语言(增删改) 。DQL:数据库查询语言(查询--全表扫描-基于主键- -基于过滤器) 

    ●client维护着一些cache来加快对HBase的访问, 比如region的位置信息。

  10. Zookeeper

    ●保证任何时候,集群中只有一个master

    ●存贮所有Region的寻址入口,存储所有的的元数据信息。

    ●实时监控Region Server的状态,将Region server的上线和下线信息实时通知给Master

    ●存储Hbase的schema,包括有哪些table,每个table有哪些column family

    HMaster

    只对表进行操作(增删改查)

    ●HBase集群的主节点,HMaster也可以实现高可用(active--standby) 。通过Zookeeper来维护主副节点的切换

    ●为Region server分配region

    ●负责region server的负载均衡

    ●管理用户对table的结构创建,删除,修改(ddl)操作 。

    表的元数据信息在Zookeeper上面 。表的数据在HRegionServer上

    ●当HRegionServer下线的时候,HMaster会将当前HRegionServer上的Region转移到其他的HRegionServer

    HRegionServer

    Region server属于HBase具体数据的管理者

    ●Region server维护Master分配给它的region,处理对这些region的IO请求

    ●会实时的和HMaster保持心跳,汇报当前节点的信息

    ●当接收到Hmaster命令创建表的时候, 分配一个Region对应一张表

    ●Region server负责切分在运行过程中变得过大的region

    ●当客户端发送DML和DQL操作的时候,HRegionServer负责和客户端建立连接

    ●当意外关闭的时候,当前节点的Region会被其他HRegionServer管理

    HRegion

    ●HRegion是HBase中分布式存储和负载均衡的最小单元。 最小单元就表示不同的HRegion可以分布在不同的HRegion server上。

    ●HBase自动把表水平划分成多个区域(region), 每个region会保存一个表里面某段连续的数据

    列族到多个region。

    ●每个表一开始只有一个region,一个Region只属于一张表, 随着数据不断插入表,region不断增大, 当增大到一 个阀值的时候,region就会等分会两个新的region (裂变) 。hbase.hregion.max.filesize

    ●当table中的行不断增多, 就会有越来越多的region。这样一张完整的表被保存在多个Regionserver上。

    ●一张表后期有可能有多个Region 。因为随着时间的推移, Region会越来越大 。Region达到阈值10G的时候会被平分(逻辑. 上平分,尽量保证数据的完整性) 。会将切分后的其中一个Region转移到其他的HRegionServer,上管理

    REGION从隶属于region server 一个Reigon对应的一张表,一张表有多个region,多个region可能分不到不同的region server

    region和region server: region可能通过Hmaster分配到其他region server上管理Store。物理上,每一个Store对应一个列族

    Store

    Region是表获取和分布的基本元素(存放在 HDFS datanode 上了), 由一个或者多个Store组成, 每个 S tore保存一个columns family列族
    每个Store又由1个memStore和0或多个StoreFile组成。
    MemStore :每个 Store 中有一个 MemStore 实例。数据写入 WAL 之后 就会被放入 MemStore MemStore 是内存的存储对象,只有当 MemStore 满了的时候才会将数据刷写( flush )到 HFile 中。  
    HFile :在 Store 中有多个 HFile 。当 MemStore 满了之后 HBase 就会在 HDFS 上生成一个新的 HFile ,然后把 MemStore 中的内容写到这 个 HFile 中。 HFile 直接跟 HDFS 打交道,它是数据的存储实体。接 下来我们来解剖一下单个 HFile 中的成分。
    HBase 是基于 LSM 树模型的,所有的数据更新插入操作都首先写入 Memstore 中(同时会顺序写到日志 Hlog 中),达到指定大小之后再将这些修改操作批量写入磁盘,生成一个新的 HFile 文件,这种设计可以极大地提升 HBase 的写入性能;另外, HBase 为了方便按照 RowKey 进行检索,要求 HFile 中数据都按照 RowKey 进行排序, Memstore 数据在 flush HFile 之前会进行一次排序,将数据有序化;还有,根据局部性原理,新写入的数据会更大概率被读取,因此 HBase 在读取数据的时候首先检查请求的数据是否在 Memstore ,写缓存未命中的话再到读缓存中查找,读缓存还未命中才会到 HFile 文件中查找,最终返回 merge 的一个结果给用户。

    Memstore

    数据被写入WAL之后就会被加载到MemStore(内存)中去。MemStore的大小增加到超过一定阀值的时候就会被刷写到HDFS上,以HFile的形式被持

    久化起来。

    设计MemStore的原因有以下几点:

      (1)由于HDFS上的文件不可修改,为了让数据顺序存储从而提高读取效率,HBase使用了LSM树结构来存储数据。数据会先在Memstore中 整理成LSM树,最后再刷写到HFile上。不过不要想当然地认为读取也是 先读取Memstore再读取磁盘哟!读取的时候是有专门的缓存叫 BlockCache(读缓存),这个BlockCache如果开启了,就是先读BlockCache,读不到才是读HFile+Memstore,这个我后面再讲解。

      (2)优化数据的存储。比如一个数据添加后就马上删除了,这样在刷写的时候就可以直接不把这个数据写到HDFS上。早期HDFS上的所有文件都是只能写入不能修改的。后来加入了追加(append)特性,实现了数据可以增加,但是必须是顺序增加,还是不 能修改之前的数据。而HBase是一个随机读写的数据库。MemStore会在 数据最终刷写到HDFS上之前对文件进行排序处理,这样随机 写入的数 据就变成了顺序存储的数据,可以提高读取效率。所以MemStore是实现LSM树存储的必须设计组件。在LSM树的实现方式中,有一个必经的步骤,那就是在数据存储之前先对数据进行排序。而LSM树也是保证HBase能稳定地提供高性能的读能力的基本算法。LSM树是Google BigTableHBase的基本存储算法,它是传统关系型数据库 的B+树的改进。算法的关注重心是“如何在频繁的数据改动下保持系统 读取速度的稳定性”,算法的核心在于尽量保证数据是顺序存储到磁盘上的,并且会有频率地对数据进行整理,确保其顺序性。而顺序性就可以最大程度保证数据的读取性能稳定。关于LSM树和B+树的知识请大家自行查阅相关文档。 每一次的刷写都会产生一个全新的HFile文件,由于HDFS的特性,所以这个文件不可修改。

    StoreFile

    存到 HDFS落地到磁盘的文件

    img

    ●DataBlocks:数据块。每个HFile有多个Data块。 我们存储在HBase表中 的数据就在这里。Data块其实是可选的,但是几乎很难看到不包 含Data块的HFile。

    ●Meta: 元数据块。Meta块是可选的,Meta块只有在文件关闭的时 候才会写入。Meta块存储了该HFile文件的元数据信息,在v2之 前布隆过滤器(Bloom Filter) 的信息直接放在Meta里面存储, v2之后分离出来单独存储。不过你现在暂时不需要了解布隆过滤 器是什么东西。

    ●FileInfo: 文件信息,其实也是一种数据存储块。Filelnfo是 HFile的必要组成部分,是必选的。它只有在文件关闭的时候写 入,存储的是这个文件的信息,比如最后一个Key (Last Key),平均的Key长度(Avg Key Len)等。

    ●Data Index: 存储Data块索引信息的块文件。索引的信息其实也 就是Data块的偏移值(offset) DataIndex也是 可选的,有 Data块才有Data Index。

    ●Meta Index:存储Meta块索引信息的块文件。Metalndex块也是可 选的,有Meta块 才有Meta | ndex.

    ●Trailer: 必选的,它存储了Filelnfo、Datal ndex、 Meta Index 块的偏移值。

     参考书籍:《HBase不睡觉书》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HBase入门到精通》是一本关于HBase数据库的学习指南。它主要介绍了HBase的基本概念、架构和使用方法,以及如何进行高级配置和优化。这本书适合那些想要深入了解HBase技术的读者,无论是初学者还是有一定经验的开发人员。 首先,这本书会帮助读者了解HBase的起源和背景,介绍Hadoop生态系统中的HBase定位和关键特性。然后,它会详细解释HBase的数据模型和各个组件的功能。读者将学习如何设计数据表和列族,以及如何使用HBase的查询语言进行数据检索。 接下来,这本书会介绍HBase的架构和工作原理。读者将了解Region Server、Master Server和ZooKeeper等关键组件的功能和作用。同时,它还会讲解HBase的数据分布和复制机制,以及如何进行故障恢复和集群管理。 除了基础知识,这本书还会深入探讨HBase的高级应用和优化技巧。读者将学习如何构建高性能的HBase应用程序,包括数据插入、读取和更新的最佳实践。同时,它还会介绍HBase的二级索引、过滤器和缓存机制等高级功能,以及如何进行数据压缩和性能调优。 总的来说,通过学习《HBase入门到精通》,读者将能够全面掌握HBase的核心概念和技术,从而能够独立设计、开发和管理HBase数据库。无论是对于个人技能提升还是实际项目应用,这本书都是一份非常有价值的学习资料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值