HBase 一文读懂

news2024/9/30 17:29:40

本文基于《尚硅谷大数据技术之HBase》编写。

  1. HBase 简介

HBase定义

HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库。

HBase数据模型

HBase的数据模型同关系型数据库(RDMS)很类似,数据存储在一张表中,有行有列。但从HBase的底层物理存储结构(K-V)来看,HBase更像是一个multi-dimensional map(多维度Map)。

HBase逻辑结构

HBase物理存储结构

HBase 专有名词

1. Name Space

命名空间,类似于关系型数据库的 DatabBase 概念,每个命名空间下有多个表。HBase 有两个自带的命名空间,分别是 hbase 和 default,hbase 中存放的是 HBase 内置的表,default 表是用户默认使用的命名空间。

2. Region

类似于关系型数据库的表概念。不同的是,HBase 定义表时只需要声明列族即可,不需要声明具体的列。这意味着,往 HBase 写入数据时,字段可以动态、按需指定。因此,和关系型数据库相比,HBase 能够轻松应对字段变更的场景。

3. Row

HBase 表中的每行数据都由一个 RowKey 和多个 Column(列)组成,数据是按照 RowKey 的字典顺序存储的,并且查询数据时只能根据 RowKey 进行检索,所以 RowKey 的设计十分重要。

4. Column

HBase 中的每个列都由 Column Family (列族)和 Column Qualifier(列限定符)进行限定,例如 info:name,info:age。建表时,只需指明列族,而列限定符无需预先定义。

5. Time Stamp

用于标识数据的不同版本(version),每条数据写入时,如果不指定时间戳,系统会自动为其加上该字段,其值为写入 HBase 的时间。

6. Cell

由{rowkey, column Family:column Qualifier, time Stamp}唯一确定的单元。cell 中的数据是没有类型的,全部是字节码形式存储。

2.HBase基本架构

架构角色:

1)Region Server

Region Server为 Region的管理者,其实现类为HRegionServer,主要作用如下:

对于数据的操作:get, put, delete;

对于Region的操作:splitRegion、compactRegion。

2)Master

Master是所有Region Server的管理者,其实现类为HMaster,主要作用如下:

对于表的操作:create, delete, alter

对于RegionServer的操作:分配regions到每个RegionServer,监控每个RegionServer的状态,负载均衡和故障转移。

3)Zookeeper

HBase通过Zookeeper来做master的高可用、RegionServer的监控、元数据的入口以及集群配置的维护等工作。

4)HDFS

HDFS为Hbase提供最终的底层数据存储服务,同时为HBase提供高可用的支持。

3.HBase 快速入门

ZooKeeper 部署

  1. 进入 Zookeeper 官网下载:https://zookeeper.apache.org/releases.html 选择一个安装包下载。

  1. 将下载包apache-zookeeper-3.7.1-bin.tar.gz,上传CentOS-7 服务器的/usr/local 目录下。

  1. 切换至/usr/local 目录,解压apache-zookeeper-3.7.1-bin.tar.gz包。

[root@Hadoop3-master local]# tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz
  1. 将解压缩包apache-zookeeper-3.7.1-bin,重命名zookeeper.

[root@Hadoop3-master local]# mv apache-zookeeper-3.7.1-bin zookeeper
  1. 切换至/usr/local/zookeeper 目录,创建zookeeper关联数据目录(data)和关联日志目录(logs)

[root@Hadoop3-master local]# cd zookeeper/
[root@Hadoop3-master zookeeper]# mkdir data
[root@Hadoop3-master zookeeper]# mkdir logs
  1. 切换至zookeeper 配置目录(/usr/local/zookeeper/conf/) ,拷贝 zoo_sample.cfgzoo.cfg

[root@Hadoop3-master zookeeper]# cd conf/
[root@Hadoop3-master conf]# cp zoo_sample.cfg  zoo.cfg
  1. 使用vi 命令,编辑zoo.cfg 配置文件,添加zookeeper 存储数据文件地址(/usr/local/zookeeper/data)和存储日志文件地址(/usr/local/zookeeper/logs)

[root@Hadoop3-master conf]# cat zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
# 数据存储地址
dataDir=/usr/local/zookeeper/data
# 日志存储地址
dataLogDir=/usr/local/zookeeper/logs
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

## Metrics Providers
#
# https://prometheus.io Metrics Exporter
#metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
#metricsProvider.httpPort=7000
#metricsProvider.exportJvmInfo=true
  1. Zookeeper 运行

  • 启动: bin/zkServer.sh start

  • 查询状态: bin/zkServer.sh status

  • 停止: bin/zkServer.sh stop

Hadoop3 单机部署

请参考文章:Hadoop3 单机版本(伪分布式版本)

HBase 部署

  1. HBase 与Hadoop 版本对应关系表

温馨提示:本文演示的Hadoop版本:3.2.x ,HBase 版本为:2.3.x

  1. 首先将hbase-2.3.4-bin.tar.gz,上传到CentOS-7的/usr/local 目录下

  1. 使用cd 命令切换至/usr/local 目录,然后使用tar -zxvf hbase-2.3.4-bin.tar.gz 解压。

[root@Hadoop3-master local]# tar -zxvf hbase-2.3.4-bin.tar.gz
  1. 使用mv 命令重命名解压后的文件夹hbase-2.3.4-bin.tar.gz为hbase

[root@Hadoop3-master local]# mv hbase-2.3.4 hbase

5.配置hbase 全局环境变量,将HBase 安装目录(/usr/local/hbase)配置到/etc/profile的PATH环境变量中。

[root@Hadoop3-master local]# vi /etc/profile

编辑内容如下:

# /etc/profile
export JAVA_HOME=/usr/local/jdk
export HADOOP_HOME=/usr/local/hadoop
export SQOOP_HOME=/usr/local/sqoop
export HBASE_HOME=/usr/local/hbase
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$SQOOP_HOME/bin:$HBASE_HOME/bin

使用source /etc/profile 命令,使环境变量立即生效。

HBase 参数配置

切换至HBase 的配置文件目录/usr/local/hbase/conf, 然后分别修改HBase的配置文件hbase-env.sh 和hbase-site.xml

配置hbase-env.sh

修改如下两处配置:

# The java implementation to use.  Java 1.8+ required.
export JAVA_HOME=/usr/local/jdk
# Tell HBase whether it should manage it's own instance of ZooKeeper or not.
export HBASE_MANAGES_ZK=true

它们分别位于hbase-env.sh配置文件的第27行和第138行。

配置hbase-site.xml

在configuration标签中添加如下内容:

<property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
  </property>
# Hadoop3 文件存储地址 
  <property>
    <name>hbase.rootdir</name>
    <value>hdfs://Hadoop3-master:9000/bhase</value>
  </property>
# Zookeeper 所在服务器主机名称 
  <property>
    <name>hbase.zookeeper.quorum</name>
    <value>Hadoop3-master</value>
  </property>
</configuration>

HBase 验证

验证HBase 必须先启动Hadoop 和ZooKeeper服务。

  1. 启动ZooKeeper服务

切换至Zookeeper 安装目录(/usr/local/zookeeper)目录,进入bin/目录,执行./zkServer.sh start 命令。

[root@Hadoop3-master bin]# ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@Hadoop3-master bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: standalone

温馨提示:./zkServer.sh status 为查看zooKeeper 服务状态命令。

  1. 启动Hadoop 3 服务

切换至Hadoop 3 安装目录(/usr/local/hadoop),进入sbin/目录,执行./start-all.sh 命令

[root@Hadoop3-master conf]# cd /usr/local/hadoop
[root@Hadoop3-master hadoop]# cd sbin/
[root@Hadoop3-master sbin]# ./start-all.sh
WARNING: HADOOP_SECURE_DN_USER has been replaced by HDFS_DATANODE_SECURE_USER. Using value of HADOOP_SECURE_DN_USER.
Starting namenodes on [Hadoop3-master]
上一次登录:六 2月 25 23:36:51 CST 2023从 192.168.43.15pts/0 上
Starting datanodes
上一次登录:日 2月 26 00:52:18 CST 2023pts/0 上
Starting secondary namenodes [Hadoop3-master]
上一次登录:日 2月 26 00:52:20 CST 2023pts/0 上
Starting resourcemanager
上一次登录:日 2月 26 00:52:24 CST 2023pts/0 上
Starting nodemanagers
上一次登录:日 2月 26 00:52:30 CST 2023pts/0 上
[root@Hadoop3-master sbin]# jps
42676 ResourceManager
42087 DataNode
42329 SecondaryNameNode
41930 NameNode
43195 Jps
19262 QuorumPeerMain

温馨提示:通过jps 进程指令查看Hadoop 服务启动是否正常。

  1. 启动HBase 服务

切换至HBase 安装目录(/usr/local/hbase),进入bin/目录,执行启动Hbase 命令:./start-bhase.sh

[root@Hadoop3-master bin]# cd /usr/local/hbase
[root@Hadoop3-master hbase]# cd bin
[root@Hadoop3-master bin]# ./start-hbase.sh
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-reload4j-1.7.35.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hbase/lib/client-facing-thirdparty/slf4j-log4j12-1.7.30.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Reload4jLoggerFactory]
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-reload4j-1.7.35.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hbase/lib/client-facing-thirdparty/slf4j-log4j12-1.7.30.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Reload4jLoggerFactory]
Hadoop3-master: running zookeeper, logging to /usr/local/hbase/bin/../logs/hbase-root-zookeeper-Hadoop3-master.out
master running as process 43979. Stop it first.
: regionserver running as process 44213. Stop it first.

验证HBase 服务是否则正常启动,可以通过hbash shell 命令窗口、hbase 管理控制台页面、hadoop 数据存储管理(hbase)、jsp 查看相关服务进程等相关方式来验证确认。

方式一:hbash shell 命令窗口方式

[root@Hadoop3-master bin]# hbase shell
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-reload4j-1.7.35.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hbase/lib/client-facing-thirdparty/slf4j-log4j12-1.7.30.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Reload4jLoggerFactory]
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.3.4, rafd5e4fc3cd259257229df3422f2857ed35da4cc, Thu Jan 14 21:32:25 UTC 2021
Took 0.0014 seconds
hbase(main):001:0> 

紧着输入list命令。

list 是HBase 的基础命令,主要用于查询所有表

hbase(main):001:0> list
TABLE
0 row(s)
Took 0.6415 seconds
=> []

没有报错,则说明HBase 已经正确安装并启动。

方式二:打开浏览器,输入地址:http://192.168.43.11:16010/, 可以查看HBase 运行状态信息

方式三:查看Hadoop 文件系统

在HBase 服务启动时,会自动在Hadoop 文件系统中创建一个bhase 文件夹。我们可以通过以下命令进行验证。

[root@Hadoop3-master bin]# hadoop fs -ls /
Found 1 items
drwxr-xr-x   - root supergroup          0 2023-02-26 00:53 /bhase

方式四:通过jps 查看进程服务

[root@Hadoop3-master bin]# jps
42676 ResourceManager
48580 Jps
44213 HRegionServer
42087 DataNode
42329 SecondaryNameNode
41930 NameNode
43979 HMaster
46203 QuorumPeerMain

4. HBase Shell 操作

基本操作

  1. 进入HBase客户端命令行

[root@Hadoop3-master bin]# hbase shell
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-reload4j-1.7.35.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hbase/lib/client-facing-thirdparty/slf4j-log4j12-1.7.30.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Reload4jLoggerFactory]
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.3.4, rafd5e4fc3cd259257229df3422f2857ed35da4cc, Thu Jan 14 21:32:25 UTC 2021
Took 0.0022 seconds
  1. 查看帮助命令

hbase(main):001:0> help
HBase Shell, version 2.3.4, rafd5e4fc3cd259257229df3422f2857ed35da4cc, Thu Jan 14 21:32:25 UTC 2021
Type 'help "COMMAND"', (e.g. 'help "get"' -- the quotes are necessary) for help on a specific command.
Commands are grouped. Type 'help "COMMAND_GROUP"', (e.g. 'help "general"') for help on a command group.

COMMAND GROUPS:
  Group name: general
  Commands: processlist, status, table_help, version, whoami

  Group name: ddl
  Commands: alter, alter_async, alter_status, clone_table_schema, create, describe, disable, disable_all, drop, drop_all, enable, enable_all, exists, get_table, is_disabled, is_enabled, list, list_regions, locate_region, show_filters

  Group name: namespace
  Commands: alter_namespace, create_namespace, describe_namespace, drop_namespace, list_namespace, list_namespace_tables

  Group name: dml
  Commands: append, count, delete, deleteall, get, get_counter, get_splits, incr, put, scan, truncate, truncate_preserve

  Group name: tools
  Commands: assign, balance_switch, balancer, balancer_enabled, catalogjanitor_enabled, catalogjanitor_run, catalogjanitor_switch, cleaner_chore_enabled, cleaner_chore_run, cleaner_chore_switch, clear_block_cache, clear_compaction_queues, clear_deadservers, clear_slowlog_responses, close_region, compact, compact_rs, compaction_state, compaction_switch, decommission_regionservers, flush, get_largelog_responses, get_slowlog_responses, hbck_chore_run, is_in_maintenance_mode, list_deadservers, list_decommissioned_regionservers, major_compact, merge_region, move, normalize, normalizer_enabled, normalizer_switch, recommission_regionserver, regioninfo, rit, snapshot_cleanup_enabled, snapshot_cleanup_switch, split, splitormerge_enabled, splitormerge_switch, stop_master, stop_regionserver, trace, unassign, wal_roll, zk_dump

  Group name: replication
  Commands: add_peer, append_peer_exclude_namespaces, append_peer_exclude_tableCFs, append_peer_namespaces, append_peer_tableCFs, disable_peer, disable_table_replication, enable_peer, enable_table_replication, get_peer_config, list_peer_configs, list_peers, list_replicated_tables, remove_peer, remove_peer_exclude_namespaces, remove_peer_exclude_tableCFs, remove_peer_namespaces, remove_peer_tableCFs, set_peer_bandwidth, set_peer_exclude_namespaces, set_peer_exclude_tableCFs, set_peer_namespaces, set_peer_replicate_all, set_peer_serial, set_peer_tableCFs, show_peer_tableCFs, update_peer_config

  Group name: snapshots
  Commands: clone_snapshot, delete_all_snapshot, delete_snapshot, delete_table_snapshots, list_snapshots, list_table_snapshots, restore_snapshot, snapshot

  Group name: configuration
  Commands: update_all_config, update_config

  Group name: quotas
  Commands: disable_exceed_throttle_quota, disable_rpc_throttle, enable_exceed_throttle_quota, enable_rpc_throttle, list_quota_snapshots, list_quota_table_sizes, list_quotas, list_snapshot_sizes, set_quota

  Group name: security
  Commands: grant, list_security_capabilities, revoke, user_permission

  Group name: procedures
  Commands: list_locks, list_procedures

  Group name: visibility labels
  Commands: add_labels, clear_auths, get_auths, list_labels, set_auths, set_visibility

  Group name: rsgroup
  Commands: add_rsgroup, balance_rsgroup, get_rsgroup, get_server_rsgroup, get_table_rsgroup, list_rsgroups, move_namespaces_rsgroup, move_servers_namespaces_rsgroup, move_servers_rsgroup, move_servers_tables_rsgroup, move_tables_rsgroup, remove_rsgroup, remove_servers_rsgroup, rename_rsgroup

NameSpace操作

1.查看当前Hbase中有哪些namespace

hbase(main):002:0> list_namespace
NAMESPACE                                                                                                                                                                                             
default(创建表时未指定命名空间的话默认在default下)                                                                                                
hbase(系统使用的,用来存放系统相关的元数据信息等,勿随便操作)  

2.创建namespace

hbase(main):004:0> create_namespace "test"
Took 0.1895 seconds
hbase(main):005:0> create_namespace "test01", {"author"=>"zzg", "create_time"=>"2023-02-26 08:08:08"}
Took 0.1326 seconds

3.查看namespace

hbase(main):006:0> describe_namespace "test01"
DESCRIPTION
{NAME => 'test01', author => 'zzg', create_time => '2023-02-26 08:08:08'}
Quota is disabled
Took 0.1631 seconds

4.修改namespace的信息(添加或者修改属性)

hbase(main):007:0> alter_namespace "test01", {METHOD => 'set', 'author' => 'zzy'}
Took 0.1898 seconds
hbase(main):008:0> describe_namespace "test01"
DESCRIPTION
{NAME => 'test01', author => 'zzy', create_time => '2023-02-26 08:08:08'}
Quota is disabled
Took 0.0173 seconds

5.删除namespace

hbase(main):009:0> drop_namespace "test01"
Took 0.1633 seconds

温馨提示:要删除的namespace必须是空的,其下没有表。

表的操作

0.查看当前数据库中有哪些表

hbase(main):010:0> list
TABLE
0 row(s)
Took 0.0408 seconds
=> []

1.创建表

hbase(main):011:0> create 'student','info'
Created table student
Took 1.2770 seconds
=> Hbase::Table - student

2.插入数据到表

hbase(main):012:0> put 'student','1001','info:sex','male'
Took 0.1569 seconds
hbase(main):013:0> put 'student','1001','info:age','18'
Took 0.0077 seconds
hbase(main):014:0> put 'student','1002','info:name','Janna'
Took 0.0087 seconds
hbase(main):015:0> put 'student','1002','info:sex','female'
Took 0.0063 seconds
hbase(main):016:0> put 'student','1002','info:age','20'
Took 0.0060 seconds

3.扫描查看表数据

hbase(main):017:0> scan 'student'
ROW                                   COLUMN+CELL
 1001                                 column=info:age, timestamp=2023-02-26T01:54:00.725, value=18
 1001                                 column=info:sex, timestamp=2023-02-26T01:53:49.446, value=male
 1002                                 column=info:age, timestamp=2023-02-26T01:54:36.969, value=20
 1002                                 column=info:name, timestamp=2023-02-26T01:54:16.702, value=Janna
 1002                                 column=info:sex, timestamp=2023-02-26T01:54:26.971, value=female
2 row(s)
Took 0.0591 seconds
hbase(main):018:0> scan 'student',{STARTROW => '1001', STOPROW  => '1001'}
ROW                                   COLUMN+CELL
 1001                                 column=info:age, timestamp=2023-02-26T01:54:00.725, value=18
 1001                                 column=info:sex, timestamp=2023-02-26T01:53:49.446, value=male
1 row(s)
Took 0.0138 seconds
hbase(main):019:0> scan 'student',{STARTROW => '1001'}
ROW                                   COLUMN+CELL
 1001                                 column=info:age, timestamp=2023-02-26T01:54:00.725, value=18
 1001                                 column=info:sex, timestamp=2023-02-26T01:53:49.446, value=male
 1002                                 column=info:age, timestamp=2023-02-26T01:54:36.969, value=20
 1002                                 column=info:name, timestamp=2023-02-26T01:54:16.702, value=Janna
 1002                                 column=info:sex, timestamp=2023-02-26T01:54:26.971, value=female
2 row(s)
Took 0.0158 seconds

4.查看表结构

hbase(main):020:0> describe 'student'
Table student is ENABLED
student
COLUMN FAMILIES DESCRIPTION
{NAME => 'info', BLOOMFILTER => 'ROW', IN_MEMORY => 'false', VERSIONS => '1', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', COMPRE
SSION => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}

1 row(s)
Quota is disabled
Took 0.0835 seconds

5.更新指定字段的数据

hbase(main):021:0> put 'student','1001','info:name','Nick'
Took 0.0055 seconds
hbase(main):022:0> put 'student','1001','info:age','100'
Took 0.0067 seconds

6.查看“指定行”或“指定列族:列”的数据

hbase(main):023:0> get 'student','1001'
COLUMN                                CELL
 info:age                             timestamp=2023-02-26T01:58:35.096, value=100
 info:name                            timestamp=2023-02-26T01:58:23.287, value=Nick
 info:sex                             timestamp=2023-02-26T01:53:49.446, value=male
1 row(s)
Took 0.0205 seconds
hbase(main):024:0> get 'student','1001','info:name'
COLUMN                                CELL
 info:name                            timestamp=2023-02-26T01:58:23.287, value=Nick
1 row(s)
Took 0.0208 seconds

7.统计表数据行数

hbase(main):025:0> count 'student'
2 row(s)
Took 0.0590 seconds
=> 2

8.删除数据

删除某rowkey的全部数据:

hbase(main):026:0> deleteall 'student','1001'
Took 0.0229 seconds

删除某rowkey的某一列数据:

hbase(main):027:0> delete 'student','1002','info:sex'
Took 0.0070 seconds

9.清空表数据

hbase(main):028:0> disable 'student'
Took 1.2229 seconds
hbase(main):029:0> truncate 'student'
Truncating 'student' table (it may take a while):
Truncating table...
Took 1.1999 seconds

提示:清空表的操作顺序为先disable,然后再truncate。

10.删除表

hbase(main):030:0> disable 'student'
Took 0.3597 seconds
hbase(main):031:0> drop 'student'
Took 0.1918 seconds

提示:清空表的操作顺序为先disable,然后再drop。如果直接drop表,会报错:ERROR: Table student is enabled. Disable it first.

5. HBase 进阶

RegionServer 架构

1)StoreFile

保存实际数据的物理文件,StoreFile以Hfile的形式存储在HDFS上。每个Store会有一个或多个StoreFile(HFile),数据在每个StoreFile中都是有序的。

2)MemStore

写缓存,由于HFile中的数据要求是有序的,所以数据是先存储在MemStore中,排好序后,等到达刷写时机才会刷写到HFile,每次刷写都会形成一个新的HFile。

3)WAL

由于数据要经MemStore排序后才能刷写到HFile,但把数据保存在内存中会有很高的概率导致数据丢失,为了解决这个问题,数据会先写在一个叫做Write-Ahead logfile的文件中,然后再写入MemStore中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。

4)BlockCache

读缓存,每次查询出的数据会缓存在BlockCache中,方便下次查询。

写流程

写流程:

1)Client先访问zookeeper,获取hbase:meta表位于哪个Region Server。

2)访问对应的Region Server,获取hbase:meta表,根据读请求的namespace:table/rowkey,查询出目标数据位于哪个Region Server中的哪个Region中。并将该table的region信息以及meta表的位置信息缓存在客户端的meta cache,方便下次访问。

3)与目标Region Server进行通讯;

4)将数据顺序写入(追加)到WAL;

5)将数据写入对应的MemStore,数据会在MemStore进行排序;

6)向客户端发送ack;

7)等达到MemStore的刷写时机后,将数据刷写到HFile。

MemStore Flush

MemStore刷写时机:

1.当某个memstore的大小达到了hbase.hregion.memstore.flush.size(默认值128M),其所在region的所有memstore都会刷写。

当memstore的大小达到了

hbase.hregion.memstore.flush.size(默认值128M)

* hbase.hregion.memstore.block.multiplier(默认值4)

时,会阻止继续往该memstore写数据。

2.当region server中memstore的总大小达到

java_heapsize

*hbase.regionserver.global.memstore.size(默认值0.4)

*hbase.regionserver.global.memstore.size.lower.limit(默认值0.95)

region会按照其所有memstore的大小顺序(由大到小)依次进行刷写。直到region server中所有memstore的总大小减小到上述值以下。

当region server中memstore的总大小达到

java_heapsize

*hbase.regionserver.global.memstore.size(默认值0.4)

时,会阻止继续往所有的memstore写数据。

3. 到达自动刷写的时间,也会触发memstore flush。自动刷新的时间间隔由该属性进行配置hbase.regionserver.optionalcacheflushinterval(默认1小时)

4.当WAL文件的数量超过hbase.regionserver.max.logs,region会按照时间顺序依次进行刷写,直到WAL文件数量减小到hbase.regionserver.max.logs以下(该属性名已经废弃,现无需手动设置,最大值为32)。

读流程

读流程

1)Client先访问zookeeper,获取hbase:meta表位于哪个Region Server。

2)访问对应的Region Server,获取hbase:meta表,根据读请求的namespace:table/rowkey,查询出目标数据位于哪个Region Server中的哪个Region中。并将该table的region信息以及meta表的位置信息缓存在客户端的meta cache,方便下次访问。

3)与目标Region Server进行通讯;

4)分别在MemStore和Store File(HFile)中查询目标数据,并将查到的所有数据进行合并。此处所有数据是指同一条数据的不同版本(time stamp)或者不同的类型(Put/Delete)。

5)将查询到的新的数据块(Block,HFile数据存储单元,默认大小为64KB)缓存到Block Cache。

6)将合并后的最终结果返回给客户端。

StoreFile Compaction

由于memstore每次刷写都会生成一个新的HFile,且同一个字段的不同版本(timestamp)和不同类型(Put/Delete)有可能会分布在不同的HFile中,因此查询时需要遍历所有的HFile。为了减少HFile的个数,以及清理掉过期和删除的数据,会进行StoreFile Compaction。

Compaction分为两种,分别是Minor Compaction和Major Compaction。Minor Compaction会将临近的若干个较小的HFile合并成一个较大的HFile,并清理掉部分过期和删除的数据。Major Compaction会将一个Store下的所有的HFile合并成一个大HFile,并且清理掉所有过期和删除的数据。

Region Split

默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的Region Server,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的Region Server。

Region Split时机:

1.当1个region中的某个Store下所有StoreFile的总大小超过hbase.hregion.max.filesize,该Region就会进行拆分(0.94版本之前)。

2.当1个region中的某个Store下所有StoreFile的总大小超过Min(initialSize*R^3 ,hbase.hregion.max.filesize"),该Region就会进行拆分。其中initialSize的默认值为2*hbase.hregion.memstore.flush.size,R为当前Region Server中属于该Table的Region个数(0.94版本之后)。

具体的切分策略为:

第一次split:1^3 * 256 = 256MB

第二次split:2^3 * 256 = 2048MB

第三次split:3^3 * 256 = 6912MB

第四次split:4^3 * 256 = 16384MB > 10GB,因此取较小的值10GB

后面每次split的size都是10GB了。

3.Hbase 2.0引入了新的split策略:如果当前RegionServer上该表只有一个Region,按照2 * hbase.hregion.memstore.flush.size分裂,否则按照hbase.hregion.max.filesize分裂

6.HBase Java API

环境准备

新建项目,在pom.xml 添加如下依赖

        <!--添加Hbase 客户端-->
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-server</artifactId>
            <version>2.3.4</version>
        </dependency>

        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-client</artifactId>
            <version>2.3.4</version>
        </dependency>

HBASE Java通用封装

请参考文章:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/373251.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c语言tips-大端小端存储介绍和使用union判断大小端

1. 大小端介绍 大端&#xff08;Big Endian&#xff09;和小端&#xff08;Little Endian&#xff09;是两种CPU或者计算机系统存储数据的方式。 在大端系统中&#xff0c;数据的高位字节&#xff08;MSB&#xff09;存储在内存地址的低位&#xff0c;低位字节&#xff08;LSB…

Linux系统下搭建maven环境

文章目录前述从官网下载安装包安装 maven修改maven配置修改环境变量测试前述 安装 maven 环境前&#xff0c;需要先安装 java 环境&#xff0c;如果没有安装 java 环境&#xff0c;可以参考&#xff1a;https://blog.csdn.net/weixin_45583303/article/details/118631855 从官…

maven的仓库配置、指定jdk编译版本、相关编译命令简介、scope依赖的范围以及依赖的传递性

目录 1、配置阿里云提供的镜像仓库 2、指定jdk编译版本 3、执行 Maven 的构建命令 3.1、清理操作 3.2、编译操作 3.3、测试操作 3.4、打包操作 3.5、安装操作 4、scope依赖的范围 5、依赖的传递性 5.1、概念 5.2、传递的原则 1、配置阿里云提供的镜像仓库 将下面 m…

C++STL之list的模拟实现

目录 一.list准备 二. iterator迭代器 1._list_iterator 2.begin()、end() 3.const_begin()、const_end() 4.!&& 5. && -- 6.operator* 7.operator-> 三.Modify(修改) 1.insert() 2.erase() 3.push_back() && push_front() 4.pop_bac…

MySql触发器学习

文章目录1 触发器1.1介绍1.2 创建触发器1.2 删除触发器1.3查看触发器1 触发器 1.1介绍 触发器是与表有关的数据库对象&#xff0c;指在 insert/update/delete 之前或之后&#xff0c;触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的…

(十八)操作系统-进程互斥的软件实现方法

文章目录一、知识总览二、单标志法三、双标志先检查法四、双标志后检查法五、Peterson算法六、总结一、知识总览 二、单标志法 算法思想&#xff1a;两个进程在访问临界区后&#xff0c;会把使用临界区的权限转交给另一个进程。也就是说每个进程进入临界区的权限只能被另一个进…

Guna Charts WinForm 1.0.8 Crack

Guna Charts 16 图表 在 16 种不同的图表类型中可视化您的数据。 Guna Charts 反应灵敏 轻松响应屏幕尺寸的变化。 Guna Charts 实时图表 创建实时数据仪表板现在非常容易。 Guna Charts 混合图表类型 混合多种图表类型&#xff0c;例如条形图和折线图/面积图。 Guna Charts…

MS9122是一款USB单芯片投屏器,内部集成了USB2 0 控制器和数据收发模块、HDMI 数据接口和音视频处理模块。MS9122可以通过USB接口显示

MS9122是一款USB单芯片投屏器&#xff0c;内部集成了USB2.0 控制器和数据收发模块、HDMI 数据接口和音视频处理模块。MS9122可以通过USB接口显示或者扩展PC、智能手机、平板电脑的显示信息到更大尺寸的显示设备&#xff0c;支持HDMI视频接口。 主要功能特征 HDMI v1.4兼容 最大…

【java基础】包装类,自动装箱和自动拆箱

文章目录基本介绍包装类自动装箱自动拆箱包装类注意事项包装类比较包装器内容不可变基本介绍 有时&#xff0c;需要将int这样的基本类型转换为对象。所有的基本类型都有一个与之对应的类。 例如&#xff0c;Integer类对应基本类型int。通常&#xff0c;这些类称为包装器&#…

网上这么多IT的培训机构,我们该怎么选?

说实话&#xff0c;千万不要把这个答案放在网上来找&#xff0c;因为你只能得到别人觉得合适的或者机构的广告&#xff1b;当然个人的培训经历可以听一听的&#xff0c;毕竟不靠谱的机构也有&#xff0c;比如让你交一两万去上线上课程或者一百号来人坐一起看视频&#xff0c;这…

【django】django-simpleui配置后,后台显示空白页解决方法

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 django后台显示空白页解决方法 1. 正文 添加完simpleui以后&#xff0c;后台显示一片空白&#xff0c;一脸问号&#xff1f;&#xff1f;&#xff1f; …

MacBook Pro 休眠后五国,自动重启报错

看了网上很多情况&#xff0c;都说是系统的原因&#xff0c;2018年款的Mac已经过了保修期去过天才吧说花4k 换主板解决&#xff0c;花个几千块去解决这个问题不如折旧加钱再买个新的总之先用应急的办法1.电池偏好设置&#xff0c;接通电源时勾选“ 当显示器关闭时&#xff0c;防…

类的加载过程(生命周期)

类的加载过程(生命周期) 一、装载&#xff1a;通过一个类的全限定名获取定义此类的二进制字节流将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构在内存中生成一个代表这个类的java.lang.Class对象&#xff08;将字节码加载到内存中&#xff09;&#xff0c;作为…

扫地机器人(蓝桥杯C/C++)

题目描述 小明公司的办公区有一条长长的走廊&#xff0c;由 NN 个方格区域组成&#xff0c;如下图所示。 走廊内部署了 KK 台扫地机器人&#xff0c;其中第 ii 台在第 A_iAi​ 个方格区域中。已知扫地机器人每分钟可以移动到左右相邻的方格中&#xff0c;并将该区域清扫干净。…

DevOps落地与转型:提升研发效能的方法与实践

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作者&#x1f3c6;&#xff0c;阿里云专家博主&#x1f3…

使用 OpenCV 将图像转换为铅笔素描的 8 个步骤

使用 OpenCV 从彩色图像创建铅笔素描图像这个项目是我为 LetsGrowMore 的数据科学实习生创建的任务。LetsGrowMore &#xff1a;https://letsgrowmore.in/vip/目录什么是 OpenCV&#xff1f;第 1 步&#xff1a;读取图像第 2 步&#xff1a;将图像转换为灰度第 3 步&#xff1a…

MarkDown中写UML图的方法

目录序UML图之顺序图顺序图的四个要素关于消息箭头的语法Mermaid中顺序图的简单例子样例用小人表示对象为对象设置别名激活对象UML图之类图类图中常见的关系关于不同类型关系的语法Mermaid中类图的简单例子样例类定义的两种方式为类定义成员双向关系的表示多重性关系的表示UML之…

毕业设计 基于51单片机的手机蓝牙控制8位LED灯亮灭设计

基于51单片机的手机蓝牙控制8位LED灯亮灭设计1、项目简介1.1 系统构成1.2 系统功能2、部分电路设计2.1 STC89C52单片机核心系统电路设计2.2 LED电路设计2.3 蓝牙模块电路设计3、部分代码展示3.1 定时器初始化以及中断处理3.2 串口初始化3.3 串口中断处理1、项目简介 选题指导&…

微信授权登录流程以及公众号配置方法(golang后端)

一、准备一个已经认证OK的微信公众号和已经备案的域名&#xff0c;且解析好配置好https证书。 1.如上图 微信公众号 > 基本配置 &#xff0c;设置开发者密码 2.设置IP白名单&#xff0c;白名单填写提供后端服务的服务器公网IP 二、公众号服务器配置。 1.找到基本配置 2.将服…

C语言基础应用(二)数据的转换与输入输出

学习了C语言的基本数据类型后&#xff0c;我们可能会想这些数据如何进行运算&#xff0c;是否可以让不同类型的数据直接进行运算呢&#xff1f; 一、数据类型转换 1.1 int类型与float类型之间的转换 int i 5; // j值为2.000000 因为左右操作数均为整型float j i/2; // …