大数据开发(HBase真题)
- 一、HBase与其他系统的比较
-
- 1、Hive与HBase之间的主要区别
- [2、Apache HBase与关系数据库之间的区别](#2、Apache HBase与关系数据库之间的区别)
- 二、HBase基础概念
-
- 1、HDFS与HBase简介及适用场景
- [2、HBase Column Family的概念](#2、HBase Column Family的概念)
- 3、HBase的特点
- 三、HBase存储与原理
-
- 1、HBase中Region太大或者太小会有什么问题?
- 2、HBase读写原理
- 3、HBase存储结构
- [4、HBase LSM树原理](#4、HBase LSM树原理)
- 四、HBase架构与操作
一、HBase与其他系统的比较
1、Hive与HBase之间的主要区别
Hive是基于SQL查询引擎构建再Hadoop上,使得对存储再分布式存储系统中结构化和半结构化数据进行查询更加方便。它提供了一个高度抽象化层次,在底层通过MapReduce执行查询操作。
而HBase是一个分布式、可伸缩、面向列存储、建立在Apache Hadoop上面的NoSQL数据块系统。它适用于海量非结构化或半结构化数据,并且支持快速随机读写。
主要区别包括:
- 数据模型 :Hive使用基于表格模型(Tables),而HBase则使用列族(column family)。
- 数据访问方式 :Hive是SQL查询引擎,支持类似关系型数据库的查询语言,而HBase提供了基于键值的随机读写接口。
- 写入和读取延迟 :Hive的数据写入和读取通常较慢,因为它依赖MapReduce作业,而HBase可以提供更低的延迟。
2、Apache HBase与关系数据库之间的区别
- 数据模型 :HBase使用NoSQL模型,其中的数据以键值对的形式存储在表格中,而关系型数据库使用表格和行列来组织数据。
- 可扩展性 :HBase是基于分布式系统设计的,可以水平扩展到成千上万台机器。而关系数据库通常只能在单个服务器上进行水平扩展。
- 一致性 :HBase提供了最终一致性模型,即使在发生节点故障时也能保证数据最终会达到一致状态。关系数据库则通常提供强一致性保证。
二、HBase基础概念
1、HDFS与HBase简介及适用场景
HDFS是Hadoop生态系统中的一部分,是一种高容错、高可靠性、分布式文件系统。数据以块的形式进行存储,在集群中分布在多个节点上。HDFS适合用于大规模数据处理,具有高吞吐量和扩展性,并且支持并行读写操作。
HBase是一个构建在Hadoop上的面向列的NoSQL分布式数据库。它提供了快速随机访问大型数据集的能力,并具有强大的横向扩展能力。HBase适合用于需要实时访问和查询海量结构化数据的场景,例如提供实时分析和查询。
2、HBase Column Family的概念
HBase是一个分布式的列式数据库,其数据存储在HDFS中。在HBase中,数据以表格形式存储,每个表格被分割成多个行和列族(Column Family)。如:表名:SchoolInfo;
列族:basicInfo:存储学生的基本信息,grades:存储学生的成绩信息。
Column Family是HBase中的一个重要概念,它是表格的逻辑分组。每个Column Family可以包含多个列限定符(Column Qualifier)。在物理存储上,HBase会将同一Column Family的数据存储在一起,以提高读写性能。
Column Family的定义在创建表格时进行,一旦创建后,无法对Column Family进行修改。每个Column Family可以独立地设置存储策略和压缩算法,以满足不同的数据需求。
在HBase中,通过指定表格名称和Column Family的名称,可以访问和操作特定的数据。这种设计使得HBase能够高效地存储和查询大规模地结构化数据。
3、HBase的特点
- 高可靠性:HBase采用HDFS作为底层存储,支持数据的冗余备份和自动恢复,保证数据的高可靠性。
- 高扩展性:HBase可以在成百上千台服务器上存储海量数据,并能够实现水平扩展,通过增加服务器节点来提升存储能力和吞吐量。
- 高性能:HBase采用稀疏存储结构,只存储有值的数据,减少了磁盘IO,同时支持快速随机读取,适用于大规模数据的实时访问。
- 高并发性:HBase支持多线程并发访问,可以同时处理大量的读写请求,适用于高并发的应用场景。
- 灵活的数据模型:HBase适用列族-列-行的数据模型,支持动态添加列和列族,可以根据需求灵活调整数据结构。
- 支持数据分片:HBase将数据按照Rowkey进行分片存储,每个Region Server负责管理一部分数据,实现数据的负载均衡和并行处理。
- 支持数据版本控制:HBase支持数据的多版本存储,可以根据时间戳或版本号获取历史数据,方便进行数据分析和回溯。
三、HBase存储与原理
1、HBase中Region太大或者太小会有什么问题?
HBase中Region过大或过小都会引发一些问题。
如果Region过大,可能会导致一下问题:
- 写入热点 :当Region过大时,所有的写入操作都会集中在一个Region上,导致该Region成为写入热点,造成写入性能瓶颈。
- 延迟增加 :由于Region过大,读取操作需要扫描大量的数据,导致读取延迟增加。
- 不均衡的负载 :Region多大可能会导致负载不均衡,使得某些Region服务器上的负载较重,而其它服务器负载较轻。
如果Region过小,可能会引发一下问题:
- 资源浪费 :每个Region都需要占用一定的资源,包括内存和磁盘空间。当Region过小时,可能会导致资源的浪费。
- 元数据开销 :Region边界的变动需要更新HBase的元数据,当Region过小时,元数据更新的频率会增加,可能会影响HBase的整体性能。
- 负载不均衡 :Region的过小可能导致负载不均衡,某些Region服务器的负载较轻,而其它服务器上负载较重。
2、HBase读写原理
HBase是一个分布式、面向列的NoSQL数据库,它基于Hadoop的分布式文件系统(HDFS)存储数据,并使用Hadoop的MapReduce进行计算。下面是HBase的读写原理:
- 读取数据:
- 当客户端请求读取数据时,首先需要根据数据的行键(row key)定位到对应的Region Server。
- 在Region Server中,HBase使用MemStore和HFile两个存储结构来存储数据。MemStore是内存中的一个有序数据结构,用于暂时存储最新写入的数据。HFile是磁盘中的存储文件,用于持久化存储数据。
- 当在MemStore中找不到所需的数据时,HBase会去HFile中查找。它通过索引文件(HFile中的Blomm Filter和Block Index)快速定位到所需的数据块,并从磁盘读取数据。
- 一旦找到数据,HBase会将其返回给客户端。
- 写入数据:
- 当客户端请求写入数据时,首先需要确定数据所属的Region Server。
- 在Region Server中,数据首先会被写入到MemStore中,这是一个内存缓冲区。
- 当MemStore中的数据达到一定的大小阈值时,或者达到一定的时间阈值时,MemStore中的数据会被刷新到磁盘,生成一个新的HFile。
- HFile会被存储到HDFS中,并且被分成多个块进行存储。
- 同时,HBase会更新HBase的元数据(如Region的位置、表的结构等)。
- 当需要写入的数据量较大时,HBase还会进行数据预分区,将数据分布到不同的Region中,以实现负载均衡和并行写入。
3、HBase存储结构
HBase是一种分布式的、面向列的开源数据块系统,它基于Hadoop的HDFS分布式文件系统进行数据存储。HBase的存储结构可以简单描述为一下几个部分:
- 表(Table) :HBase中的数据是以表的形式进行存储的,每个表可以被分割成多个区域(Region)。表(Table):UserActivityLog。
- 行键(Row Key) :HBase的表的每一个行都有一个唯一的行键,行键是字节流的形式,用于唯一标识一行数据。行键(Row Key):用户ID和时间戳的组合,如 UserID_20240312T103000,这样可以保证数据的时间序列顺序,并且方便根据用户ID和时间进行查询。
- 列族(Column Family) :HBase的表中的每一列都属于一个列族,列族是逻辑上的概念,用于对列进行分组。每个列族都有一个唯一的名称。actions:存储用户的各种行为数据。
- 列(Column) :HBase的表中的数据是以列的形式进行存储的,每个列都有一个唯一的列限定符(Column Qualifier),它与列族名称一起构成列的唯一标识。actions:browse:用户浏览商品的日志。actions:cart:用户添加商品到购物车的日志。actions:purchase:用户购买商品的日志。
- 单元格(Cell) :HBase的表中的每个单元格都由行键、列族和列限定符组成,它存储着具体的数据值。例如,UserID_20240312T103000的actions:browse列可能存储了用户浏览商品的具体日志。
- 版本(Version):HBase中的每个单元格可以存储多个版本的数据,每个版本都有一个时间戳,用于对数据进行版本控制。
4、HBase LSM树原理
LSM树(Log-Structured Merge Tree)是一种用于存储和管理数据的数据结构,它主要用于解决写放大(writeamplification)问题。LSM树主要由两个组件组成:内存中的跳表(memtable)和磁盘中的多层有序磁盘文件(SSTables)。
LSM树的原理如下:
- 写操作 :当有写操作时,数据首先被写入内存中的跳表(memtable)。跳表是一个有序的数据结构,可以快速插入和查询数据。写入内存的操作是原子的,因此具有较高的写入性能。
- 内存满 :当内存中的跳表达到一定大小时,会被冻结,并将其转换为一个不可变的有序磁盘文件,称为SSTable(Sorted String Table)。SSTable会被写入磁盘,并在磁盘上保持有序。
- 合并操作 :当有多个SSTable存在时,会定期触发合并操作。合并操作将多个SSTable合并为一个新的SSTable,并将旧的SSTables标记为删除。合并操作的目的是减少磁盘上的数据冗余,提高查询性能。
- 读操作 :当有读操作时,首先会在内存中的跳表中查找数据。如果未找到,则会在磁盘上的SSTables中查找。由于SSTables是有序的,可以使用一种称为Bloom Fileter的数据结构来快速过滤不存在的数据,从而提高读取性能。
四、HBase架构与操作
1、介绍下HBase架构
- HMaster :HBase集群的主节点,负责管理和协调整个集群的操作。它处理元数据和表的分区信息,控制RegionServer的负载均衡和故障恢复。
- RegionServer :HBase集群中的工作节点,负责存储和处理数据。每个RegionServer管理若干个Region,每个Region负责存储一部分表的数据。RegionServer处理读写请求,并与HDFS交互来存储和获取数据。
- ZooKeeper :HBase使用ZooKeeper来进行协调和管理。ZooKeeper负责选举HMaster节点,并存储HBase集群的元数据,以及监控和管理集群的状态。
- HDFS :HBase使用HDFS作为底层的分布式文件系统,用于存储数据。HBase将数据以Region的形式存储在HDFS上,每个Region对应一个HFile。
- HFile :HBase使用HFile来存储数据。HFile是一个有序的、可压缩的、支持随机读写的文件格式,用于高效地存储和检索数据。
- MemStore :每个RegionServer都有一个内存缓存区域,称为MemStore。当写入数据时,数据首先被写入MemStore,然后再定期刷新到磁盘上的HFile。
- WAL(Write Ahead Log) :HBase使用WAL来保证数据的持久性和一致性。WAL是一个追加写入的日志,用于记录所有的写操作。在发生故障时,可以通过重放WAL来恢复数据。
2、HBase读写数据流程
HBase是一个面向大规模数据集的分布式存储系统。它基于Hadoop分布式文件系统(HDFS)构建,并提供了可靠性、高性能和高伸缩性的数据存储解决方案。
HBase的数据读写流程如下:
- 客户端发起读写请求 :应用程序通过HBase客户端API向HBase集群发起读写请求。
- 客户端与Zookeeper交互 :HBase客户端与Zookeeper集群进行交互,以获取HBase集群的元数据信息,如表的信息、区域服务器等。
- 客户端与HMaster交互 :HBase客户端向HMaster发送读写请求,请求涉及到的表和列族的元数据信息。
- HMaster分配RegionServer :HMaster根据表的元数据信息,将对应的RegionServer分配给客户端。
- 客户端与RegionServer交互 :客户端与被分配的RegionServer进行通信,发送具体的读写请求。
- RegionServer处理请求 :RegionServer接收到请求后,根据HBaser表的数据分布规则(Row Key)定位到对应的Region。
- RegionServer与HDFS交互 :RegionServer通过HDFS访问底层的数据文件,进行读取或写入操作。
- 数据读写完成 :RegionServer将读取到的数据或写入的数据返回给客户端。
3、HBase的读写缓存
写缓存 :HBase在接收到写请求后,会将数据先写入内存中的写缓存(Write Ahead Log),然后再异步地将数据刷写到磁盘上的数据文件。这种机制可以提高写入性能,因为内存的写入速度远快于磁盘的写入速度。
读缓存 :HBase再读取数据时,首先会尝试从内存中读缓存(BlockCache)中读取数据,如果缓存中没有相应的数据,则需要从磁盘上的数据文件中读取。读缓存可以提高读取性能,因为内存的读取速度远快于磁盘的读取速度。
4、在删除HBase中的一个数据的时候,它什么时候真正的进行删除呢?
在HBase中,删除操作并不会立即将数据从存储中删除。实际上,删除操作只是在数据的特定版本上打上一个删除标记,标记该数据已经被删除。这是因为HBase使用LSM存储结构。
当执行删除操作时,HBase会创建一个新的版本,并将该版本的数据标记为删除。之后,HBase会在后续的Major Compaction(主要合并)或Minor Compaction(次要合并)过程中,才会真正将带有删除标记的数据从存储中清除。
Major Compaction是指HBase将所有的HFile文件进行合并,以减少存储空间的占用,并清理已标记为删除的数据。Major Compaction通常由系统自动触发,但也可以手动执行。
Minor Compaction是指HBase将相邻的小文件进行合并,以减少文件数量和提高读取性能。Minor Compaction也会清理已标记为删除的数据。
5、HBase的一个region由哪些东西组成?
- 行键范围(start key 和 end key) :每个region都有一个唯一的行键范围,用于标识该region负责存储的数据范围。
- MemStore :每个region都有一个内存中的MemStore,用于缓存该region内的写入操作。当MemStore的大小达到一定阈值时,会将其刷新到磁盘上的HFile。
- HFile :每个region都包含一个或多个HFile,用于持久化存储该region内的数据。HFile是HBase中的底层存储格式,以块的形式存储数据,并提供快速的读取和写入操作。
- WAL(Write-Ahead-Log) :每个region都有一个WAL,用于记录该region内的写入操作。WAL在写入操作发生时先将操作记录到日志中,然后再将数据写入MemStore。WAL的作用是保证数据的持久化和可恢复性。
- Region Server :每个region都由一个Region Server负责管理和处理。Region Server是HBase集群中的工作节点,负责处理读写请求、维护和管理region以及与HDFS进行交互。
6、HBase的rowkey为什么不能超过一定的长度?为什么要唯一?rowkey太长会影响HFile的存储?
是的,HBase的rowkey不能超过一定的长度是为了保证HBase的性能和存储效率。当rowkey过长时,会导致HBase在存储数据时需要占用更多的存储空间,同时也会增加数据的读取和检索的时间。
HBase的存储结构是基于HFile的,HFile使用了类似B+树的索引结构来组织数据。当rowkey过长时,HFile中的索引节点需要占用更多的存储空间,从而导致HFile文件变大,进而影响了存储性能。
此外,rowkey的唯一性是HBase中数据的检索和存储的重要依据。HBase使用rowkey来进行数据的分布和定位,保证了数据在分布式环境下的高效读写和检索。如果rowkey不唯一,可能会导致数据覆盖或重复存储的问题。
7、HBase的Get和Scan的区别和联系
HBase的Get和Scan是两种不同的读取数据的方式。
Get操作 :是通过指定行键(rowkey)来获取单个数据行的详细信息。通过Get操作,可以获取到指定行键对应的完整数据行,包括所有的行族和列的数据。Get操作适用于需要获取指定行的详细信息的场景。
Scan操作 :是通过指定起始行键和终止行键来获取一系列数据行的信息。通过Scan操作,可以按照指定的范围获取多个数据行,范围可以是某个列族的所有数据,也可以是某个列族下某些列的数据。Scan操作适用于需要按照范围获取多个数据行的场景。
8、HBase的预分区
HBase的预分区是将HBase的表按照指定的规则提前进行分区划分,以便在数据插入时自动将数据分散到不同的Region Server上。这样可以提高数据的负载均衡和查询性能。
预分区可以通过在创建表时指定预分区键来实现。预分区键可以是任意的字节数组,通常是根据数据的特点和访问模式来选择的。
预分区的好处是可以保证数据均匀分布在集群的不同Region Server上,避免数据倾斜问题。此外,预分区还可以提高查询的并行性,因为查询可以同时在多个Region Server上进行。
预分区的规则可以是基于哈希值,也可以是基于范围。基于哈希值的预分区可以确保数据均匀分布,但可能导致某些特定查询需要跨多个Region Server进行。基于范围的预分区可以根据数据的顺序进行分区,可以提高某些特定查询的性能。
9、既然HBase底层数据是存储在HDFS上,为什么不直接使用HDFS,而还要用HBase?
首先,HDFS是一个分布式文件系统,主要用于存储大规模数据文件。它具有高容错性、高吞吐量和拓展性好等特点,适用于顺序读写大文件。但是,HDFS并不适用进行随机读写操作,因为它对小文件的支持不够高效。
相比之下,HBase是一个分布式的、面向列的NoSQL数据块。它在HDFS上建立了一层抽象,提供了快速的随机读写能力。HBase的设计目标是支持高并发、低延迟的在线数据访问,适用于实时的数据查询和更新。另外,HBase还提供了强一致性的数据模型和灵活的数据模式,可以根据需求动态地添加和删除列。