HBase搭建
Standalone HBase
本节介绍如何安装单节点的HBase。一个独立的实例拥有所有的HBase守护进程— Master, RegionServers, 和 ZooKeeper — 运行在一个持久化到本地文件系统的JVM中。这是我们最基本的部署配置文件
单节点HBase安装,选择一个新节点,不能在之前部署hadoop的节点上部署,因为分布式hadoop的环境变量会影响单节点HBase的启动
# JDK安装
wget https://builds.openlogic.com/downloadJDK/openlogic-openjdk/8u392-b08/openlogic-openjdk-8u392-b08-linux-x64.tar.gz
tar xf openlogic-openjdk-8u392-b08-linux-x64.tar.gz
mv openlogic-openjdk-8u392-b08-linux-x64 /usr/local/jdk8
rm -f openlogic-openjdk-8u392-b08-linux-x64.tar.gz
echo 'export JAVA_HOME=/usr/local/jdk8' >> /etc/profile
echo 'export PATH=$PATH:${JAVA_HOME}/bin' >> /etc/profile
source /etc/profile
# hbase安装
# 下载
cd ~
wget https://dlcdn.apache.org/hbase/stable/hbase-2.5.8-hadoop3-bin.tar.gz
tar xf hbase-2.5.8-hadoop3-bin.tar.gz
# 配置环境变量
echo 'export HBASE_HOME=/root/hbase-2.5.8-hadoop3' >> .bash_profile
echo 'export PATH=$PATH:$HBASE_HOME/bin' >> .bash_profile
source .bash_profile
# 修改 $HBASE_HOME/conf/hbase-env.sh 文件,添加JAVA_HOME
sed -i '/# export JAVA_HOME=/a export JAVA_HOME=/usr/local/jdk8' $HBASE_HOME/conf/hbase-env.sh
$HBASE_HOME/conf/hbase-site.xml
默认配置如下,下面做一些说明
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 设置为单机模式 -->
<property>
<name>hbase.cluster.distributed</name>
<value>false</value>
</property>
<!-- 本地文件系统上的临时目录;注意,hbase.rootdir是RegionServer共享的目录,HBase持久化到该目录,默认为${hbase.tmp.dir}/hbase,生产环境应该配置成hdfs路径;hbase.zookeeper.property.dataDir是ZK数据保存的路径,该属性来自于zookeeper的zoo.cfg文件中的dataDir配置,默认为${hbase.tmp.dir}/zookeeper,单机环境会同时启动zk,生产环境zk是独立部署的不需要配置 -->
<property>
<name>hbase.tmp.dir</name>
<value>./tmp</value>
</property>
<!-- 控制HBase是否检查流功能(hflush/hsync)。如果在LocalFileSystem上运行,请禁用此功能,用'file://'模式的rootdir表示。注意:将此设置为false会使您在进程或节点出现故障时无法看到潜在的数据丢失和不一致的系统状态。如果HBase抱怨无法使用hsync或hflush,那很可能不是误报 -->
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
</configuration>
# 启动hbase
start-hbase.sh
# 进入hbase的命令行进行相关操作
hbase shell
HBase基本操作
通用命令
# hbase命令行操作
# 查看帮助,ddl常用的有create,describe,disable,enable,list,list_regions,分别表示创建表、展示表详细信息、禁用表、启用表、展示表信息、展示region信息;namespace命名空间,类似于数据库中database的概念,默认有default和hbase两个命名空间;dml常用的有append,count,delete,get,put,scan,truncate,分别表示追加数据、统计数量、删除数据、查询数据、放入数据、扫描数据、清空表;tools是工具命令,一般用不到,flush可以用来手动将memstore刷到storefile,balancer可以用来手动负载均衡
help
# 查看命令帮助(命令需要用引号引起来),会给出详细的文档
help 'create'
# 展示regionserver的task列表
processlist
# 展示集群的状态
status
# table命令的帮助手册
table_help
# 显示hbase的版本
version
# 展示当前hbase的用户
whoami
# 退出 hbase shell
quit
namespace操作
# hbase命令行操作
# 创建命名空间
create_namespace 'my_ns'
# 获取命名空间的描述信息
describe_namespace 'my_ns'
# 修改命名空间的属性
alter_namespace 'my_ns', {METHOD => 'set', 'PROPERTY_NAME' => 'PROPERTY_VALUE'}
# 删除命名空间
drop_namespace 'my_ns'
# 展示所有的命名空间
list_namespace
# 展示某个命名空间下的所有表
list_namespace_tables 'hbase'
DDL操作
# hbase命令行操作
# 查看所有命名空间,默认有default和hbase两个命名空间
list_namespace
NAMESPACE
default
hbase
# 查看默认命名空间下所有的表
list
TABLE
0 row(s)
Took 0.0654 seconds
=> []
# 查看hbase命名空间下所有的表,有meta和namespace两张表,meta表的元数据是存储在ZK中的
list_namespace_tables 'hbase'
TABLE
meta
namespace
# 创建表,必须至少指定一个列族,create '表名','列族1','列族2'
create 'test', 'cf1', 'cf2'
Created table test
Took 1.2330 seconds
=> Hbase::Table - test
# 查看所有表
list
TABLE
test
# 展示表详细信息
describe 'test'
Table test is ENABLED
test, {TABLE_ATTRIBUTES => {METADATA => {'hbase.store.file-tracker.impl' => 'DEFAULT'}}}
COLUMN FAMILIES DESCRIPTION
{NAME => 'cf1', INDEX_BLOCK_ENCODING => 'NONE', VERSIONS => '1', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLICATION_SCOPE
=> '0', BLOOMFILTER => 'ROW', IN_MEMORY => 'false', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536 B (64KB)'}
{NAME => 'cf2', INDEX_BLOCK_ENCODING => 'NONE', VERSIONS => '1', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLICATION_SCOPE
=> '0', BLOOMFILTER => 'ROW', IN_MEMORY => 'false', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536 B (64KB)'}
# 修改表的属性
alter 'test', NAME => 'cf3', VERSIONS => 5
# 当需要删除表或修改表的设置时,以及其他一些情况下,需要先禁用该表,使用disable命令。可以使用enable命令重新启用
disable 'test'
enable 'test'
# 禁用以t开头的所有表,后面是正则表达式
disable_all 't.*'
# 启用以t开头的所有表,后面是正则表达式
enable_all 't.*'
# 删除以t开头的所有表,后面是正则表达式(需要先禁用才能删除)
drop_all 't.*'
# 删除表,删除之前需要禁用表
create 'test1', 'cf'
disable 'test1'
drop 'test1'
# 判断表是否存在
exists 'test'
# 获取表
get_table 'test'
# 判断表是否被禁用
is_disabled 'test'
# 判断表是否被启用
is_enabled 'test'
# 展示表占用的region
list_regions 'test'
# 定位某个rowkey所在的行在哪一个region
locate_region 'test','1'
# 展示所有的过滤器
show_filters
DML操作
# hbase命令行操作
# 查看表中所有数据,非默认命名空间需要加上命名空间前缀
# 可以看到,有table和info两个列族,info列族中有regioninfo,seqnumDuringOpen,server等多个列
scan 'hbase:meta'
ROW COLUMN+CELL
hbase:namespace column=table:state, timestamp=2024-04-10T10:37:41.913, value=\x08\x00
hbase:namespace,,1712716661432.2cadbfb66c7c1c4 column=info:regioninfo, timestamp=2024-04-10T10:37:41.907, value={ENCODED => 2cadbfb66c7c1c418bad083a78177792, NAME => 'hbase:namespace,
18bad083a78177792. ,1712716661432.2cadbfb66c7c1c418bad083a78177792.', STARTKEY => '', ENDKEY => ''}
hbase:namespace,,1712716661432.2cadbfb66c7c1c4 column=info:seqnumDuringOpen, timestamp=2024-04-10T10:37:41.907, value=\x00\x00\x00\x00\x00\x00\x00\x02
18bad083a78177792.
hbase:namespace,,1712716661432.2cadbfb66c7c1c4 column=info:server, timestamp=2024-04-10T10:37:41.907, value=baseOS:16020
18bad083a78177792.
hbase:namespace,,1712716661432.2cadbfb66c7c1c4 column=info:serverstartcode, timestamp=2024-04-10T10:37:41.907, value=1712716652275
18bad083a78177792.
hbase:namespace,,1712716661432.2cadbfb66c7c1c4 column=info:sn, timestamp=2024-04-10T10:37:41.683, value=baseos,16020,1712716652275
18bad083a78177792.
hbase:namespace,,1712716661432.2cadbfb66c7c1c4 column=info:state, timestamp=2024-04-10T10:37:41.907, value=OPEN
18bad083a78177792.
# 向表中添加数据,可以先通过 help 'put' 查看帮助,put '表名','rowkey','列族:列名','列对应的值'
put 'test', '1', 'cf1:name', 'zhangsan'
put 'test', '2', 'cf1:age', '12'
put 'test', '11', 'cf1:sex', 'man'
# 一次扫描表中的所有数据,可以看到数据是按照ROW的字典序排序的
scan 'test'
ROW COLUMN+CELL
1 column=cf1:name, timestamp=2024-04-10T10:39:45.574, value=zhangsan
11 column=cf1:sex, timestamp=2024-04-10T10:39:46.568, value=man
2 column=cf1:age, timestamp=2024-04-10T10:39:45.591, value=12
# 获取一行数据,get '表名','rowkey'
get 'test', '1'
COLUMN CELL
cf1:name timestamp=2024-04-10T10:39:45.574, value=zhangsan
# 将test表数据手动刷写到磁盘,这样在下面的shell中可以查看hbase存储的数据在磁盘中的格式
flush 'test'
# 可以通过 quit 退出 HBase Shell
# 可以通过 stop-hbase.sh 停止HBase
下面通过shell控制台查看hbase在磁盘上的数据
# shell 控制台
# 查看hbase存储的数据在磁盘中的格式,因为数据比较少,需要先执行flush刷写到磁盘才可以看到
# hbase目录是 /root/tmp/hbase
# archive(档案)之前合并之后的文件存在这里,data是数据存放目录,WALs存放日志文件(HLog),oldWALs当内存(memstore)中的数据写到磁盘(storefile)之后日志文件会从WALs移动到oldWALs(默认再保存两天)
ls /root/tmp/hbase
archive corrupt data hbase.id hbase.version MasterData mobdir oldWALs staging WALs
# 其data目录存储了数据,可以看到有两个默认的命名空间
ls /root/tmp/hbase/data
default hbase
# 查看default命名空间目录,可以看到有一张test表
ls /root/tmp/hbase/data/default
test
# 查看test表目录,可以看到有一个region
ls /root/tmp/hbase/data/default/test
575fc64986eda03e4971613dbba27b18
# 查看test表的region目录,可以看到有cf1和cf2两个列族
ls /root/tmp/hbase/data/default/test/575fc64986eda03e4971613dbba27b18
cf1 cf2 recovered.edits
# 查看test表的cf1列族目录,可以看到存储数据的文件(如果还没有执行flush则看不到数据)
ls /root/tmp/hbase/data/default/test/575fc64986eda03e4971613dbba27b18/cf1
275916dcc7344155aec8cbc45bf58ada
# 查看hbase数据文件内容,文件是二进制存储的,需要使用hbase提供的工具查看,可以看出是二进制数据
hbase hfile -p -f file:///root/tmp/hbase/data/default/test/575fc64986eda03e4971613dbba27b18/cf1/275916dcc7344155aec8cbc45bf58ada
K: 1/cf1:name/1712716785574/Put/vlen=8/seqid=4 V: zhangsan
K: 11/cf1:sex/1712716786568/Put/vlen=3/seqid=6 V: man
K: 2/cf1:age/1712716785591/Put/vlen=2/seqid=5 V: 12
cd /root/tmp/hbase/data/default/test/575fc64986eda03e4971613dbba27b18/cf1
# 在hbase shell中执行 put 'test', '1', 'cf1:name', 'lisi' 和 flush 'test'
# 查看目录,用于覆盖的数据产生了一个新文件
ls
275916dcc7344155aec8cbc45bf58ada e154d3a2cbd54ca39aea5d918b3963e7
# 查看新put的数据
hbase hfile -p -f e154d3a2cbd54ca39aea5d918b3963e7
K: 1/cf1:name/1712756548527/Put/vlen=4/seqid=13 V: lisi
# 在hbase shell中执行 put 'test', '2', 'cf1:age', '14' 和 flush 'test'
# 查看目录,用于覆盖的数据产生了一个新文件(在满足指定条件时flush是会自动执行的,在满足指定条件时也会对flush生成的小文件合并)
ls
275916dcc7344155aec8cbc45bf58ada e154d3a2cbd54ca39aea5d918b3963e7 f118008b79cb45c3a1bd42b5f93ab1db
# 查看新put的数据
hbase hfile -p -f f118008b79cb45c3a1bd42b5f93ab1db
K: 2/cf1:age/1712758048562/Put/vlen=2/seqid=17 V: 14
# 在hbase shell中执行 scan 'test' 可以看到数据是最新的,且按照ROW排序,由此得出内存和磁盘共同维护了索引,来保证数据是实时的且ROW有序
其它DML操作
# hbase命令行操作
create 't1','cf1','cf2'
put 't1','r1','cf1:c1','test1'
put 't1','r2','cf1:c1','test2'
put 't1','r3','cf1:c1','test3'
put 't1','r4','cf1:c1','test4'
put 't1','r5','cf1:c1','test5'
# 追加数据
append 't1', 'r1', 'cf1:c1', 'value', ATTRIBUTES=>{'mykey'=>'myvalue'}
# 查看追加的数据
get 't1','r1'
COLUMN CELL
cf1:c1 timestamp=2024-04-15T16:38:58.420, value=test1value
# 统计表的记录条数,默认一千条输出一次
count 't1'
# 删除指定时间戳的数据
put 't1','r1','cf1:c2','c2_test2'
put 't1','r1','cf1:c2','c2_test3'
# 删除之前查询数据
get 't1','r1'
COLUMN CELL
cf1:c1 timestamp=2024-04-15T16:38:58.420, value=test1value
cf1:c2 timestamp=2024-04-15T16:40:16.172, value=c2_test3
# 2024-04-15T16:40:16.172 时间戳是 1713170416172
delete 't1','r1','cf1:c2',1713170416172
# 删除之后,显示之前版本的数据
get 't1','r1'
COLUMN CELL
cf1:c1 timestamp=2024-04-15T16:38:58.420, value=test1value
cf1:c2 timestamp=2024-04-15T16:39:58.932, value=c2_test2
# 删除某一行指定列的数据
deleteall 't1','r1','cf1:c1'
# 删除某一行指定列族的数据
put 't1','r1','cf2:c2','cf2_c2_test2'
deleteall 't1','r1','cf1'
get 't1','r1'
# 删除某一行数据
deleteall 't1','r1'
# 增加一个cell的值
incr 't1','r1','cf2:age',10
# incr命令只能操作整型cell
get 't1','r1'
COLUMN CELL
cf2:age timestamp=2024-04-15T16:59:08.131, value=\x00\x00\x00\x00\x00\x00\x00\x0A
cf2:c1 timestamp=2024-04-15T16:53:28.374, value=1
# 获取一个cell的数值,只能操作整型cell
get_counter 't1','r1','cf2:age'
COUNTER VALUE = 10
# 获取表的切片
get_splits 't1'
# 清空表
truncate 't1'
测试文件自动合并
修改$HBASE_HOME/conf/hbase-site.xml
配置文件,添加如下配置,并重启hbase
<!-- 在压缩运行之前必须符合压缩条件的storefile的最小数量,这里是默认值3,即有3个待压缩的storefile就会进行压缩 -->
<property>
<name>hbase.hstore.compaction.min</name>
<value>3</value>
</property>
<!-- 定期检查是否需要压缩,由下面两个配置的乘积确定,这里配置都是1,即1秒检查一次 -->
<property>
<name>hbase.server.thread.wakefrequency</name>
<value>1</value>
</property>
<property>
<name>hbase.server.compactchecker.interval.multiplier</name>
<value>1</value>
</property>
# hbase shell
create 'test01', 'cf'
put 'test01', '1', 'cf:name', 'zhangsan'
flush 'test01'
put 'test01', '2', 'cf:age', '12'
flush 'test01'
put 'test01', '11', 'cf:sex', 'man'
flush 'test01'
# os shell
cd /root/tmp/hbase/data/default/test01/*/cf
# c6534cadc19642d1bff627760500ca48 是合并之后的文件,之前的文件大概会在一分钟左右自动删除
ll
-rw-r--r-- 1 root root 4862 Apr 11 11:08 5d6e5f8fe4d04b0ba7ef1633c34a6c17
-rw-r--r-- 1 root root 5030 Apr 11 11:09 c6534cadc19642d1bff627760500ca48
-rw-r--r-- 1 root root 4859 Apr 11 11:09 de120c89b58549f1907b606a95cfd7e2
-rw-r--r-- 1 root root 4853 Apr 11 11:09 fe6a3b3c3c134dfda55fac4b02e88d50
# 从下面查看文件的内容,可以看出 c6534cadc19642d1bff627760500ca48 是合并之后的文件
hfile -p -f 5d6e5f8fe4d04b0ba7ef1633c34a6c17
K: 1/cf:name/1712804930752/Put/vlen=8/seqid=4 V: zhangsan
hfile -p -f c6534cadc19642d1bff627760500ca48
K: 1/cf:name/1712804930752/Put/vlen=8/seqid=4 V: zhangsan
K: 11/cf:sex/1712804953555/Put/vlen=3/seqid=12 V: man
K: 2/cf:age/1712804943097/Put/vlen=2/seqid=8 V: 12
# 一分钟之后查看,合并之前的文件自动删除了
ll
-rw-r--r-- 1 root root 5030 Apr 11 11:09 c6534cadc19642d1bff627760500ca48
在下面搭建的完全分布式环境中也可以进行类似的测试
Fully Distributed
实际上,您需要一个完全分布式的配置来全面测试HBase并在实际场景中使用它。在分布式配置中,集群包含多个节点,每个节点运行一个或多个HBase守护进程。包括主备Master实例、多个ZooKeeper节点和多个RegionServer节点
hbase.apache.org/book.html 可以在这里找到hbase与hadoop的兼容版本。这里基于之前搭建的hadoop-3.2.4完全分布式环境,搭建hbase-2.5.8。所有节点的角色如下所示
节点 | NN | DN | ZK | ZKFC | JN | RM | NM | HMaster | HRegionServer |
---|---|---|---|---|---|---|---|---|---|
node01 | ★ | ★ | ★ | ★ | ★ | ||||
node02 | ★ | ★ | ★ | ★ | ★ | ★ | ★ | ||
node03 | ★ | ★ | ★ | ★ | ★ | ||||
node04 | ★ | ★ | ★ | ★ | ★(备用) | ★ |
这里只需要部署hbase的HMaster和HRegionServer,其它的都已经部署好了
# hosts配置
# JDK安装,并配置环境变量
# 关闭防火墙,关闭selinux
# 时间同步配置
# HMaster所在节点到HRegionServer节点的免密配置,即node01到node03和node04配置免密
# 上面的步骤都已经操作过,不需要再操作了
# node01节点,bigdata用户
# 安装hbase
# 下载
cd ~
wget https://dlcdn.apache.org/hbase/stable/hbase-2.5.8-hadoop3-bin.tar.gz
tar xf hbase-2.5.8-hadoop3-bin.tar.gz
# 配置环境变量
echo 'export HBASE_HOME=/home/bigdata/hbase-2.5.8-hadoop3' >> .bash_profile
echo 'export PATH=$PATH:$HBASE_HOME/bin' >> .bash_profile
source .bash_profile
# 修改 $HBASE_HOME/conf/hbase-env.sh 文件
# 添加JAVA_HOME
sed -i '/# export JAVA_HOME=/a export JAVA_HOME=/usr/local/jdk8' $HBASE_HOME/conf/hbase-env.sh
# 设置是否使用自己的zk实例,这里使用搭建hadoop时使用的zk
sed -i '/# export HBASE_MANAGES_ZK/a export HBASE_MANAGES_ZK=false' $HBASE_HOME/conf/hbase-env.sh
# 备份hbase-site.xml文件
cp $HBASE_HOME/conf/hbase-site.xml $HBASE_HOME/conf/hbase-site.xml.back
$HBASE_HOME/conf/hbase-site.xml
备份这个配置文件,并将内容修改成如下所示
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://mycluster/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>node02,node03,node04</value>
</property>
</configuration>
# node01节点,bigdata用户
# 修改regionservers文件,设置regionserver分布在哪几个节点
echo 'node01
node02
node04' > $HBASE_HOME/conf/regionservers
# 配置HMaster的高可用,需要在conf目录下创建backup-masters文件,添加备用HMaster节点。在HBase任意节点都可以启动HMaster,也都可以成为备用Master,启动命令是`hbase-daemon.sh start master`。通过start-hbase.sh启动hbase,当前节点会自动成为ActiveMaster。这里即使HMaster和HRegionServer是同一个节点,也需要配置成不同的域名访问,这样可以在不修改hbase配置的前提下,迁移或更改HMaster
# node01节点,root用户
# 配置备用HMaster的hosts,并拷贝到其它节点
echo '192.168.91.34 backup.hmaster1' >> /etc/hosts
for i in 2 3 4;do scp /etc/hosts node0$i:/etc/hosts;done
# node01节点,bigdata用户
# 修改backup-masters文件,设置备用master分布在哪几个节点
echo 'backup.hmaster1' > $HBASE_HOME/conf/backup-masters
# 复制hdfs-site.xml到hbase配置目录
cp $HADOOP_HOME/etc/hadoop/hdfs-site.xml $HBASE_HOME/conf/
# 将配置好的hbase打包,拷贝到其它节点
cd ~
tar -zcvf hbase-2.5.8-hadoop3.tar.gz hbase-2.5.8-hadoop3/
for i in 2 3 4;do scp hbase-2.5.8-hadoop3.tar.gz node0$i:`pwd`;done
# node04节点,bigdata用户
# node04节点作为备用master,需要配置到其它节点的免密
# 生成免密公钥和私钥
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
# 将公钥发送到所有节点包括node04,按照提示输入密码即可
ssh-copy-id node01
ssh-copy-id node02
ssh-copy-id node03
ssh-copy-id node04
# node01节点,bigdata用户
# 第一次启动hbase的节点会自动成为ActiveMaster,需要配置ActiveMaster到备用master的免密。这里会在node01启动hbase,因此需要配置node01到node04节点(备用master)免密,需要通过backup-masters文件中配置的ip或域名免密,这里是通过backup.hmaster1远程node04节点,这里先执行一次,第一次执行需要输入yes,否则在node01节点第一次启动hbase时需要输入yes(免密已经通过域名node04配置过,相同的ip不同的域名不需要重复配置,但是第一次ssh时仍然需要输入yes)
ssh backup.hmaster1
exit
# node02-node04节点,bigdata用户
cd ~
tar xf hbase-2.5.8-hadoop3.tar.gz
rm -f hbase-2.5.8-hadoop3.tar.gz
echo 'export HBASE_HOME=/home/bigdata/hbase-2.5.8-hadoop3' >> .bash_profile
echo 'export PATH=$PATH:$HBASE_HOME/bin' >> .bash_profile
source .bash_profile
# node01节点,bigdata用户
# 启动hadoop集群
sh bin/hadoop_all_start.sh
# 启动hbase集群
start-hbase.sh
# 如果想要停止HBase集群,可以在HMaster节点上执行"stop-hbase.sh"命令
# 可以执行上面搭建Standalone HBase时在hbase shell中的操作,验证集群
# 进入hbase shell
hbase shell
# 创建表
create 'test', 'cf1', 'cf2'
# 放入数据
put 'test', '1', 'cf1:name', 'zhangsan'
put 'test', '2', 'cf1:age', '12'
put 'test', '11', 'cf1:sex', 'man'
# 查询全表数据
scan 'test'
ROW COLUMN+CELL
1 column=cf1:name, timestamp=2024-04-10T15:07:47.465, value=zhangsan
11 column=cf1:sex, timestamp=2024-04-10T15:07:48.240, value=man
2 column=cf1:age, timestamp=2024-04-10T15:07:47.486, value=12
# 刷写数据到hdfs中
flush 'test'
# 退出hbase shell
quit
# 查看刚刚创建的表,在hdfs中存储的格式
dfs -ls -R /hbase/data/default
drwxr-xr-x - bigdata supergroup 0 2024-04-10 15:07 /hbase/data/default/test
drwxr-xr-x - bigdata supergroup 0 2024-04-10 15:07 /hbase/data/default/test/.tabledesc
-rw-r--r-- 3 bigdata supergroup 629 2024-04-10 15:07 /hbase/data/default/test/.tabledesc/.tableinfo.0000000001.629
drwxr-xr-x - bigdata supergroup 0 2024-04-10 15:11 /hbase/data/default/test/0d5380031e077cd9fa79db867593cb82
-rw-r--r-- 3 bigdata supergroup 39 2024-04-10 15:07 /hbase/data/default/test/0d5380031e077cd9fa79db867593cb82/.regioninfo
drwxr-xr-x - bigdata supergroup 0 2024-04-10 15:11 /hbase/data/default/test/0d5380031e077cd9fa79db867593cb82/.tmp
drwxr-xr-x - bigdata supergroup 0 2024-04-10 15:11 /hbase/data/default/test/0d5380031e077cd9fa79db867593cb82/.tmp/cf1
drwxr-xr-x - bigdata supergroup 0 2024-04-10 15:11 /hbase/data/default/test/0d5380031e077cd9fa79db867593cb82/cf1
-rw-r--r-- 3 bigdata supergroup 4932 2024-04-10 15:11 /hbase/data/default/test/0d5380031e077cd9fa79db867593cb82/cf1/47d3fc5fc2234199bad91fd3694b48f4
drwxr-xr-x - bigdata supergroup 0 2024-04-10 15:07 /hbase/data/default/test/0d5380031e077cd9fa79db867593cb82/cf2
drwxr-xr-x - bigdata supergroup 0 2024-04-10 15:07 /hbase/data/default/test/0d5380031e077cd9fa79db867593cb82/recovered.edits
-rw-r--r-- 3 bigdata supergroup 0 2024-04-10 15:07 /hbase/data/default/test/0d5380031e077cd9fa79db867593cb82/recovered.edits/1.seqid
# 查看文件内容
hbase hfile -p -f hdfs://mycluster/hbase/data/default/test/0d5380031e077cd9fa79db867593cb82/cf1/47d3fc5fc2234199bad91fd3694b48f4
...
K: 1/cf1:name/1712732867465/Put/vlen=8/seqid=4 V: zhangsan
K: 11/cf1:sex/1712732868240/Put/vlen=3/seqid=6 V: man
K: 2/cf1:age/1712732867486/Put/vlen=2/seqid=5 V: 12
# hdfs://mycluster 前缀也可以省略
hbase hfile -p -f /hbase/data/default/test/0d5380031e077cd9fa79db867593cb82/cf1/47d3fc5fc2234199bad91fd3694b48f4
测试HBase高可用
node04节点的webui显示:Current Active Master: node01(hbase在哪个节点启动的,该节点就是Active Master)
在node01节点执行hbase-daemon.sh stop master
停止hmaster或者直接kill掉hmaster,此时node04节点变成Active Master,webui如下
可以在任意hbase节点,通过hbase-daemon.sh stop master
启动hmaster,让其加入备用master