【大数据知识】HBase入门知识
文章目录
- HBase核心特性:
- HBase架构组成:
- HBase数据模型:
- 1. 命名空间(Namespace)
- 2. 表(Table)
- 3. 行(Row)
- 4. 列族(Column Family)
- 5. 列限定符(Column Qualifier)
- 6. 单元格(Cell)
- 7. 时间戳(Timestamp)
- HBase的读写流程:
- HBase写数据流程
- HBase读数据流程
- HBase和Hadoop的关系
- Hadoop
- HBase
- HBase 和 Hadoop 的关系
- 🤔 HBase 如何保证数据的一致性和高可用性?
- 数据一致性
- 高可用性
- 🧐 HBase中列族和表之间的关系是怎样的?
- 命令行示例
- 连接到HBase Shell
- 查看当前HBase Shell版本
- 创建表
- 删除表
- 列出所有表
- 启用表
- 禁用表
- 查看表的详细信息
- 插入数据
- 获取单行数据
- 获取多行数据
- 扫描表
- 扫描表并使用过滤器
- 删除单行中的单个单元格
- 删除整行数据
- 清空表(删除所有行)
- 检查表是否存在
- 添加列族
- 修改列族
- 删除列族
- 退出HBase Shell
- 查看集群状态
- 批量执行命令
- 相关文献
HBase是一个分布式、面向列的开源NoSQL数据库,它基于Google的BigTable模型构建,运行在Hadoop的HDFS之上。以下是HBase的一些核心特性和架构组成:
HBase核心特性:
- 面向列的存储:HBase的数据模型包括行键、列族、列限定符和时间戳。数据按列族存储,这使得对列族级别的数据操作更加高效。
- 高可靠性:HBase通过WAL(Write-Ahead Logging)和HDFS的多副本机制来保证数据的可靠性。
- 高性能:HBase利用LSM树(Log-Structured Merge-tree)数据结构来优化写入性能,并通过BlockCache和Bloom Filter等技术提高读取性能。
- 易扩展性:HBase可以在廉价的硬件上水平扩展,通过增加RegionServer节点来提升处理能力和存储能力。
- 稀疏性:HBase中的表可以设计得非常稀疏,空值列不占用存储空间。
- 多版本:HBase支持每个单元格的多版本数据,每个版本通过时间戳来标识。
HBase架构组成:
- HMaster:负责管理RegionServer,实现负载均衡,管理和分配Region,以及处理RegionServer的故障转移。
- RegionServer:负责响应用户的I/O请求,向HDFS文件系统中读写数据,是HBase中最核心的模块。
- ZooKeeper:用于维护HBase集群的状态和元数据信息,实现HMaster的主从选举。
- HDFS:为HBase提供底层的数据存储服务。
HBase数据模型:
HBase是一个分布式、可扩展、高性能的NoSQL数据库,它基于Google的BigTable模型构建。以下是HBase数据模型的详细说明:
1. 命名空间(Namespace)
在HBase中,命名空间用于组织表。类似于关系型数据库中的数据库(Database)概念,每个命名空间下可以有多个表。HBase有两个自带的命名空间,分别是hbase
和default
。hbase
命名空间中存放的是HBase内置的表,而default
命名空间是用户默认使用的命名空间 。
2. 表(Table)
HBase中的表由多行数据组成。表中的每一行都有一个唯一的行键(Row Key),并且可以有不同的列。HBase的表是稀疏的,意味着表中可以有大量的空列,而不会占用存储空间 。
3. 行(Row)
HBase表中的每行由一个行键和一个或多个列组成。行中的数据所属列族只能从该表所定义的列族中选取。行键的设计非常重要,因为数据是按照行键的字典顺序存储的 。
4. 列族(Column Family)
列族是HBase中的一个核心概念,它是多个列的集合。出于性能原因,列族通常在物理上拥有一簇列及其值。每个列族都有一组存储属性,例如是否应将其值缓存在内存中,如何压缩其数据或对其行键进行编码等。表中的每一行都具有相同的列族,但给定的行可能不会在给定的列族中存储任何内容 。
5. 列限定符(Column Qualifier)
列限定符将添加到列族中,以提供给定数据段的索引。列族和列限定符经常用Column Family:Column Qualifier
来一起表示。列是可以随意定义的,一个行中的列不限名字、不限数量,只限定列族 。
6. 单元格(Cell)
单元格是行、列族和列限定符的组合,它包含一个值和一个时间戳,时间戳表示值的版本。HBase中的数据细粒度比传统数据结构更细一级,同一个位置的数据还细分成多个版本 。
7. 时间戳(Timestamp)
时间戳与每个值一起写入,它是该值给定版本的标识符。默认情况下,时间戳表示写入数据时RegionServer上的时间,但是当您将数据放入单元格时,可以指定不同的时间戳值 。
HBase的数据模型设计支持了其高性能的数据存储和随机读写访问能力,特别是在处理大型数据集时。这种模型允许HBase在分布式环境中有效地存储和管理大量的结构化数据 。
HBase的读写流程:
HBase的读写流程是其核心功能的重要组成部分,以下是HBase数据读写流程的详细说明:
HBase写数据流程
-
客户端请求:
客户端通过ZooKeeper获取.META.
表所在的RegionServer
地址。 -
访问
.META.
表:
客户端访问.META.
表,确定要写入数据的Region
信息。 -
发送写请求:
客户端向目标RegionServer
发送写入数据请求。 -
写入WAL:
RegionServer
首先将数据写入到HLog
(Write-Ahead Log),确保数据的持久性。 -
写入MemStore:
数据随后写入到MemStore
中,MemStore
是内存中的结构,用于缓存新写入的数据。 -
响应客户端:
写入HLog
和MemStore
成功后,向客户端发送写入成功的响应。 -
数据刷写:
当MemStore
达到一定阈值后,数据会被刷写到磁盘上的StoreFile
中。 -
Compaction操作:
随着时间的推移,StoreFile
会不断增加,最终会触发Compaction
操作,将多个StoreFile
合并为一个,同时进行版本合并和数据删除。 -
Region分裂:
当StoreFile
的大小超过一定阈值后,Region
会分裂成两个新的Region
,以保持数据的可管理性和访问效率。
HBase读数据流程
-
客户端请求:
客户端通过ZooKeeper获取.META.
表所在的RegionServer
地址。 -
访问
.META.
表:
客户端访问.META.
表,确定要读取数据的Region
信息。 -
发送读请求:
客户端向目标RegionServer
发送读取数据请求。 -
构建Scanner体系:
RegionServer
构建一个RegionScanner
,根据列族构建StoreScanner
,每个StoreScanner
为每个StoreFile
构造一个StoreFileScanner
。 -
读取数据:
从MemStore
、BlockCache
和StoreFile
中查询目标数据,并将查到的所有数据进行合并。 -
返回结果:
将合并后的最终结果返回给客户端。 -
缓存数据:
从StoreFile
中读取到数据后,不是直接把结果数据返回给客户端,而是先把数据写入到BlockCache
中,以加快后续的查询,然后再返回结果给客户端。
HBase的读写流程涉及到其核心的数据模型和架构组件,如HMaster
、RegionServer
、ZooKeeper
等,这些组件协同工作,确保了HBase的高可用性、高性能和易扩展性。更多详细信息可以参考HBase的官方文档和相关博客文章。
HBase和Hadoop的关系
HBase 和 Hadoop 是 Apache 软件基金会旗下的两个开源项目,它们都设计用来处理大规模数据集,但它们的关注点和用途有所不同。以下是 HBase 和 Hadoop 之间的关系和区别:
Hadoop
Hadoop 是一个由 Java 语言开发的开源框架,它允许跨分布式计算环境进行数据存储和处理。Hadoop 的核心包括两个主要组件:
-
HDFS (Hadoop Distributed File System):
- 一个高度可靠的存储系统,设计用于在低成本硬件上存储大量数据。
- 数据在 HDFS 中以块的形式存储,并且每个块在多个节点上复制以提供容错能力。
-
MapReduce:
- 一个分布式计算框架,用于处理和生成大型数据集。
- MapReduce 通过将任务分解为映射(Map)和归约(Reduce)两个阶段来并行处理数据。
HBase
HBase 是一个开源的非关系型分布式数据库(NoSQL),它建立在 Hadoop 生态系统之上,特别是使用 HDFS 作为其底层存储系统。HBase 的特点包括:
-
列式存储:
- HBase 按列族存储数据,这使得对特定列族的数据访问更加高效。
-
低延迟访问:
- HBase 提供了对数据的快速随机访问,响应时间通常在毫秒级。
-
高可用性:
- HBase 设计了主从架构(Master/RegionServer)来保证高可用性。
-
自动分片:
- 表在物理上按行键范围分割成多个区域(Region),并可以在数据量增长时自动分裂。
HBase 和 Hadoop 的关系
-
存储依赖:
- HBase 依赖 HDFS 作为其底层存储,这意味着 HBase 中的数据实际上是存储在 Hadoop 分布式文件系统中的。
-
数据兼容性:
- HBase 表中的数据文件是以 Hadoop 的 HDFS 兼容格式存储的,这使得 HBase 可以利用 HDFS 的高可靠性和可扩展性。
-
MapReduce 集成:
- HBase 可以与 Hadoop 的 MapReduce 框架集成,允许使用 MapReduce 进行批量数据处理和分析。
-
生态系统:
- HBase 和 Hadoop 都是 Hadoop 生态系统的一部分,它们可以与其他生态系统组件(如 Hive、Pig、Hue 等)一起工作,提供综合的数据处理解决方案。
-
互补性:
- Hadoop 擅长于批量处理大规模数据集,而 HBase 擅长于实时读写操作。它们可以互补使用,Hadoop 处理离线批量处理任务,而 HBase 处理实时或近实时的查询和分析。
总的来说,HBase 可以被视为 Hadoop 生态系统的一个上层应用,它利用 Hadoop 的存储和计算能力,提供了一个适合于随机实时读写访问的数据库解决方案。
🤔 HBase 如何保证数据的一致性和高可用性?
HBase是一种分布式、可扩展、面向列的NoSQL数据库,它基于Google的BigTable模型构建,并运行在Hadoop的HDFS之上。以下是HBase如何保证数据的一致性和高可用性的一些关键机制:
数据一致性
-
写入先行日志(WAL):
HBase使用Write-Ahead Logging(WAL)来确保数据的一致性。在数据写入到MemStore之前,首先将其写入到WAL中。如果RegionServer发生故障,可以使用WAL中的日志来恢复数据,确保数据不会丢失。 -
MemStore和StoreFile:
数据首先写入MemStore,这是一个位于内存中的数据结构,提供快速的写入性能。当MemStore达到一定大小时,其内容会被刷新到磁盘上,形成StoreFile。由于StoreFile是不可变的,因此在StoreFile生成后,所有的读操作都可以看到最新的写入。 -
版本控制:
HBase支持多版本数据存储,每个数据单元可以有多个时间戳版本。这意味着对同一行、同一列的多次写入将被存储为不同的版本,而不会覆盖之前的值,从而解决并发写入可能引发的冲突。
高可用性
-
自动故障转移:
HBase使用ZooKeeper来监控集群状态,包括Master和各个RegionServer的状态。当RegionServer失败时,ZooKeeper会检测到这一情况,并通知HBase Master。Master随后将失败的RegionServer上的数据Region分配给其他的RegionServer,从而恢复服务。这个过程是自动的,无需人工干预。 -
Region复制:
HBase提供了Region复制(Region Replication)功能,允许用户为表中的数据设置多个副本(Replica)。每个副本都存储在不同的RegionServer上,这不仅提高了读取性能,而且增强了容错能力,因为一个副本的失效可以通过其他副本来补偿。 -
负载均衡:
HBase Master定期进行负载均衡操作,重新分配Region,以确保RegionServer之间的负载均匀。这有助于避免某些服务器因负载过重而导致性能下降或服务不可用。 -
Master的高可用配置:
在生产环境中,通常配置多个HBase Master以实现高可用性。其中一个Master作为主Master运行,其他的保持在待命状态。如果主Master失败,一个备用Master将自动接管成为新的主Master,从而确保管理操作的连续性。 -
定期的数据快照和备份:
HBase的Snapshot机制允许用户在某一时刻对表进行快照,以便进行数据备份和恢复。快照机制确保了在快照创建时,表中的数据状态被固定,提供了一致的视图。
通过这些机制,HBase能够在分布式环境中提供高数据一致性和高可用性,使其成为大规模数据存储和处理的理想选择。
🧐 HBase中列族和表之间的关系是怎样的?
在HBase中,列族(Column Family)和表(Table)之间的关系是密切且定义明确的。以下是列族和表之间的关系详细说明:
-
表的结构:
- HBase中的表是由行(Row)和列(Column)组成的,这些行和列存储非结构化或半结构化的大数据。
- 表中的所有数据都是按照列族来组织的。在HBase中,列族是数据存储和管理的基本单位。
-
列族的定义:
- 列族是一组具有相同属性的列(Column)的集合。列族在HBase中的定义是静态的,即在创建表时必须定义列族,而列(Column)是动态的,可以在表创建后随时添加。
- 列族的概念类似于关系型数据库中的“表”,但是它们在结构和性能上有显著差异。
-
列族的存储:
- 在HBase的物理存储中,每个列族的数据存储在不同的HFile中。这些HFile存储在底层的Hadoop分布式文件系统(HDFS)上。
- 同一列族中的数据会被存储在同一块磁盘空间上,这有助于提高数据的读写性能,因为相关的数据操作可以在同一列族内进行。
-
表的划分:
- HBase中的表可以根据行键(Row Key)的范围被水平分割成多个区域(Region)。每个Region负责表中的一部分数据。
- 每个Region可以进一步划分为多个Store,每个Store对应一个列族。因此,一个Region包含多个Store,每个Store存储该列族的所有数据。
-
列族的属性:
- 列族具有一些属性,如版本数量(VERSIONS)、存活时间(TTL)、布隆过滤器(BLOOMFILTER)、数据块大小(BLOCKSIZE)等,这些属性可以在创建表时设置,并且对整个列族生效。
- 这些属性有助于优化数据的存储和访问性能,以及控制数据的生命周期。
-
表的读写操作:
- 在HBase中,对表的读写操作通常是针对特定的列族进行的。例如,你可以读取或写入某个特定行的某个列族中的数据。
- 由于列族的设计,HBase可以高效地执行批量读写操作,特别是当操作涉及整个列族时。
-
表的扩展性:
- HBase表的设计支持动态扩展。你可以在不影响现有数据和操作的情况下,向表中添加新的列族。
- 这种灵活性使得HBase能够适应不断变化的数据需求和业务场景。
总结来说,列族是HBase表的一个核心组成部分,它们定义了表的结构和存储方式,并对表的性能和可扩展性有着重要影响。在设计HBase表时,合理规划列族是至关重要的。
命令行示例
HBase提供了一个强大的命令行接口,称为HBase Shell,它允许用户执行各种管理任务和数据操作。以下是一些常用的HBase Shell命令及其说明:
连接到HBase Shell
hbase shell
查看当前HBase Shell版本
version
创建表
create 'table_name', 'column_family'
删除表
disable 'table_name'
drop 'table_name'
列出所有表
list
启用表
enable 'table_name'
禁用表
disable 'table_name'
查看表的详细信息
describe 'table_name'
插入数据
put 'table_name', 'row_key', 'column_family:column_qualifier', 'value'
获取单行数据
get 'table_name', 'row_key'
获取多行数据
get 'table_name', 'row_key1'
get 'table_name', 'row_key2'
扫描表
scan 'table_name'
扫描表并使用过滤器
scan 'table_name', {FILTER => "SingleColumnValueFilter 'column_family', 'column_qualifier', =, 'binary:your_value'"}
删除单行中的单个单元格
delete 'table_name', 'row_key', 'column_family:column_qualifier'
删除整行数据
deleteall 'table_name', 'row_key'
清空表(删除所有行)
truncate 'table_name'
检查表是否存在
exists 'table_name', 'row_key'
添加列族
alter 'table_name', 'add', 'column_family'
修改列族
alter 'table_name', 'modify', 'column_family', 'MAX_VERSIONS => 5'
删除列族
alter 'table_name', 'delete', 'column_family'
退出HBase Shell
quit
查看集群状态
status 'table_name'
批量执行命令
可以使用batch
命令来执行一系列操作,例如:
batch
put 'table_name', 'row_key1', 'column_family:column_qualifier', 'value1'
put 'table_name', 'row_key2', 'column_family:column_qualifier', 'value2'
# ... 更多操作 ...
execute
这些命令提供了对HBase表的基本操作和管理能力。在使用这些命令之前,请确保HBase服务正在运行,并且你有足够的权限来执行这些操作。更多高级命令和选项可以通过在HBase Shell中输入help
来获取。
相关文献
【数据库知识】今天聊聊WAL(预写日志)
【大数据】一文教你看懂什么是Hadoop