文章目录

  • 一:hbase的产生背景
  • Hadoop 的限制
  • Hadoop 随机存取数据库
  • Hadoop 的特点:
  • Hive 的特点:
  • 二:hbase是什么
  • 1.面向列:每一个列族存储一个物理文件
  • 2.nosql:
  • 三:hbse的表结构
  • 四:hbase的优缺点和特点:
  • hbase的特点:
  • hbase的优缺点:
  • 五:HBase适用场景
  • 六:hbase的设计思想以及架构
  • 架构:
  • 设计思想:


一:hbase的产生背景

Hadoop 的限制

Hadoop 只能执行批量处理,并且只以顺序方式访问数据。这意味着必须搜索整个数据集, 即使是最简单的搜索工作。当处理结果在另一个庞大的数据集,也是按顺序处理一个巨大的 数据集。在这一点上,一个新的解决方案,需要访问数据中的任何点(随机访问)单元。

Hadoop 随机存取数据库

应用程序,如 HBase,Cassandra,CouchDB,Dynamo 和 MongoDB 都是一些存储大量数据和 以随机方式访问数据的数据库。

Hadoop 的特点:

对于任意格式的庞大数据集,Hadoop 可以做到安全存储 但是对于需要在庞大数据集做针对于单条记录的增删改查是做不到的。

Hive 的特点:

对于存储在 HDFS 上的结构化的数据,如果增加一些描述这些数据的元数据信息,那么我们 可以把存储在 HDFS 上的数据抽象成一张二维表格,使用 Hive 进行各种 Insert/Select 操作。 但是 Hive 还是天生不支持对于单条记录的增删改查,也不是设计用来做单条记录的增删改 查的。

总结:

(1)海量数据量存储成为瓶颈,单台机器无法负载大量数据

(2)单台机器 IO 读写请求成为海量数据存储时候高并发大规模请求的瓶颈

(3)随着数据规模越来越大,大量业务场景开始考虑数据存储横向水平扩展,使得存储服 务可以增加/删除,而目前的关系型数据库更专注于一台机器

重要问题探讨:

如何设计一个能存储庞大数据集,同时也能做到实时增删改查的数据库系统? 相当于设计一个 MySQL 的分布式版本。 先解决这个问题,再来学习别人的成果,这是一种较好的学习方式。而不是一上来便学习别 人的成功。须知:已掌握的知识会限制我们的思维方式。

类似问题:

1、如何设计一个分布式文件系统?

2、如何设计一个分布式计算框架?

3、如何设计一个分布式数据库? 他们的难点是什么?

思路引爆点:

1、怎样快速判断一个元素在不在一个数据集中?布隆过滤器

2、是否能找到一种合适的数据结构和搜索算法能快速从一个数据集中找出一个元素?二分 查找

3、如何设计分布式系统?网络编程模型(NIO RPC Netty)

4、是否可以提前过滤不参与查询的数据,提高查询效率?列裁剪

参考如下:

二:hbase是什么

HBase 是 BigTable 的开源(源码使用 Java 编写)版本。是 Apache Hadoop 的数据库,是建 立在 HDFS 之上,被设计用来提供高可靠性、高性能、列存储、可伸缩、多版本的 NoSQL 的分布式数据存储系统,实现对大型数据的实时、随机的读写访问。

HBase 依赖于 HDFS 做底层的数据存储,BigTable 依赖 Google GFS 做数据存储 HBase 依赖于 MapReduce 做数据计算,BigTable 依赖 Google MapReduce 做数据计算 HBase 依赖于 ZooKeeper 做服务协调,BigTable 依赖 Google Chubby 做服务协调

1.面向列:每一个列族存储一个物理文件
2.nosql:

非关系型数据库,不支持标准sql,hbse提供了全新的shell,可以通过第三方的工支持标准sql(phoenix)

注意:hbase表中的数据存储在hdfs上面,表中的数据经过hbse的加工。存储,查询的时候还是转换为mr执行的

三:hbse的表结构

传统的关系型数据库是二维表

hbase是四维表;

这里以一个公司员工表为案例来讲解,此表中包含员工基本信息(员工姓名、年龄),员工详细信息(工资、角色),以及时间戳。整体表结构如下:

hbase 订单设计 简述hbase的设计目标_数据

1)行键 rowkey

一行的唯一标志,相同的行键的数据会被认为是同一行的数据,不同行的数据行键一定不同,行键具有唯一性

2)列族 column family

每一个列是属于某一个列族的,列不是独立存在的,列依附于列族;

经验值:每一个hbase中列族个数不要超过3个,每一个列族有多个列,每一行同一个列列族下的列可能都不一样

一般而言:同一个列族下存储具有相同io属性的列数据,hbse是面向列族存储的,一个列族对应一个物理文件,相同的io属性的意思是:经常一起读写访问的列;

3)列 属于表数据的一部分

插入数据的时候,自己定制列名—列值,每一个列都会属于指定的列族

4)单元格

每一个列对应一个值对应的一个单元格

5)数据版本 Version

每一个单元格的标志,通常情况下用系统时间戳进行标志,也可以手动指定时间戳

hbase下定位到一个单元格:

表名》行键》列族》列》时间戳

四:hbase的优缺点和特点:

hbase的特点:

1、大:一个表可以有上十亿行,上百万列

2、面向列:面向列(族)的存储和权限控制,列(簇)独立检索,每一个列族存储一个物理文件。

3、稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。

4、无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一 张表中不同的行可以有截然不同的列

hbase的优缺点:

① 它介于 NoSQL 和 RDBMS 之间,仅能通过主键(rowkey)和主键的 range 来检索数据

② HBase 查询数据功能很简单,不支持 join 等复杂操作

③ 不支持复杂的事务,只支持行级事务(可通过 hive 支持来实现多表 join 等复杂操作)。

④ HBase 中支持的数据类型:byte[](底层所有数据的存储都是字节数组)

⑤ 主要用来存储结构化和半结构化的松散数据。

五:HBase适用场景

  • 并发、简单、随机查询。(注:HBase不太擅长复杂join查询,但可以通过二级索引即全局索引的方式来优化性能)
  • 半结构化、非结构化数据存储。

一般我们从数仓中离线统计分析海量数据,将得到的结果插入HBase中用于实时查询。

六:hbase的设计思想以及架构

架构图:

hbase 订单设计 简述hbase的设计目标_Hadoop_02

架构:

整个过程是这样的:客户端启动一个操作来修改数据,比如Put。每次修改都封装到一个KeyValue对象实例中,通过RPC调用发送出去。这些调用会发送给含有匹配region的Region Server;KeyValue实例到达后,它们会被分配到管理对应行HRegion实例,数据被写入WAL,然后被放入实际拥有记录的MemStore中;当MemStore达到一定大小或经历一个特定时间,数据会异步的连续的写入到文件系统中(HFile)。如果写入过程出现问题,WAL能保证数据不丢失,因为WAL日志HLog存储在HDFS上。其他region server可以读取日志文件并回写修改,恢复数据。

设计思想:

基于LSM树,LSM树的设计思想非常朴素:将对数据的修改增量保持在内存中,达到指定的大小限制后将这些修改操作批量写入磁盘,不过读取的时候稍微麻烦,需要合并磁盘中历史数据和内存中最近修改操作,所以写入性能大大提升,读取时可能需要先看是否命中内存,否则需要访问较多的磁盘文件。极端的说,基于LSM树实现的HBase的写性能比Mysql高了一个数量级,读性能低了一个数量级。LSM树原理把一棵大树拆分成N棵小树,它首先写入内存中,随着小树越来越大,内存中的小树会flush到磁盘中,磁盘中的树定期可以做merge操作,合并成一棵大树,以优化读性能。