自 1970 年以来,关系数据库用于数据存储和维护有关问题的解决方案。大数据的出现后, 好多公司实现处理大数据并从中受益,并开始选择像 Hadoop 的解决方案。Hadoop 使用分 布式文件系统,用于存储大数据,并使用 MapReduce 来处理。Hadoop 擅长于存储各种格式 的庞大的数据,任意的格式甚至非结构化的处理。
Hadoop 的限制
Hadoop 只能执行批量处理,并且只以顺序方式访问数据。这意味着必须搜索整个数据集, 即使是最简单的搜索工作。 当处理结果在另一个庞大的数据集,也是按顺序处理一个巨大的数据集。在这一点上,一个 新的解决方案,需要访问数据中的任何点(随机访问)单元。
Hadoop 随机存取数据库
应用程序,如 HBase,Cassandra,CouchDB,Dynamo 和 MongoDB 都是一些存储大量数据和 以随机方式访问数据的数据库。
总结:
Hbase 官网:hbase.apache.org
HBase是Hadoop的生态系统,是建立在Hadoop文件系统(HDFS)之上的分布式、面向列的数据库,通过利用Hadoop的文件系统提供容错能力。如果你需要进行实时读写或者随机访问大规模的数据集的时候,请考虑使用HBase!
HBase作为Google Bigtable的开源实现,Google Bigtable利用GFS作为其文件存储系统类似,则HBase利用Hadoop HDFS作为其文件存储系统;Google通过运行MapReduce来处理Bigtable中的海量数据,同样,HBase利用Hadoop MapReduce来处理HBase中的海量数据;Google Bigtable利用Chubby作为协同服务,HBase利用Zookeeper作为对应。
HBase 是一个高可靠、高性能、面向列、可伸缩的分布式数据库,主要用来存储非结构化和半结构化的松散数据,设计它的目的就是用于处理非常庞大的表——通过水平扩展的方式,用计算机集群就可以处理由超过 10 亿行数据和数百万列元素所组成的数据表。
它介于 NoSQL 和 RDBMS 之间,仅能通过主键(rowkey)和主键的 range 来检索数据
HBase 查询数据功能很简单,不支持 join 等复杂操作
不支持复杂的事务,只支持行级事务(可通过 hive 支持来实现多表 join 等复杂操作)。
HBase 中支持的数据类型:byte[](底层所有数据的存储都是字节数组)
主要用来存储结构化和半结构化的松散数据。
结构化:数据结构字段含义确定,清晰,典型的如数据库中的表结构
半结构化:具有一定结构,但语义不够确定,典型的如 HTML 网页,有些字段是确定的(title), 有些不确定(table)
非结构化:杂乱无章的数据,很难按照一个概念去进行抽取,无规律性。
与 Hadoop 一样,HBase 目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加 计算和存储能力。
1、大:一个表可以有上十亿行,上百万列
2、面向列:面向列(族)的存储和权限控制,列(簇)独立检索。
3、稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。
4、无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一 张表中不同的行可以有截然不同的列。
1、海量存储
2、列式存储
HBase是根据列族来存储数据的。这里的列式存储其实说的是列族存储,Hbase是根据列族来存储数据的。列族下面可以有非常多的列,列族在创建表的时候就必须指定。
3、多版本
Hbase每一列的数据存储有多个Version。
4、面向列
Hbase是面向列的存储和权限控制,并支持独立检索。列式存储,其数据在表中按照某列存储的,这样在查询只需要少数几个字段时,能大大减少读取的数据量。(实时动态增加列;单独对某一列做一些操作)
5、高并发
由于目前大部分使用HBase的架构,都是采用的廉价PC,因此单个IO的延迟其实并不小,一般在几十到上百ms之间。这里说的高并发,主要是在并发的情况下,Hbase的单个IO延迟下降并不多。能获得高并发、低延迟的服务。
6、稀疏性
稀疏主要是针对HBase列的灵活性,在列族中,你可以指定任意多的列,在列数据为空的情况下,是不会占用存储空间的。
7、极易扩展
HBase的扩展性主要体现在两个方面,一个是基于上层处理能力(RegionServer)的扩展,一个是基于存储的扩展(HDFS)。
通过横向添加RegionSever的机器,进行水平扩展,提升Hbase上层的处理能力,提升Hbsae服务更多Region的能力。
基于存储的扩展(HDFS),如果磁盘空间不够时,增加datanode节点或增加datanode节点的存储即可。
备注:RegionServer的作用是管理region、承接业务的访问,这个后面会详细的介绍通过横向添加Datanode的机器,进行存储层扩容,提升Hbase的数据存储能力和提升后端存储的读写能力。
8、高可靠性:WAL机制保证了数据写入时不会因集群异常而导致写入数据丢失:Replication机制保证了在集群出现严重问题时,数据不会发生丢失或损坏。而且Hbase底层使用hdfs,hdfs本身也有备份机制。
9、高性能:
底层的LSM数据结构和RowKey有序排列等架构上的独特设计,使得Hbase写入性能非常高。
Region切分、主键索引、缓存机制使得Hbase在海量数据下具备一定的随机读取性能,该性能针对Rowkey的查询能够到达毫秒级别。
LSM树,树形结构,最末端的子节点是以内存的方式进行存储的,内存中的小树会flush到磁盘中(当子节点达到一定阈值以后,会放到磁盘中,且存入的过程会进行实时merge成一个主节点,然后磁盘中的树定期会做merge操作,合并成一棵大树,以优化读性能。)
支持过期:HBase支持TTL( Time To Live)过期特性,用户只需要设置过期时间,超过TTL的数据就会被自动清理,不需要用户写程序手动删除。
逻辑上,HBase的数据模型同关系型数据库很类似,数据存储在一张表中,有行有列。但从HBase的底层物理存储结构(K-V)来看,HBase更像是一个多维度map(multi-dimensional map)
Row_Key是必需有的,而且是唯一的,personal_info、office_info是列族,不同的列族是分开存储的。列族下面才是存储数据的列,而列是可以随便增加的。
上图是HBase表的逻辑结构,实际存储中,一个表可能是放在不同的服务器节点上面。另外存储是基于HDFS集群的,所以要先了解HDFS。
以上只是一个基本的逻辑结构,底层的物理存储结构才是重中之重的内容,看下图
对于 HBASE 时间戳 用于标记 数据有效,默认情况下,每次查询数据只返回最新的时间戳标记的数据;
命名空间,类似关系型数据库 DatabBase 概念,每个命名空间下有多个表。HBase有两个自带的命名空间,分别是hbase和default,hbase 中存放的是 HBase 内置的表,default 表是用户默认使用的命名空间。
命名空间的结构
Table:表,所有的表都是命名空间的成员,即表必属于某个命名空间,如果没有指定,则在 default 默认的命名空间中。
RegionServer group:一个命名空间包含了默认的 RegionServer Group。
Permission:权限,命名空间能够让我们来定义访问控制列表 ACL(Access Control List)。例如,创建表,读取表,删除,更新等等操作。
Quota:限额,可以强制一个命名空间可包含的 region 的数量。
Region 就是若干行数据的集合。HBase 中的 Region 会根据数据量的大小动态分裂,Region是基于HDFS实现的,关于Region的存取操作都是调用HDFS客户端完成的。同一个行键的 Region 不会被拆分到多个 Region 服务器上。
Region 有一点像关系型数据的分区,数据存放在Region中,当然Region下面还有很多结构,确切来说数据存放在MemStore和HFile中。访问HBase 时先去HBase 系统表查找定位这条记录属于哪个Region ,然后定位到这个Region 属于哪个服务器,然后就到哪个服务器里面查找对应Region 中的数据。
Hbase 是由 Client、Zookeeper、Master、HRegionServer、HDFS 等几个组件组成,HBase依赖于ZooKeeper和HDFS。
Hbase表的分片,HBase 表会根据 RowKey 值被切分成不同的 region 存储在 RegionServer中,在一个 RegionServer 中可以有多个不同的 region。同一个行键的 Region 不会被拆分到多个 Region 服务器上。 一个HBase表被划分成多个Region,开始只有一个Region,后台不断分裂。
一个表中包含多个列族,一个列族一个文件存储,region的切分是横向切分的,那么包含了多个列族。
描述HBase表的表,元数据表。有了 Region 标识符,就可以唯一标识每个 Region。为了定位每个 Region 所在的位置,可以构建一张映射表。映射表的每个条目包含两项内容,一项是 Region 标识符,另一项是 Region 服务器标识。这个条目就表示 Region 和 Region 服务器之间的对应关系,从而就可以使用户知道某个 Region 存储在哪个 Region 服务器中。这个映射表包含了关于 Region 的元数据,因此也被称为“元数据表”,又名“Meta表”。使用 scan 命令可查看 Meta 表的结构,如图所示
Meta 表中的每一行记录了一个 Region 的信息。RowKey 包含表名、起始行键和时间戳信息,中间用逗号隔开,第一个 Region 的起始行键为空。时间戳之后用.隔开的为分区名称的编码字符串,该信息是由前面的表名、起始行键和时间戳进行字符串编码后形成的。
Meta 表里有一个列族 info。info 包含了三个列,分别为 Regioninfo、Server 和 Serverstartcode。Regionlnfo中记录了 Region 的详细信息,包括行键范围 StartKey 和 EndKey、列族列表和属性。
Server 记录了管理该 Region 的 Region 服务器的地址,如 localhost:16201。Serverstartcode 记录了 Region 服务器开始托管该 Region 的时间。
当用户表特别大时,用户表的 Region 也会非常多。Meta 表存储了这些 Region 信息,也变得非常大。Meta 表也需要划分成多个 Region,每个 Meta 分区记录一部分用户表和分区管理的情况。(有了meta表,就可以得到region和HRegionServer的对应关系,可以进行Region定位:客户端通过 ZooKeeper 获取 Meta 表(分区表)存储的地址,首先在对应的 Regionserver上获取 Meta 表的信息(meta表存在Regionserver上),得到所需的Region对应的Regionserver的信息,然后从Region 服务器上找到所需的数据)
1、时空数据:主要是轨迹、气象网格之类,比如滴滴打车的轨迹数据主要存在 HBase 之中,另外大数据量的车联网企业,数据也都是存在 HBase 中。比如互联网出行,智慧物流与外卖递送,传感网与实时 GIS 等场景。
2、推荐画像:别是用户的画像,是一个比较大的稀疏矩阵,蚂蚁的风控就是构建在 HBase 上。用户画像有用户数据量大,用户标签多,标签统计维度不确定等特点,适合 HBase 特性的发挥。
3、消息/订单:在电信领域、银行领域,不少的订单查询底层的存储,另外不少通信、消息同步的应用构建在 HBase 之上。
另外电商领域的订单数据,订单流程完结数据不在变动,超过一定时间的订单可以存储在HBase中,MySQL只存储最近三个月的订单数据即可,减轻MySQL的压力。
4、储存浏览记录:大型的视频网站,电商平台产生的用户点击行为、浏览行为等等存储在 HBase 中为后续的智能推荐做数据支撑。
5、对象存储:这里的对象存储实际是中等对象存储,是对 HDFS 存储文件的一个缓冲过度。HBase 提供了中等对现象的存储能力,中等对象的大小范围在 100k 至 10M 之间。
6、时序数据:时序数据就是分布在时间上的一系列数值。HBase 之上有 OpenTSDB 模块,可以满足时序类场景的需求。
比如我们有很多的设备、传感器,产生很多数据,如果规模不是特别大的厂家有几千个风机,每个风机有几百个指标,那么就会有一百万左右的时序数据,如果用采样每一秒会产生一百万个时间点,如果用传统数据库,那么每一秒会产生一百万次,持续地往 MQ 做一百万次,它会崩裂。并且查询也是个大问题,除了多维查询以外,我们还会额外地增加时间纬度,查看一段时间的数据。这时候 HBase 很好了满足了时序类场景的需求。
7、Cube 分析(KyLin):通过 KyLin 将 Hive 或 kafka 中的数据,来构建 Cube,这些 Cube 会存储在 HBase 中。
8、NewSQL:HBase 上有 Phoenix 的插件,可以满足二级索引、SQL 的需求,对接传统数据需要 SQL 非事务的需求。从 NoSQL 到 NewSQL,Phoenix 或许是新的趋势。
9、Feeds 流:Feed 流,是 RSS 中用来接收该信息来源更新的接口,简单的说就是持续更新并呈现给用户的内容。比如微信朋友圈中看到的好友的一条条状态,微博看到的你关注的人更新的内容,App 收到的一篇篇新文章的推送,都算是 feed 流。
更多的场景需要不断挖掘
HBase 可以说是一个数据库,也可以说是一个存储。拥有双重属性的 HBase 天生就具备广阔的应用场景。在最近的一些版本中,引入了 OffHeap 降低 gc 影响,优化链路延迟,提供 Replica 等可以满足在线的需求。引入 MOB,可以存储 10M 左右的对象,完全适应了对象存储。另外由于自身的并发能力、存储能力,可以说是具有最为竞争力的引擎
cassandra-vs-hbase:https://www.scnsoft.com/blog/cassandra-vs-hbase
参考:
https://blog.csdn.net/weixin_42011858/article/details/129299164
https://blog.csdn.net/weixin_44133605/article/details/124635627
https://www.cnblogs.com/qingyunzong/p/8665698.html
https://www.cnblogs.com/wdh01/p/16248799.html
https://blog.csdn.net/qq_33208851/article/details/105223419
https://blog.csdn.net/nmsLLCSDN/article/details/124088245
https://blog.csdn.net/llAl_lAll/article/details/122260638
https://blog.csdn.net/Shyllin/article/details/124386524
https://blog.csdn.net/lilygg/article/details/116790288
https://www.cnblogs.com/kyoner/p/14264470.html