HBase入门为什么可以这么简单?

这是云祁的第  53   篇文章

写在前面

大家好,我是云祁!

上次写了一篇  NoSQL 360度盘点,这些细节值得关注! 以后,本来想分享一些HBase入门和Rowkey设计的相关内容,但一直迟迟没更。

这个周末先简单带大家看看HBase基础知识,后面我们再慢慢深入。

这篇文章是我当时学习HBase的笔记,如有不妥之处欢迎大家在评论区指出。

一、大数据及 NoSQL 的前世今生

在大数据技术如火如荼的今天,所有大数据挖掘及分析平台技术中作为海量数据操作及高客户端并发解决方案的 NoSQL 技术,特别是 HBase 想必大家都不再陌生。

一直以来传统的关系 数据库基于全面的 ACID 保证, 用于数据存储和维护有关问题的解 决方案,但是受制于 越来越多的业务系统需要能适应不同种类的数据格式和数据源,经常是非结构化的或者半结构化的(如用户访问网站的日志),并且又是高几个数量级的数据( TB 及 PB 规模级别),传统关系型数据库难免有些力不从心。

于是基于系统需求发生了巨大变化,数据技术的先驱们不得不重新设计数据库,基于大数据的 NoSQL 的曙光就这样出现了。

大数据及 NoSQL 的使用首先在 google、facebook 等互联网公司,随后是金融、电信行业,众多 Hadoop&NoSQL 的开源大数据项目如雨后春笋般发展,被互联网等公司用于处理海量和非结构化类型的数据。

Hbase 被设计来处理 TB 到 PB 级的数据,并针对该类海量数据和高并发访问做了优化,作为 Hadoop 生态系统的一部分,它依赖 Hadoop 其他组件提供的重要功能,如 DataNode 数据冗余和 MapReduce 批处理。

二、HBase 概述

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

HBase 是一个领先的NoSQL数据库

    • 是一个面向列存储的数据库

    • 是一个分布式 hash map

    • 基于Google Big Table论文

    • 使用HDFS作为存储并利用其可靠性

三、关系型数据库 和 非关系型数据库的典型代表

NoSQL RDBMS
HBase, Redis, MongoDB MySQL,Oracle,SQL Server

四、HBase 这个 NoSQL 数据库的要点

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

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

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

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

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

五、结构化、半结构化和非结构化

结构化:数据结构字段含义确定,清晰,典型的如数据库中的表结构。

半结构化:具有一定结构,但语义不够确定,典型的如 HTML 网页,有些字段是确定的(title), 有些不确定(table)。

非结构化:杂乱无章的数据,很难按照一个概念去进行抽取,无规律性

与 Hadoop 一样,HBase 目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加 计算和存储能力。

六、HBase 中的表特点

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

2、面向列:面向列(族)的存储和权限控制,列(簇)独立检索。

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

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

七、HBase表结构逻辑视图

初次接触HBase,可能看到以下描述会懵:“基于列存储”,“稀疏MAP”,“RowKey”,“ColumnFamily”。

其实没那么高深,我们需要分两步来理解HBase, 就能够理解为什么HBase能够“快速地”“分布式地”处理“大量数据”了。

  1. 内存结构

  2. 文件存储结构

八、名词概念

假如我们有如下一张表 :smirk:

1、Rowkey的概念

Rowkey的概念和mysql中的主键是完全一样的,Hbase使用Rowkey来唯一的区分某一行的数据。

由于Hbase只支持3种查询方式:

1、基于Rowkey的单行查询

2、基于Rowkey的范围扫描

3、全表扫描

因此,Rowkey对Hbase的性能影响非常大,Rowkey的设计就显得尤为的重要。设计的时候要兼顾基于Rowkey的单行查询也要键入Rowkey的范围扫描。

具体Rowkey要如何设计后续会整理相关的文章做进一步的描述。这里大家只要有一个概念就是Rowkey的设计极为重要。

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

HBase 会对表中的数据按照 Rowkey 排序 (字典顺序)。

2、Column的概念

列,可理解成MySQL列。

3、ColumnFamily的概念

列族, HBase引入的概念。

HBase通过列族划分数据的存储,列族下面可以包含任意多的列,实现灵活的数据存取。就像是家族的概念,我们知道一个家族是由于很多个的家庭组成的。列族也类似,列族是由一个一个的列组成(任意多)。

HBase表的创建的时候就必须指定列族。就像关系型数据库创建的时候必须指定具体的列是一样的。

HBase的列族不是越多越好,官方推荐的是列族最好小于或者等于3。我们使用的场景一般是1个列族。

4、TimeStamp的概念

TimeStamp对Hbase来说至关重要,因为它是实现Hbase多版本的关键。在HBase中使用不同的TimeStamp来标识相同Rowkey行对应的不同版本的数据。

HBase 中通过 Rowkey 和 Columns 确定的为一个存储单元称为 cell。每个 cell 都保存着同一份 数据的多个版本。版本通过时间戳来索引。时间戳的类型是 64 位整型。

时间戳可以由 HBase(在数据写入时自动)赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由 客户显式赋值。如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。每个 cell 中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。

为了避免数据存在过多版本造成的的管理 (包括存贮和索引)负担,HBase 提供了两种数据版本回收方式:

保存数据的最后 n 个版本,保存最近一段时间内的版本(设置数据的生命周期 TTL)。

用户可以针对每个列簇进行设置。

5、单元格(Cell)

由{rowkey, column( = + ), version} 唯一确定的单元。Cell 中的数据是没有类型的,全部是字节码形式存贮。

九、HBase 的应用场景

  • 场景一:增量数据——时间序列数据(高容量,高速写入)

  • 场景二:信息交换——消息传递(高容量,高速写入)

  • 场景三:内容服务——Web后端应用程序(高容量,高速写入)