HBaseExamReview
HBase 考察知识点复习
知识点(选择)
Region的分裂
在HBase中,
Region
是数据管理的基本单位,类似于关系型数据库中的分区。它是 HBase 数据存储和组织的核心概念之一。Region
的概念和特点:Region
是HBase
数据管理的基本单位,它负责存储一定范围内的数据。每个Region
由一个起始RowKey
和 终止RowKey
定义,负责存储该范围内的数据。与关系型数据库中的分区类似,HBase
中的Region
可以根据数据量的大小进行动态调整。当一个Region
的数据量过大时,它会被 分裂 成两个新的Region
。相反,当数据量较小时,两个或多个Region
可能会合并成一个新的Region
。当
MemStore
的数据超过阈值时,将数据溢写磁盘,生成一个StoreFile
文件。当Region
中最大Store
的大小超过阈值时,Region
分裂,等分成两个Region
,实现数据访问的负载均衡。新的Region
的位置由HMaster
来确定在哪个RegionServer
中。查看表结构的命令
1 | [subowen@bigdata ~]$ hbase shell |
启动和关闭
HBase Shell
的命令启动
HBase Shell
之前需要保证ZooKeeper
、Hadoop HDFS
和HBase
已经启动。可以使用hbase shell
进入HBase Shell
,在HBase Shell
中可以使用exit
或quit
退出。
1 | [subowen@bigdata ~]$ zkServer.sh start |
- 启动
ZooKeeper
和查看ZooKeeper
的运行状态的命令
1 | [subowen@bigdata ~]$ zkServer.sh start |
修改表结构的命令
使用
alter
命令可以对表的结构进行修改:表名创建时写的所有和列族相关的信息,都可以后续通过
alter
修改,包括增加、删除列族。① 增加列族和修改信息都使用覆盖的方法
修改列族的版本,
VERSIONS => 6
:1
2
3
4
5hbase(main):001:0> alter 'bigdata:person', NAME => 'name', VERSIONS => 6
Updating all regions with the new schema...
1/1 regions updated.
Done.
Took 4.0145 seconds 添加列族
tel
:1
2
3
4
5hbase(main):002:0> alter 'bigdata:person', NAME => 'tel', VERSIONS => 6
Updating all regions with the new schema...
1/1 regions updated.
Done.
Took 2.4498 seconds 查看修改后的数据:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17hbase(main):003:0> describe 'bigdata:person'
Table bigdata:person is ENABLED
bigdata:person
COLUMN FAMILIES DESCRIPTION
{NAME => 'msg', VERSIONS => '6', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE => 'fal
se', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLICATION_SCOPE => '0', BLOOMFILTER => 'ROW', CACHE_INDEX_ON_WRITE => 'false', IN
_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536'}
{NAME => 'name', VERSIONS => '5', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE => 'fa
lse', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLICATION_SCOPE => '0', BLOOMFILTER => 'ROW', CACHE_INDEX_ON_WRITE => 'false', I
N_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536'}
{NAME => 'tel', VERSIONS => '6', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE => 'fal
se', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLICATION_SCOPE => '0', BLOOMFILTER => 'ROW', CACHE_INDEX_ON_WRITE => 'false', IN
_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536'}
3 row(s)
Took 0.0795 seconds② 删除列族
删除列族可以用以下两种方式:
1
2
3
4
5hbase(main):001:0> alter 'bigdata:person', NAME => 'tel', METHOD => 'delete'
Updating all regions with the new schema...
1/1 regions updated.
Done.
Took 2.1046 seconds1
2
3
4
5hbase(main):002:0> alter 'bigdata:person', 'delete' => 'msg'
Updating all regions with the new schema...
1/1 regions updated.
Done.
Took 2.9721 secondsHBase
的Java API
中,数据表描述的对象是什么?TableDescriptor
1
TableDescriptor
ZooKeeper
的访问端口号,HBase
的Web访问端口号ZooKeeper
的访问端口号为2181
HBase
的 Web 访问端口号为16010
修改表中列族的
Version
版本的命令
1 | alter 'table_name', {NAME => 'column_family', VERSIONS => number_of_versions} |
删除表中数据的命令
1
delete 'ns:tb', 'rk', 'cf:col'
启动和关闭ZooKeeper的命令
1
2
3
4
5# 启动 ZooKeeper
zkServer.sh start
# 关闭 ZooKeeper
zkServer.sh stop更新表数据的命令
1
alter 'ns:tb', {NAME => 'cf:col', VERSIONS => 5}
HBase安装时,配置文件有那几个?
hbase-env.sh
hbase-site.xml
regionservers
.bashrc
关于NoSQL数据库有哪些?
HBase
Cassandra
BigTable
删除表操作
1 | disable 'ns:tb' |
HBase进程名,ZooKeeper 的进程名等相关进程
HMaster
HRegionServer
QuorumPeerMain
HBase
依托于哪个文件存储系统?HBase
主要依托于Hadoop HDFS
。创建表的语法结构
1
create 'ns:tb', {NAME => 'cf', VERSIONS=5}
查询表数据的Shell语法
1
2
3get 'r1', {COLUMN => 'cf:col'}
scan 'ns:tb'什么是列族
COLUMN FAMILY
HBase的数据类型
- 数据类型
- 基本数据类型
- 字符串(String):用于存储文本数据,如名称、描述等。
- 整数(Int):用于存储整数数据,如计数、编号等。
- 浮点数(Float):用于存储小数数据,如金额、比率等。
- 布尔值(Boolean):用于存储逻辑值,如是否、有效等。
- 复合数据类型
- 列族(Column Family):列族是HBase表中数据的组织方式,用于存储一组相关的列。列族是HBase表中数据的基本组织单位,每个列族对应一个数据节点。
- 列(Column):列是HBase表中数据的基本单位,用于存储一组相关的单元格。列可以包含多个单元格,每个单元格对应一个数据值。
- 单元格(Cell):单元格是HBase表中数据的基本单位,用于存储一组相关的数据值。单元格包含一个键(Row Key)、一个列(Column)和一个值(Value)。
- 基本数据类型
- 数据模型
- NameSpace:命名空间,类似于关系型数据库的
Database
概念,每个命名空间下有多个表。HBase 两个自带的命名空间,分别是hbase
和default
,hbase
中存放的是HBase
内置的表,default
表是用户默认使用的命名空间。 - Table:类似于关系型数据库的表概念。不同的是,HBase 定义表时只需要声明列族即可,不需要声明具体的列。因为数据存储是稀疏的,所以往 HBase 写入数据时,字段可以动态、按需指定。因此,和关系型数据库相比,HBase 能够轻松应对字段变更的场景。
- Row:
HBase
表中的每行数据都由一个 RowKey 和多个 Column(列)组成,数据是按照RowKey
的字典顺序存储的,并且查询数据时只能根据RowKey
进行检索,所以RowKey
的设计十分重要。 - Column:
HBase
中的每个列都由Column Family
(列族)和Column Qualifier
(列限定符)进行限定,例如info:name
,info:age
。建表时,只需指明列族,而列限定符无需预先定义。 - Time Stamp:用于标识数据的不同版本
Version
,每条数据写入时,系统会自动为其加上该字段,其值为写入HBase
的时间。 - Cell:由
{rowkey, column Family:Column Qualifier, timestamp}
唯一确定的单元。Cell
中的数据全部是字节码形式存贮。
- NameSpace:命名空间,类似于关系型数据库的
- 数据类型
判断题
HBase
本身是用C++
语言编写的,因此具有很高的执行效率。( × )HBase
本身是由Java
语言编写的,尽管使用Java
,其执行效率还是较高的。HBase
优化目前主要工作集中于Rowkey
优化。( × )HBase
的优化目前主要工作集中在RowKey
的设计、参数优化、JVM
调优等方面。可以想象
HBase
是通过**”三维”**的表来存储数据的,通过时间戳保存数据的历史版本。( √ )安装
HBase
完全分布式时,需要确保SSH
和JDK
是可以正常使用的。( √ )在安装 HBase 的完全分布式部署时,确保
SSH
和JDK
可以正常使用是非常重要的。具体来说:SSH:在分布式部署中,
HBase
的各个节点之间需要进行通信和协作,而SSH
是用于在不同节点之间建立安全连接的工具。确保节点之间可以互相访问、通信和传输文件是部署HBase
所必需的。通常需要设置免密登录,以便在节点之间进行信息交换而无需手动输入密码。JDK:HBase 是基于
Java
编程语言开发的,因此必须确保在每个节点上安装并配置了适当的JDK
。HBase
运行需要Java
环境,且为了确保HBase
能够正常工作,必须保证每个节点都能够使用正确的JDK
版本。
Hadoop
中引入HBase
的其中一个原因是:HDFS
在处理连续数据时比较吃力。( × )·HDFS
的设计目标之一就是为了有效地处理大规模数据,包括连续数据(如大文件、数据流等)和离散数据(如小文件、批量数据等)。Hadoop
中之所以引入HBase
,是需要HBase
提供实时访问数据的能力,使得Hadoop
生态系统更全面(此外还有高可伸缩性、高容错、多版本策略等)。利用
HBase
技术可在廉价PC Server
上搭建起大规模结构化存储集群。( √ )HBase
是Hadoop
生态系统的一个组成部分。( √ )HBase
是继Google Bigtable
之后创建的分布式、开源、版本化、非关系型数据库。它是Hadoop
生态系统的重要组件,利用HDFS
的容错功能,提供对数据的实时读写访问。HBase
尽管是数据库,但也可以称为数据存储系统,因为它不提供触发器、查询语言和二级索引等RDBMS
功能。使用
HBase
时,无需启动服务就可以直接在开发环境中调用HBase
的相关功能。( × )HBase
是基于Hadoop
的,在使用HBase
之前需要启动ZooKeeper
和Hadoop
才能使用HBase
。配置
HBase
分布式部署的过程中,可以通过cp
命令把文件复制到运行在不同机器上的节点中。( × )可以使用
scp
命令、rsync
命令,或者基于rsync
编写工具xsync
进行传输。
填空题
判断表是否存在,禁用表,删除表,创建表,查看命名空间等
Shell
命令。- 判断表是否存在 :
exists 'namespace_name:table_name'
- 禁用/启用表:
disable 'namespace_name:table_name'
/enable namespace_name:table_name
- 删除表:删除表之前需要禁用表,
disable 'namespace_name:table_name'
,然后再删除表,drop 'namespace_name:tablename'
- 创建表:
create 'namespace_name:table_name', {NAME => 'cf1', VERSION=5}, {NAME => 'cf2', VERSION=5}
- 查看命名空间:
list_namespace
- 判断表是否存在 :
HBase
的进程有哪些:关于这些进程的详细说明见QuickPassHBase
或 简答题 T4。HBase
的主要进程:HMaster
、HRegionServer
HBase
所依赖的两个外部的服务:ZooKeeper
、HDFS
行键是什么:
rowkey
在
HBase
中,行键唯一标识了HBase
表的一行,可以通过单个行键或行键区间的方式访问表。行键保存为 字节数组 ,以字典序 排序存储。HBase
是一个什么样的分布式存储系统。(非关系型)Apache HBase™
是以HDFS
为数据存储的,一种分布式、可扩展的NoSQL
数据库。HBase 是一款面向列存储,用于存储处理海量数据的 NoSQL 数据库。HBase 的理论原型是 Google 的 BigTable 论文。他是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统。
简答题
HBase
的基础核心组件有哪些?分别什么作用?HBase-Client
客户端,用来访问HBase
集群。可以和Hbase
交互,也可以和HRegionServer
交互。通过HBase RPC
来访问对应的接口。这里的客户端模式有多种,可以是
Thrift
、Avro
、Rest
等。另外,
hbase-client
自身会缓存region
的一些信息。ZooKeeper
作用:HMaster
的高可用- 存储
ROOT
表的地址、HMaster
的地址 - 存储所有
HRegionServer
的状态,监控HRegionServer
的上下限 - 存储
HBase
的一些Schema
和Table
的元数据
HMaster
HMaster可以启动多个,通过选举机制来保证只有一个
HMaster
正常运行并提供服务,其他的HMaster
作为standby
来保证高可用。HMaster
主要负责 表 和 Region 的管理工作。如:- 用户对表的增删改查
- 管理
RegionServer
的负载均衡,调整Region
的分布 - 在
RegionServer
宕机或下线后,负责迁移RegionServer
上的Region
到其他的RegionServer
上 Region
在分裂后,负责分配新的Region
HRegionServer
HRegionServer
是HBase
中真正的工作节点,主要负责响应用户的 I/O 请求,向 HDFS 文件系统读写数据,以及 Region 的数据文件的合并和拆分等,是 HBase 中最核心的模块。在
HBase
中,一张表由多个的HRegion
组成,一个HRegionServer
中管理着多个HRegion
对象。而一个HRegion
由多个HStore
组成,每个HStore
对象都对应着表的一个列族 (Column Family)。之后,一个HStore
又由一个MemStore
和多个StoreFile
组成。这些StoreFile
就是hbase
存储在HDFS
上的数据文件,MemStore
表示还在内存中未刷新到文件上的那些数据。
HBase
的写流程, 读流程?写流程
写流程顺序正如
API
编写顺序,首先创建HBase
的重量级连接。① 首先访问
ZooKeeper
,获取hbase:meta
表位于哪个Region Server
② 访问对应的
Region Server
,获取hbase:meta
表,将其缓存到连接中,作为连接属性MetaCache
,由于meta
表具有一定的数据量,导致了创建连接比较慢;之后使用创建的连接获取
Table
,这是一个轻量级的连接,只有在第一次创建的时候会检查表格是否存在访问RegionServer
,之后在获取Table
时不会访问RegionServer
③ 调用
Table
的put
方法写入数据,此时还需要解析RowKey
,对照缓存的MetaCache
,查看具体写入的位置有哪个RegionServer
④ 将数据顺序写入(追加)到
WAL
,此处写入是直接落盘的,并设置专门的线程控制WAL
预写日志的滚动(类似 Flume);⑤ 根据写入命令的
RowKey
和ColumnFamily
查看具体写入到哪个MemStore
,并且在MemStore
中排序⑥ 向客户端发送
ACK
⑦ 等达到
MemStore
的刷写时机后,将数据刷写到对应的Store
中。读流程
读流程创建连接的方式同写流程。创建完连接后:
① 创建
Table
对象发送get
请求。② 优先访问
Block Cache
(读缓存),查找是否之前读取过,并且可以读取HFile
的索引信息和布隆过滤器。③ 不管读缓存中是否已经有数据了(可能已经过期了),都需要再次读取写缓存和
store
中的文件。④ 最终将所有读取到的数据合并版本,按照
get
的要求返回即可。
HBase
的特点有哪些?优点或缺点?HBase的特点:(强 / 自动 / 高 / 海集 / 并 / 列 / 多 / 块 / 运行 / 稀)
强一致性的读/写:
HBase
不是”最终一致性”数据库,它非常适合于诸如高速计数器聚合等任务。自动分片:
HBase
中的表通过Region
分布在集群上,而且Region
会随着数据的增长自动拆分和重新分布。高可靠性:自动
RegionServer
故障转移,WAL
机制保证了数据写入时不会因集群异常而导致写入数据丢失,Replication
机制保证了在集群出现严重的问题时,数据不会发生丢失或损坏。而且HBase
底层使用HDFS
,HDFS
本身也有备份。Hadoop/HDFS
集成&海量存储:,HBase
支持HDFS
开箱即用作为其分布式文件系统。HBase 作为一个开源的分布式Key-Value
数据库,其主要作用是面向 PB 级别数据的实时入库和快速随机访问。这主要源于上述易扩展的特点,使得HBase
通过扩展来存储海量的数据。并行处理:
HBase
通过MapReduce
支持大规模并行处理,将HBase
用作源和接收器。列式存储:
HBase
是根据列族来存储数据的。列族下面可以有非常多的列。列式存储的最大好处就是,其数据在表中是按照某列存储的,这样在查询只需要少数几个字段时,能大大减少读取的数据量。(面向列)多种语言的 API:
HBase
支持使用Java
的API
来编程进行数据的存取,还支持使用Thrift
语言和REST
语言的API
来编程进行数据的存取。块缓存和布隆过滤器:
HBase
支持Block Cache
和Bloom
过滤器进行大容量查询优化。运行管理:
HBase
为业务洞察和JMX
度量提供内置网页。稀疏性:为空的列可以不占存储空间,表可以设计的非常稀疏。
HBase 的优点和缺点
HBase的优点:(动节/海存/负载/并拓)
- 动态增加&节省空间:在传统的关系数据库中,如果数据结构发生了变化,就需要停机维护,而且需要修改表结构,而在 HBase 中数据表内的列可以做到动态增加,并且列为空的时候不存储数据,从而节省存储空间。
- 海量数据存储:
HBase
适合存储 PB 数量级的海量数据,PB 级的数据在只采用廉价 PC 来存储的情况下,也可以在几十到一百毫秒内返回数据。这与HBase
的极易扩展息息相关,正因如此,HBase 为海量数据的存储提供了便利。 - 负载均衡:传统的通用关系数据库无法应对在数据规模剧增时导致的系统扩展性问题和性能问题。
HBase
可以做到自动切分数据,并且会随着数据的增长自动地拆分和重新分布。 - 高并发:
HBase
可以提供高并发的读写操作,而且可以利用廉价的计算机来处理超过 10 亿行的表数据 - 高拓展性:
HBase
具有可伸缩性,如果当前集群的处理能力明显下降,可以增加集群的服务器数量来维持甚至提高处理能力。
HBase
的缺点:(条查/复杂/JOIN/ACID/SQL)- 不支持条件查询:不能支持条件查询,只支持按照
RowKey
(行键)来查询,也就是只能按照主键来查询。这样在设计RowKey
时,就需要完美的方案以设计出符合业务的查询。 - 架构设计复杂:架构设计复杂,且使用
HDFS
作为分布式存储,因此只是存储少量数据,它也不会很快。在大数据量时,它慢的不会很明显。 - 不支持
Join
操作:HBase
不支持表的关联操作,因此数据分析是HBase
的弱项。常见的group by
或order by
只能通过编写MapReduce
来实现。 - 不支持ACID:
HBase
部分支持了ACID
- 不支持SQL语句查询:查询
HBase
时不支持通过SQL
语句进行查询。
- 不支持条件查询:不能支持条件查询,只支持按照
Master
和RegionServer
的作用是什么?HBase
包含一个Master
和许多个RegionServer
。Master
:实现类为HMaster
,负责监控集群中所有的RegionServer
实例。主要作用如下:管理元数据表格
hbase:meta
,接收用户对表格创建修改删除的命令并执行监控
Region
是否需要进行负载均衡,故障转移和Region
的拆分。
RegionServer
:实现类为HRegionServer
,主要作用如下:负责数据
Cell
的处理,例如写入数据put
,查询数据get
等。拆分合并
Region
的实际执行者,有master
监控,有RegionServer
执行。
编程题
Shell
创建命名空间的 Shell
1
create_namespace 'namespace_name'
创建表的 Shell
1
create 'namespace_name:table_name', {NAME => 'cf1', VERSION => 5}
修改表的 Shell
1
alter 'namespace_name:table_name', NAME => 'cf1', METHOD => 'delete'
插入数据的 Shell
1
put 'ns:tb', 'rk', 'cf:col', 'value'
查询数据的 Shell
get
最大范围是一行数据,也可以进行列的过滤,读取的结果为多行Cell
。Cell
的格式如下:{rowkey, column Familycolumn Qualifier, time Stamp}
。
1
get 'ns:tb', 'rk' , {COLUMN => 'cf:col'}
scan
用于扫描数据,能够读取多行数据,不建议扫描过多的数据,推荐使用startRow
和stopRow
来控制读取的数据,默认范围左闭右开。
1
scan 'namespace_name:table_name', {STARTROW => '1001',STOPROW => '1002'}
API
读写操作时
- 加载配置信息
- 获取
HBase
的链接对象 - 获取
Admin
对象 - 构造
TableName
对象 - 判断表是否存在
1 | public class Test { |
参考文献
HBaseExamReview