HBaseExamReview

HBase 考察知识点复习

知识点(选择)

  1. Region的分裂

    HBase中,Region 是数据管理的基本单位,类似于关系型数据库中的分区。它是 HBase 数据存储和组织的核心概念之一。
    Region 的概念和特点:
    RegionHBase 数据管理的基本单位,它负责存储一定范围内的数据。每个 Region 由一个起始 RowKey 和 终止 RowKey 定义,负责存储该范围内的数据。与关系型数据库中的分区类似,HBase 中的 Region 可以根据数据量的大小进行动态调整。当一个Region 的数据量过大时,它会被 分裂 成两个新的 Region。相反,当数据量较小时,两个或多个 Region 可能会合并成一个新的Region

    MemStore 的数据超过阈值时,将数据溢写磁盘,生成一个 StoreFile 文件。当 Region 中最大Store 的大小超过阈值时,Region 分裂,等分成两个 Region,实现数据访问的负载均衡。新的 Region 的位置由 HMaster 来确定在哪个RegionServer 中。

  2. 查看表结构的命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[subowen@bigdata ~]$ hbase shell
2024-07-05 23:04:35,655 WARN [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
HBase Shell
Use "help" to get list of supported commands.
Use "exit" to quit this interactive shell.
For Reference, please visit: http://hbase.apache.org/2.0/book.html#shell
Version 2.1.8, rd8333e556c8ed739cf39dab58ddc6b43a50c0965, Tue Nov 19 15:29:04 UTC 2019
Took 0.0028 seconds
hbase(main):001:0> list
TABLE
logs
logs_20240606
logs_20240607
user
sdutcm:bigdata
5 row(s)
Took 1.2756 seconds
=> ["logs", "logs_20240606", "logs_20240607", "user", "sdutcm:bigdata"]

hbase(main):002:0> describe 'sdutcm:bigdata'
Table sdutcm:bigdata is ENABLED
sdutcm:bigdata
COLUMN FAMILIES DESCRIPTION
{NAME => 'info', VERSIONS => '5', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE => 'false', 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 => 'msg', VERSIONS => '5', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE => 'false', 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'}
2 row(s)
Took 0.3826 seconds

hbase(main):003:0> scan 'sdutcm:bigdata'
ROW COLUMN+CELL
2001 column=info:name, timestamp=1719026353219, value=wang
1 row(s)
Took 0.2295 seconds
hbase(main):004:0>
  1. 启动和关闭 HBase Shell 的命令

    启动 HBase Shell 之前需要保证 ZooKeeperHadoop HDFSHBase 已经启动。可以使用 hbase shell 进入 HBase Shell,在 HBase Shell 中可以使用 exitquit 退出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
[subowen@bigdata ~]$ zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/subowen/apps/zookeeper-3.4.12/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

[subowen@bigdata ~]$ zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/subowen/apps/zookeeper-3.4.12/bin/../conf/zoo.cfg
Mode: standalone

[subowen@bigdata ~]$ start-dfs.sh
Starting namenodes on [bigdata]
bigdata: starting namenode, logging to /home/subowen/apps/hadoop-2.7.6/logs/hadoop-subowen-namenode-bigdata.out
bigdata: starting datanode, logging to /home/subowen/apps/hadoop-2.7.6/logs/hadoop-subowen-datanode-bigdata.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: starting secondarynamenode, logging to /home/subowen/apps/hadoop-2.7.6/logs/hadoop-subowen-secondarynamenode-bigdata.out

[subowen@bigdata ~]$ start-hbase.sh
running master, logging to /home/subowen/apps/hbase-2.1.8/logs/hbase-subowen-master-bigdata.out
bigdata: running regionserver, logging to /home/subowen/apps/hbase-2.1.8/logs/hbase-subowen-regionserver-bigdata.out

[subowen@bigdata ~]$ jps
1746 NameNode
1572 QuorumPeerMain
2071 SecondaryNameNode
2874 Jps
2379 HRegionServer
1852 DataNode
2285 HMaster

[subowen@bigdata ~]$ hbase shell
2024-07-05 22:47:57,331 WARN [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
HBase Shell
Use "help" to get list of supported commands.
Use "exit" to quit this interactive shell.
For Reference, please visit: http://hbase.apache.org/2.0/book.html#shell
Version 2.1.8, rd8333e556c8ed739cf39dab58ddc6b43a50c0965, Tue Nov 19 15:29:04 UTC 2019
Took 0.0051 seconds
hbase(main):001:0> exit

[subowen@bigdata ~]$ hbase shell
2024-07-05 22:52:46,337 WARN [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
HBase Shell
Use "help" to get list of supported commands.
Use "exit" to quit this interactive shell.
For Reference, please visit: http://hbase.apache.org/2.0/book.html#shell
Version 2.1.8, rd8333e556c8ed739cf39dab58ddc6b43a50c0965, Tue Nov 19 15:29:04 UTC 2019
Took 0.0025 seconds
hbase(main):001:0> quit
[subowen@bigdata ~]$
  1. 启动ZooKeeper和查看 ZooKeeper 的运行状态的命令
1
2
3
4
5
6
7
8
9
[subowen@bigdata ~]$ zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/subowen/apps/zookeeper-3.4.12/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

[subowen@bigdata ~]$ zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/subowen/apps/zookeeper-3.4.12/bin/../conf/zoo.cfg
Mode: standalone
  1. 修改表结构的命令

    使用 alter 命令可以对表的结构进行修改:

    表名创建时写的所有和列族相关的信息,都可以后续通过alter修改,包括增加删除列族。

    ① 增加列族和修改信息都使用覆盖的方法

    ​ 修改列族的版本,VERSIONS => 6

    1
    2
    3
    4
    5
    hbase(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
    5
    hbase(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
    17
    hbase(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
    5
    hbase(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 seconds
    1
    2
    3
    4
    5
    hbase(main):002:0> alter 'bigdata:person', 'delete' => 'msg'
    Updating all regions with the new schema...
    1/1 regions updated.
    Done.
    Took 2.9721 seconds
  2. HBaseJava API中,数据表描述的对象是什么?TableDescriptor

    1
    TableDescriptor
  3. ZooKeeper 的访问端口号,HBase 的Web访问端口号

    ZooKeeper 的访问端口号为 2181

    HBase 的 Web 访问端口号为 16010

  4. 修改表中列族的Version版本的命令

1
alter 'table_name', {NAME => 'column_family', VERSIONS => number_of_versions}
  1. 删除表中数据的命令

    1
    delete 'ns:tb', 'rk', 'cf:col'
  2. 启动和关闭ZooKeeper的命令

    1
    2
    3
    4
    5
    # 启动 ZooKeeper
    zkServer.sh start

    # 关闭 ZooKeeper
    zkServer.sh stop
  3. 更新表数据的命令

    1
    alter 'ns:tb', {NAME => 'cf:col', VERSIONS => 5}
  4. HBase安装时,配置文件有那几个?

    • hbase-env.sh
    • hbase-site.xml
    • regionservers
    • .bashrc
  5. 关于NoSQL数据库有哪些?

    • HBase
    • Cassandra
    • BigTable
  6. 删除表操作

1
2
disable 'ns:tb'
drop 'ns:tb'
  1. HBase进程名,ZooKeeper 的进程名等相关进程

    • HMaster
    • HRegionServer
    • QuorumPeerMain
  2. HBase 依托于哪个文件存储系统?

    HBase 主要依托于 Hadoop HDFS

  3. 创建表的语法结构

    1
    create 'ns:tb', {NAME => 'cf', VERSIONS=5}
  4. 查询表数据的Shell语法

    1
    2
    3
    get 'r1', {COLUMN => 'cf:col'}

    scan 'ns:tb'
  5. 什么是列族COLUMN FAMILY

  6. HBase的数据类型

    • 数据类型
      • 基本数据类型
        • 字符串(String):用于存储文本数据,如名称、描述等。
        • 整数(Int):用于存储整数数据,如计数、编号等。
        • 浮点数(Float):用于存储小数数据,如金额、比率等。
        • 布尔值(Boolean):用于存储逻辑值,如是否、有效等。
      • 复合数据类型
        • 列族(Column Family):列族是HBase表中数据的组织方式,用于存储一组相关的列。列族是HBase表中数据的基本组织单位,每个列族对应一个数据节点。
        • 列(Column):列是HBase表中数据的基本单位,用于存储一组相关的单元格。列可以包含多个单元格,每个单元格对应一个数据值。
        • 单元格(Cell):单元格是HBase表中数据的基本单位,用于存储一组相关的数据值。单元格包含一个键(Row Key)、一个列(Column)和一个值(Value)。
    • 数据模型
      • NameSpace:命名空间,类似于关系型数据库的 Database 概念,每个命名空间下有多个表。HBase 两个自带的命名空间,分别是 hbasedefaulthbase 中存放的是 HBase 内置的表,default表是用户默认使用的命名空间。
      • Table:类似于关系型数据库的表概念。不同的是,HBase 定义表时只需要声明列族即可,不需要声明具体的列。因为数据存储是稀疏的,所以往 HBase 写入数据时,字段可以动态、按需指定。因此,和关系型数据库相比,HBase 能够轻松应对字段变更的场景。
      • Row:HBase 表中的每行数据都由一个 RowKey 和多个 Column(列)组成,数据是按照 RowKey 的字典顺序存储的,并且查询数据时只能根据 RowKey 进行检索,所以 RowKey 的设计十分重要。
      • Column:HBase 中的每个列都由 Column Family(列族)和 Column Qualifier(列限定符)进行限定,例如 info:nameinfo:age。建表时,只需指明列族,而列限定符无需预先定义。
      • Time Stamp:用于标识数据的不同版本Version,每条数据写入时,系统会自动为其加上该字段,其值为写入 HBase 的时间。
      • Cell:由 {rowkey, column Family:Column Qualifier, timestamp} 唯一确定的单元。Cell 中的数据全部是字节码形式存贮。

判断题

  1. HBase 本身是用 C++ 语言编写的,因此具有很高的执行效率。( × )

    HBase 本身是由 Java 语言编写的,尽管使用 Java,其执行效率还是较高的。

  2. HBase 优化目前主要工作集中于 Rowkey 优化。( × )

    HBase 的优化目前主要工作集中在 RowKey 的设计、参数优化、JVM调优等方面。

  3. 可以想象 HBase 是通过**”三维”**的表来存储数据的,通过时间戳保存数据的历史版本。( √ )

  4. 安装 HBase 完全分布式时,需要确保 SSHJDK 是可以正常使用的。( √ )

    在安装 HBase 的完全分布式部署时,确保 SSHJDK 可以正常使用是非常重要的。具体来说:

    • SSH:在分布式部署中,HBase 的各个节点之间需要进行通信和协作,而 SSH 是用于在不同节点之间建立安全连接的工具。确保节点之间可以互相访问、通信和传输文件是部署 HBase 所必需的。通常需要设置免密登录,以便在节点之间进行信息交换而无需手动输入密码。

    • JDK:HBase 是基于 Java 编程语言开发的,因此必须确保在每个节点上安装并配置了适当的 JDKHBase 运行需要 Java 环境,且为了确保 HBase 能够正常工作,必须保证每个节点都能够使用正确的 JDK 版本。

  5. Hadoop 中引入 HBase 的其中一个原因是:HDFS 在处理连续数据时比较吃力。( × )·

    HDFS 的设计目标之一就是为了有效地处理大规模数据,包括连续数据(如大文件、数据流等)和离散数据(如小文件、批量数据等)。Hadoop 中之所以引入 HBase,是需要 HBase 提供实时访问数据的能力,使得 Hadoop 生态系统更全面(此外还有高可伸缩性、高容错、多版本策略等)。

  6. 利用 HBase 技术可在廉价 PC Server 上搭建起大规模结构化存储集群。( √ )

  7. HBaseHadoop 生态系统的一个组成部分。( √ )

    HBase 是继 Google Bigtable 之后创建的分布式、开源、版本化、非关系型数据库。它是 Hadoop 生态系统的重要组件,利用 HDFS 的容错功能,提供对数据的实时读写访问。 HBase 尽管是数据库,但也可以称为数据存储系统,因为它不提供触发器、查询语言和二级索引等 RDBMS 功能。

  8. 使用 HBase 时,无需启动服务就可以直接在开发环境中调用 HBase 的相关功能。( × )

    HBase 是基于 Hadoop 的,在使用 HBase 之前需要启动 ZooKeeperHadoop 才能使用 HBase

  9. 配置 HBase 分布式部署的过程中,可以通过 cp 命令把文件复制到运行在不同机器上的节点中。( × )

    可以使用 scp 命令、rsync命令,或者基于 rsync 编写工具 xsync 进行传输。

填空题

  1. 判断表是否存在,禁用表,删除表,创建表,查看命名空间等 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
  2. HBase 的进程有哪些:关于这些进程的详细说明见 QuickPassHBase简答题 T4

    • HBase 的主要进程:HMasterHRegionServer
    • HBase 所依赖的两个外部的服务:ZooKeeperHDFS
  3. 行键是什么:rowkey

    HBase 中,行键唯一标识了 HBase 表的一行,可以通过单个行键或行键区间的方式访问表。行键保存为 字节数组 ,以字典序 排序存储。

  4. HBase 是一个什么样的分布式存储系统。(非关系型)

    Apache HBase™ 是以 HDFS 为数据存储的,一种分布式可扩展NoSQL 数据库。HBase 是一款面向列存储,用于存储处理海量数据的 NoSQL 数据库。

    HBase 的理论原型是 GoogleBigTable 论文。他是一个高可靠性高性能面向列可伸缩分布式存储系统。

简答题

  1. HBase 的基础核心组件有哪些?分别什么作用?

    • HBase-Client
      客户端,用来访问 HBase 集群。可以和 Hbase 交互,也可以和 HRegionServer 交互。通过 HBase RPC 来访问对应的接口。

      这里的客户端模式有多种,可以是 ThriftAvroRest 等。

      另外,hbase-client 自身会缓存 region 的一些信息。

    • ZooKeeper
      作用:

      • HMaster 的高可用
      • 存储 ROOT 表的地址、HMaster 的地址
      • 存储所有 HRegionServer 的状态,监控 HRegionServer 的上下限
      • 存储 HBase 的一些 SchemaTable 的元数据
    • HMaster

      HMaster可以启动多个,通过选举机制来保证只有一个 HMaster 正常运行并提供服务,其他的 HMaster 作为 standby 来保证高可用。HMaster 主要负责 Region 的管理工作。如:

      • 用户对表的增删改查
      • 管理 RegionServer 的负载均衡,调整 Region 的分布
      • RegionServer 宕机或下线后,负责迁移 RegionServer 上的 Region 到其他的 RegionServer
      • Region 在分裂后,负责分配新的 Region
    • HRegionServer
      HRegionServerHBase 中真正的工作节点,主要负责响应用户的 I/O 请求,向 HDFS 文件系统读写数据,以及 Region 的数据文件的合并和拆分等,是 HBase 中最核心的模块。

      HBase 中,一张表由多个的 HRegion 组成,一个 HRegionServer 中管理着多个 HRegion 对象。而一个 HRegion 由多个HStore 组成,每个HStore对象都对应着表的一个列族 (Column Family)。之后,一个HStore又由一个MemStore和多个StoreFile组成。这些 StoreFile 就是hbase 存储在 HDFS上的数据文件,MemStore 表示还在内存中未刷新到文件上的那些数据。

  2. HBase 的写流程, 读流程?

    • 写流程

      写流程顺序正如 API 编写顺序,首先创建 HBase 的重量级连接。

      ① 首先访问 ZooKeeper,获取 hbase:meta 表位于哪个 Region Server

      ② 访问对应的 Region Server,获取 hbase:meta 表,将其缓存到连接中,作为连接属性 MetaCache,由于 meta 表具有一定的数据量,导致了创建连接比较慢;

      之后使用创建的连接获取 Table,这是一个轻量级的连接,只有在第一次创建的时候会检查表格是否存在访问RegionServer,之后在获取 Table 时不会访问 RegionServer

      ③ 调用 Tableput 方法写入数据,此时还需要解析 RowKey,对照缓存的 MetaCache,查看具体写入的位置有哪个 RegionServer

      ④ 将数据顺序写入(追加)到 WAL,此处写入是直接落盘的,并设置专门的线程控制 WAL 预写日志的滚动(类似 Flume);

      ⑤ 根据写入命令的 RowKeyColumnFamily 查看具体写入到哪个 MemStore,并且在 MemStore 中排序

      ⑥ 向客户端发送 ACK

      ⑦ 等达到 MemStore 的刷写时机后,将数据刷写到对应的 Store 中。

    • 读流程

      读流程创建连接的方式同写流程。创建完连接后:

      ① 创建 Table 对象发送 get 请求。

      ② 优先访问 Block Cache(读缓存),查找是否之前读取过,并且可以读取 HFile 的索引信息和布隆过滤器。

      ③ 不管读缓存中是否已经有数据了(可能已经过期了),都需要再次读取写缓存和 store 中的文件。

      ④ 最终将所有读取到的数据合并版本,按照 get 的要求返回即可。

  3. HBase 的特点有哪些?优点或缺点?

    HBase的特点:(强 / 自动 / 高 / 海集 / 并 / 列 / 多 / 块 / 运行 / 稀)

    • 强一致性的读/写HBase不是”最终一致性”数据库,它非常适合于诸如高速计数器聚合等任务。

    • 自动分片HBase 中的表通过 Region 分布在集群上,而且 Region 会随着数据的增长自动拆分和重新分布。

    • 高可靠性:自动 RegionServer 故障转移,WAL 机制保证了数据写入时不会因集群异常而导致写入数据丢失,Replication 机制保证了在集群出现严重的问题时,数据不会发生丢失或损坏。而且 HBase 底层使用 HDFSHDFS 本身也有备份。

    • Hadoop/HDFS 集成&海量存储:,HBase支持 HDFS开箱即用作为其分布式文件系统。HBase 作为一个开源的分布式 Key-Value 数据库,其主要作用是面向 PB 级别数据的实时入库和快速随机访问。这主要源于上述易扩展的特点,使得 HBase 通过扩展来存储海量的数据。

    • 并行处理HBase 通过 MapReduce 支持大规模并行处理,将 HBase 用作源和接收器。

    • 列式存储HBase 是根据列族来存储数据的。列族下面可以有非常多的列。列式存储的最大好处就是,其数据在表中是按照某列存储的,这样在查询只需要少数几个字段时,能大大减少读取的数据量。(面向列)

    • 多种语言的 APIHBase 支持使用 JavaAPI 来编程进行数据的存取,还支持使用 Thrift 语言和 REST 语言的 API 来编程进行数据的存取。

    • 块缓存和布隆过滤器HBase支持 Block CacheBloom过滤器进行大容量查询优化。

    • 运行管理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 byorder by 只能通过编写 MapReduce 来实现。
      • 不支持ACIDHBase部分支持了 ACID
      • 不支持SQL语句查询:查询 HBase 时不支持通过 SQL 语句进行查询。
  4. MasterRegionServer 的作用是什么?

    HBase 包含一个 Master 和许多个 RegionServer

    • Master:实现类为 HMaster,负责监控集群中所有的 RegionServer 实例。主要作用如下:

      • 管理元数据表格 hbase:meta,接收用户对表格创建修改删除的命令并执行

      • 监控 Region 是否需要进行负载均衡,故障转移和 Region 的拆分。

    • RegionServer:实现类为 HRegionServer,主要作用如下:

      • 负责数据 Cell 的处理,例如写入数据 put,查询数据 get 等。

      • 拆分合并 Region 的实际执行者,有 master 监控,有 RegionServer 执行。

编程题

Shell

  1. 创建命名空间的 Shell

    1
    create_namespace 'namespace_name'
  2. 创建表的 Shell

    1
    create 'namespace_name:table_name', {NAME => 'cf1', VERSION => 5} 
  3. 修改表的 Shell

    1
    alter 'namespace_name:table_name', NAME => 'cf1', METHOD => 'delete'
  4. 插入数据的 Shell

    1
    put 'ns:tb', 'rk', 'cf:col', 'value'
  5. 查询数据的 Shell

    • get 最大范围是一行数据,也可以进行列的过滤,读取的结果为多行 CellCell 的格式如下:{rowkey, column Familycolumn Qualifier, time Stamp}
    1
    get 'ns:tb', 'rk' , {COLUMN => 'cf:col'}
    • scan 用于扫描数据,能够读取多行数据,不建议扫描过多的数据,推荐使用 startRowstopRow 来控制读取的数据,默认范围左闭右开
    1
    scan 'namespace_name:table_name', {STARTROW => '1001',STOPROW => '1002'}

API

读写操作时

  1. 加载配置信息
  2. 获取 HBase 的链接对象
  3. 获取 Admin 对象
  4. 构造 TableName 对象
  5. 判断表是否存在
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
public class Test {
public static Connection connection = null;
static {
Configuration conf = new Configuration(); // 加载配置信息
conf.set("hbase.zookeeper.quorum", "bigdata");
try {
connection = ConnectionFactory.createConnection(conf);
} catch (IOException e) {
e.printStackTrace();
}
}

public static void closeConntction() throw IOException {
if (connection != null) {
connection.close();
}
}

/**
* @brief 判断表格是否存在
* @param namespace 命名空间名
* @param tableName 表名
* @return true 存在; false 不存在
*/
public static boolean isTableExists(String namespace, String tableName) throws IOException {
// 1. 获得 admin
Admin admin = HBaseConnection.connection.getAdmin();

// 2. 使用对应的方法, 判断表格是否存在
boolean result = false;
try {
result = admin.tableExists(TableName.valueOf(namespace, tableName));
} catch (IOException e) {
e.printStackTrace();
}

// 3. 关闭 admin
admin.close();

// 返回结果
return result;
}

/**
* @brief 向表格中插入数据
* @param namespace 命名空间名
* @param tableName 表名
* @param rowKey 行键
* @param columnFamily 列族名
* @param columnName 列名
* @param value 插入值
*/
public static void putCell(String namespace,
String tableName,
String rowKey,
String columnFamily,
String columnName,
String value) throws IOException {
// 1. 获取 Table
Table table = connection.getTable(TableName.valueOf(namespace, tableName));

// 2. 调用相关方法插入数据
// 2.1 创建 Put 对象
Put put = new Put(Bytes.toBytes(rowKey));

// 2.2. 给 Put 对象添加数据
put.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(columnName), Bytes.toBytes(value));

// 2.3 将对象写入对应的方法
try {
table.put(put);
} catch (IOException e) {
e.printStackTrace();
}

// 3. 关闭 Table
table.close();
}

/**
* @brief 读取数据 读取对应一行的某一列
* @param namespace 命名空间名
* @param tableName 表名
* @param rowKey 行键
* @param columnFamily 列族名
* @param columnName 列名
*/
public static void getCells(String namespace,
String tableName,
String rowKey,
String columnFamily,
String columnName) throws IOException {
// 1. 获取 Table
Table table = connection.getTable(TableName.valueOf(namespace, tableName));

// 2. 调用相关方法插入数据
// 2.1 创建 Get 对象
Get get = new Get(Bytes.toBytes(rowKey)); // 如果此时不使用 addColumn 进行参数的添加, 此时则读取一整行的数据
// 2.2 如果想读取某一列的数据, 需要添加对应的参数
get.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(columnName));

// 2.3 也可以设置读取数据的版本
get.readAllVersions();

try {
// 3. 读取数据, 写入 Result 对象
Result result = table.get(get);

// 4. 处理数据
Cell[] cells = result.rawCells();

// 5. 测试方法: 直接把读取到的数据打印到控制台
// 如果是实际开发, 需要再额外写方法, 对应处理数据
for (Cell cell : cells) {
// Cell 存储数据比较底层, 需要进一步处理
String value = new String(CellUtil.cloneValue(cell));
System.out.println(value);
}
} catch (IOException e) {
e.printStackTrace();
}

// 6. 关闭 Table
table.close();
}

private static main(String[] args) throw IOException {
putCell("sdutcm", "bigdata", "2001", "info", "name", "zhangsan");
connection.close();
}
}

参考文献

Hadoop 综合揭秘——HBase的原理与应用 - 风尘浪子 - 博客园 (cnblogs.com)

HBase的组件

作者

NilEra

发布于

2024-06-22

更新于

2024-07-08

许可协议

评论