@[toc]
HBase 是什么?
HBase 是一种基于 Hadoop 的分布式 NoSQL 数据库,它是 Google 的Bigtable 的开源实现。
HBase 能够存储和处理海量数据,并提供实时读写能力。具有高可扩展性、高可靠性、高性能等特点。
HBase 的数据模型类似于一个分布式的、可扩展的哈希表。它的表由行、列和单元格组成,行键和列键一起唯一标识一个单元格。
HBase 支持在一个表中存储大量的数据,并能够以毫秒级别的速度进行读写操作。HBase 还支持多版本数据,即同一个单元格可以存储多个版本的数据,并且可以根据时间戳获取特定版本的数据。
HMaster 作用
负责 meta 表的维护
为 HRegionServer 分配 region,保持负载均衡。
发现失效的 HRegionServer 时重新分配该节点上的 region。
处理 schema 的更新请求。
HRegionServer 作用
维护分配到的 region,处理 region 的 IO 请求。
负责切分达到阀值的 region。
每个 RegioServer 各自保管自己的 Hlog。
HBase 热点问题
HBase 在 HDFS 中存储的每张表会被划分为多个 region,实际上这些 region 会被平均分配到多个节点上,如果某个时间点有大量的请求都落在某个单一 region 上,则会加重该节点的负担,严重时甚至会导致死机。
解决方法:
- 给 rowkey 加前缀。
将行键按照固定值进行 hash 哈希转换。
如果对行键连续性要求不高,可以行键反转。
HBase 的列族多好还是少好,为什么?
列族数量尽量少,控制在2个以内。
因为 HBase 按 region 拆表,而 region 按列族把列拆成多个 store(由多个HFile组成),当 region 整体达到阀值时会拆分 region,因此当两个列族数据大小差距悬殊时会导致数据量很小的列族数据也被迫参与拆分,该列族数据分散太多。最终查询该列族数据时,不得不请求多个 region,降低了系统效率。
HBase优缺点
优点:
- 高可扩展性:HBase的存储能力可以随着节点的增加而线性扩展。
- 高可靠性:HBase将数据复制到多个节点,从而提高了数据的可靠性和容错能力。
- 高性能:HBase可以实现毫秒级别的数据访问,并且支持批量读写操作。
- 灵活的数据模型:HBase的数据模型支持半结构化数据,而且可以通过列族来进行动态列扩展。
- 支持多版本数据:HBase可以存储多个版本的数据,可以根据时间戳获取特定版本的数据。
- 与Hadoop生态系统集成:HBase是Hadoop生态系统的重要组成部分,与Hadoop、MapReduce和ZooKeeper等技术无缝集成。
缺点:
- 不支持SQL:HBase不支持SQL语言,因此不适合那些需要使用SQL语言进行数据操作的场景。
- 不支持事务:HBase不支持像关系型数据库那样的ACID事务,因此不适合需要强一致性和事务支持的场景。
- 需要一定的学习成本。
- 对硬件资源要求高:HBase需要大量的硬件资源来实现高性能和可靠性。
HBase 架构
HBase的架构是分布式的、高可扩展的,主要包括以下几个组件:
- HBase Master:主节点,管理RegionServer节点。
- RegionServer:完成数据存储和计算。
- HDFS:底层存储数据的系统。
- Zookeeper:主要用于协调分布式环境下节点之间的状态和配置信息。
- 客户端:HBase Shell、HBase API。
HBase读写数据流程
读取数据流程:
- 客户端向HBase Master请求表的元数据信息。
- HBase Master返回表的元数据信息,包括RegionServer的地址和Region范围。
- 客户端根据元数据信息,将读取请求发送到对应的RegionServer。
- RegionServer查找数据所在的Region,如果找到,则从内存中的MemStore或者磁盘上的HFile中读取数据;如果找不到,则返回相应的错误信息。
写数据流程:
- 客户端向HBase Master请求表的元数据信息。
- HBase Master返回表的元数据信息,包括RegionServer的地址和Region范围。
- 客户端根据元数据信息,将写入请求发送到对应的RegionServer。
- RegionServer查找数据所在的Region,如果找到,则将数据写入内存中的MemStore;如果找不到,则创建新的Region,并将数据写入内存中的MemStore。
- 当MemStore的数据大小达到一定阈值时,会被刷写到磁盘上的HFile中。
在删除HBase中的一个数据的时候,它什么时候真正的进行删除呢?
在 HBase 中,当你执行删除操作时,实际上并不会立即将数据从磁盘中删除。因为它是使用标记删除的方式来删除数据,其真实数据还存储在磁盘中。如果想要彻底删除标记删除的数据并回收磁盘空间,可以通过 HBase 的 major compaction
功能来完成。
HBase的一个 region 由哪些东西组成?
在HBase中,一个Region是数据的逻辑单元,它由以下几个主要部分组成:
Row Key:一个Region包含的所有数据都是按照行键(Row Key)排序的,并且行键是一个字符串类型的唯一标识符,用于定位和检索数据。
Column Family:HBase中的数据是按照列族(Column Family)进行组织的。每个Region包含多个列族,每个列族又包含多个列限定符(Column Qualifier)。所有具有相同列族的数据都存储在同一个StoreFile中,以提高数据读取性能。
MemStore:每个Region包含一个MemStore,它是一个基于内存的数据结构,用于存储写入该Region的最新数据。MemStore中的数据是暂时存储在内存中的,当它达到一定的大小或时间限制后,会被刷写到磁盘上的StoreFile中。
StoreFile:所有的HBase数据都是存储在磁盘上的StoreFile中。每个StoreFile包含一个或多个HFile,每个HFile包含按照行键排序的一段数据,以提高数据的检索性能。多个StoreFile可以同时存在于同一个列族中,以提高数据的读取性能。
WAL(Write-Ahead-Log):WAL是HBase中的一个日志文件,它用于记录所有的数据写入操作,以防止数据丢失或损坏。当一个数据写入到HBase时,首先会写入到WAL中,然后再写入到对应的MemStore中,最后才写入到StoreFile中。
Region Server:每个Region都由一个Region Server负责管理和维护,Region Server是HBase中的一个重要组件,它负责管理所有的Region和处理所有的数据读写请求。
HBase适合读多写少还是写多读少?为什么?
HBase 更适合写多读少的场景。在写入这一块,每个table在合理预分区的情况,可以将负载均匀分配到不同的region server,而且通过LSM结构可以有效避免随机io,即使开启wal也是顺序写入,效率、吞吐量也是不错的。
HBase 的 rowkey 设计原则
在 HBase 中,RowKey 是一个十分重要的概念,对于 RowKey 的设计,需要考虑到以下原则:
唯一性:RowKey 必须是唯一的,这是 HBase 可以对数据进行快速查找的关键。
简洁性:RowKey 应该尽可能地简洁,以减少存储和查询时的开销。一般来说,RowKey 的长度不应该超过几百字节。
散列性:RowKey 应该具有良好的散列性,以使数据在 HBase 中分布均匀,防止热点数据集中在某个 Region 中,导致负载不均。
顺序性:如果查询需要按照 RowKey 的顺序进行,那么 RowKey 应该是有序的,这样可以避免扫描整个表的操作,提高查询效率。
可读性:在需要对数据进行手动查询或调试的情况下,RowKey 应该具有可读性,这样可以方便地快速定位数据。
避免随机生成:随机生成的 RowKey 会导致数据在 HBase 中分布不均,造成数据热点问题。因此,RowKey 的设计应该考虑业务含义和数据分布规律,避免随机生成。
HBase的 rowkey 为什么不能超过一定的长度?为什么要唯一? rowkey 太长会影响 Hfile 的存储是吧?
在 HBase 中,RowKey 的长度不能太长的原因有两个:
存储空间的限制:在 HBase 中,每个数据单元都需要至少占用一个存储单元(Cell),而每个 Cell 又需要存储 RowKey、列族、列名、时间戳以及值等信息。如果 RowKey 过长,就会占用过多的存储空间,导致存储空间的浪费,影响 HBase 的性能和可用性。
查询性能的限制:在 HBase 中,查询的效率很大程度上取决于 RowKey 的长度和设计。如果 RowKey 过长,那么在扫描和查询数据时,需要扫描更多的数据块,影响查询的效率。
另外,RowKey 在 HBase 中必须保证唯一性,这是因为 HBase 通过 RowKey 来进行数据的索引和定位。如果两条数据的 RowKey 相同,就会导致数据覆盖或者查询错误的问题。因此,保证 RowKey 的唯一性对于数据的正确性和完整性至关重要。
最后,确实,如果 RowKey 太长,也会影响 HFile 的存储,因为 HFile 是以块的方式进行存储的,而每个块的大小是固定的。如果 RowKey 过长,就会导致一个数据单元被拆分成多个块存储,影响 HFile 的读取性能。因此,为了保证 HFile 的高效读取,RowKey 的长度也应该控制在一定的范围内。
HBase的大合并、小合并是什么?
在 HBase 中,大合并(Major Compaction)和小合并(Minor Compaction)是两种不同的数据压缩策略。
小合并指的是将多个 HFile 合并成一个较大的 HFile,这个过程是由 HBase 自动触发的,当 HRegion 中的一个或多个 Store 的 HFile 数量达到一定的阈值时,HBase 就会触发小合并过程。小合并的主要目的是将多个较小的 HFile 合并成一个较大的 HFile,减少 HRegion 的文件数量,提高读取性能。
大合并是将整个 HRegion 中的所有 HFile 进行合并,合并后的结果就是一个较大的 HFile,大合并过程通常是由管理员手动触发的。大合并的主要目的是将 HRegion 中散布在多个 HFile 中的数据进行整合,提高 HRegion 的读取性能,同时也会清理 HRegion 中已经删除的数据单元。
HBase 和关系型数据库(传统数据库)的区别(优点)?
数据模型:HBase 是基于列族的 NoSQL 数据库,采用了一种稀疏矩阵的数据模型,可以处理半结构化和非结构化数据,适合存储大量的、快速变化的数据。而传统的关系型数据库采用表格的数据模型,适合存储结构化数据,但对于非结构化数据和大规模数据存储和管理能力不足。
数据存储和管理方式:HBase 将数据存储在分布式文件系统 HDFS 上,可以方便地进行扩展和横向扩展,可以实现高可靠性和高可用性。而传统的关系型数据库通常采用集中式存储方式,对于大规模数据的存储和管理能力不足,也不方便进行横向扩展。
数据访问方式:HBase 支持基于行键(RowKey)和列族(Column Family)的快速查询和随机访问,同时支持高并发读写操作。而传统的关系型数据库主要是通过 SQL 语言进行查询和操作,对于非结构化和半结构化数据的查询和操作能力有限。
数据一致性:HBase 支持数据的最终一致性和读写分离,可以实现更高的数据吞吐量和更低的读写时延。而传统的关系型数据库通常采用强一致性模型,对于高并发、大规模数据的操作和管理能力有限。
HBase数据结构
HBase是一个面向列的分布式数据库,采用稀疏矩阵的数据结构来存储数据。下面是HBase中常用的数据结构:
表格(Table):HBase中的数据存储在表格中,表格由多个行和列族组成。每个表格都有一个唯一的名称(TableName)。
行(Row):HBase中的每一行由一个唯一的行键(RowKey)来标识,行键是字节串类型,可以是任何长度。行由多个列族(Column Family)组成。
列族(Column Family):HBase中的每个列族包含多个列(Column),列族由一个唯一的名称来标识。列族中的列可以是任意数量,但是所有列都有相同的前缀,也就是列族名称。
列(Column):HBase中的列由列族名和列修饰符(Column Qualifier)组成。列修饰符也是字节串类型,可以是任何长度。HBase中的列可以包含多个版本(Version)。
版本(Version):HBase中的每个列都可以包含多个版本,版本号是一个时间戳(Timestamp)。
单元格(Cell):在HBase中,每个单元格(Cell)由行键、列族、列修饰符和时间戳四个部分组成,它是HBase中的最小数据单元。
Region:HBase中的数据被分割为多个区域(Region),每个区域由一系列连续的行组成。HBase会动态地将Region分裂或者合并,以适应数据的动态变化。
HBase为什么随机查询很快?
两个原因:
HBase 是列式存储结构
HBase 的数据是分布式存储
HBase 的 LSM 结构是什么?
HBase使用LSM树(Log-Structured Merge Tree)作为数据存储结构,以实现高吞吐量和低延迟的数据访问。
LSM树的基本思想是将数据分为内存部分和磁盘部分两部分,其中内存部分用于缓存数据,而磁盘部分则用于持久化存储。它的优点是可以实现高效的数据写入和查询,同时也支持数据版本控制和较好的可扩展性。
HBase 的 Get 和 Scan 的区别和联系?
在HBase中,Get 和 Scan 是两种基本的数据访问方式,它们的主要区别在于获取数据的方式和范围。
Get 操作是通过指定行键(rowkey)获取一行数据的操作。Get操作的特点是获取精确的一行数据,因此它的性能比较高。Get操作常用于获取某个具体的记录,例如通过ID查询某个具体用户的信息。
Scan 操作是通过指定起始行键和结束行键获取多行数据的操作。Scan操作的特点是可以获取多行数据,而且支持多种过滤条件和限制条件,因此它的性能较低。Scan操作常用于遍历数据表中的数据,例如获取某个时间段内的所有用户访问记录。
HBase数据的存储结构(底层存储结构)
HBase的底层存储结构是基于Hadoop的分布式文件系统HDFS,它将数据存储在一组称为HFile的底层物理文件中。HFile是一种面向列的文件格式,它可以快速随机读取数据,并支持范围查询。
HBase数据 compaction 流程是什么?
在HBase中,当存储的数据量越来越大时,为了保证系统的性能和可靠性,需要对HFile文件进行压缩和合并操作,这个过程就称为“压缩”或“合并”,也称为“compaction”。
在执行compaction的过程中,HBase会使用多个线程来并行地执行compaction任务。在compaction期间,HBase仍然可以进行读写操作,但是compaction的进度会影响HBase的性能。因此,为了避免compaction过程过于频繁或者过长,需要根据实际情况调整compaction策略和参数,以保证系统的稳定性和性能。
既然 HBase底层数据是存储在HDFS上,为什么不直接使用HDFS,而还要用HBase
尽管HBase底层的数据是存储在HDFS上的,但是HBase并不是简单地使用HDFS来存储数据,而是在其之上构建了一个高度优化的分布式数据存储系统。
HDFS并不擅长随机读写,它主要用于高吞吐量的顺序读写,因此在处理大量的随机读写请求时,HDFS性能会受到较大的影响,而HBase则是专门为此而设计的。
HBase 的预分区
HBase的预分区是指在创建表时,事先指定表的Region数量和Region的划分范围。预分区可以有效地提高HBase表的负载均衡和查询性能,因为它可以将表中的数据均匀地分布到不同的Region中,同时也可以减少Region的自动分裂和合并,降低系统开销。
HBase的MVCC
HBase使用MVCC(多版本并发控制)机制来保证数据的一致性和并发访问性能。
主要优点是可以实现高并发度和数据的隔离性,从而提高系统的并发性能和可靠性。还可以降低锁竞争,减少事务的冲突,提高系统的吞吐量和性能。
HBase支持SQL操作吗
HBase本身不支持SQL语言,但是可以通过一些工具或框架实现类似SQL操作的功能,如 Apache Phoenix 和 Apache HAWQ 等。