分布式NoSQL数据库HBase实践与原理剖析(一)

news2025/7/17 10:39:46

title: HBase系列


第一章 HBase基础理论

1.1 HBase简介

Apache HBase™ is the Hadoop database, a distributed, scalable, big data store.
Apache HBase™ 是Hadoop数据库,是一种分布式、可扩展的大数据存储。

HBase 是 BigTable 的开源 java 版本。
建立在 HDFS 之上,提供高可靠性、高性能、列存储、可伸缩、实时读写的 NoSQL 数据库系统。

NoSQL的两种解释,更精确的是后者
NoSQL = NO SQL
NoSQL = Not Only SQL

NoSQL:HBase, Redis, MongoDB

​ NoSQL数据库基本上都是Key-Value类型存储数据的。

RDBMS:MySQL,Oracle,SQL Server,DB2

​ RDBMS数据库基本上都可以通过SQL去进行操作

以下几点是 HBase 这个 NoSQL 数据库的要点:
1、它仅能通过主键(row key)和主键的 range 来检索数据;
2、HBase查询数据功能简单,不支持 join 等复杂操作;
3、不支持复杂的事务(行级的事务);
4、HBase 中支持的数据类型:byte[] ;
5、主要用来存储结构化和半结构化的数据。

与 Hadoop 一样,HBase 目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力。

HBase 中的表一般有这样的特点:
1、大:一个表可以有上十亿行,上百万列;
2、面向列:面向列(簇)的存储和权限控制,列(簇)独立检索;
3、稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。

1.2 HBase逻辑存储

在这里插入图片描述

在这里插入图片描述

首先,要知道一下,HBase的数据模型其实和关系型数据库类似,数据都是存储在某张表中间,有行也有列的。
从HBase的底层物理存储结构来看,HBase像一个多维的map结构。

高表: 几十亿行
宽表: 几百个列

效率 成本 质量

1.3 HBase物理存储

在这里插入图片描述

1.4 HBase中重要的新概念

1.4.1 RowKey(行键)

与 NoSQL 数据库们一样,Rowkey 是用来检索记录的主键。访问 HBase table 中的行,有如下的方式:
1、通过单个 Rowkey 访问
2、通过 Rowkey 的 range
3、全表扫描

​ Rowkey 行键 (Rowkey)可以是任意字符串(最大长度是 64KB,实际应用中长度一般为 10-100byte)。在 HBase 内部,rowkey 保存为字节数组。HBase 会对表中的数据 按照 Rowkey 排序(字典顺序) 。

​ 存储时,数据按照 Rowkey 的字典序(byte order)排序存储。设计 key 时,要充分排序存储这个特性,将经常一起读取的行存储放到一起。

1.4.2 列簇(Column Family)

​ HBase表中的每个列,都归属与某个列簇。列簇是表的 schema 的一部分(而列限定符不是),必须在使用表之前定义。

​ 列名都以列簇作为前缀。例如 courses:history , courses:math 都属于 courses 这个列簇。

​ 列族越多,在取一行数据时所要参与 IO、搜寻的文件就越多,所以,如果没有必要,不要设置太多的列族

1.4.3 TimeStamp(时间戳)

​ HBase 中通过 row 和 columns 确定的为一个存储单元称为 cell。

​ 每个 cell 都保存着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是 64 位整型。时间戳可以由 HBase(在数据写入时自动 )赋值,此时时间戳是精确到毫秒的当前系统时间。

​ 时间戳也可以由客户显式赋值。如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。
每个 cell 中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。

1.4.4 Cell

由{rowkey, column( = +

Cell 中的数据是没有类型的,全部是字节码形式存储。 HBase提供了工具类将String、Double、Integer等和字节数据之间来回转换。

1.4.5 NameSpace

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

1.4.6 Row

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

1.4.7 Region

相当于表的切片。类似于关系型数据库的表概念。但是,在HBase中定义表时只需要声明列族即可,不需要声明具体的列。也就是说,往 HBase 写入数据时,字段可以动态的按需指定。与关系型数据库相比,HBase 能够应对字段变更的场景。一个表的数据到10g的数据时候开始切,其实刚开开始的时候就一个Region。

1.4.8 Column

HBase 中的每个列都由Column Family (列簇)和Column Qualifier (列限定符)进行限定,例如 info:name , info:age。建表的时候只需指明列簇,而列限定符不需要提前定义。

1.5 先看一个简易版的架构

简易版架构

在这里插入图片描述

RegionServer的作用:
	Region:Split Region, Compact Region。  分久必合,合久必分。
	Data:get、put(包含更新了)、delete。针对数据的增删改查,相当于DML

Master的作用:
	Table:create、delete、alter、list、desc。针对表的增删改查,相当于DDL。
	RegionServer:分配regions到每个RegionServer,监控每个RegionServer的状态
		管理Region的Server

第二章 HBase安装部署

2.1 HBase1.3.1集群搭建

​ 注意安装hbase集群之前一定要保证hadoop集群没有问题,安装之前给所有节点上运行的集群先停了。

1 在hadoop0上面上传解压重命名

mv hbase-1.3.1-bin.tar.gz /software
cd /software
tar -zxvf hbase-1.3.1-bin.tar.gz
mv hbase-1.3.1 hbase

在这里插入图片描述

2 添加环境变量

修改 vi /etc/profile

export HBASE_HOME=/software/hbase  
export  PATH=.:$PATH:$HBASE_HOME/bin  

配置如下图,也可以在一个PATH后面使劲加上所有的大数据文件的bin:

在这里插入图片描述

3 修改配置文件

在目录/software/hbase/conf下面

(1)vi hbase-env.sh

export JAVA_HOME=/software/jdk/  
export HBASE_MANAGES_ZK=false #可以在命令模式下通过/进行查找  
这里false代表的使用的外置的zookeeper,true代表的使用的是hadoop自带的zookeeper

(2)vi hbase-site.xml

​ 注意hdfs://hadoop0:8020/hbase的端口和hadoop保持一致,hadoop没有配置端口默认是8020,配置了一般配置9000端口。

<property>
        <name>hbase.rootdir</name>
        <value>hdfs://hadoop0:8020/hbase</value>
</property>
<property>
        <name>hbase.cluster.distributed</name>
        <value>true</value>
</property>
<property>
        <name>hbase.zookeeper.quorum</name>
        <value>hadoop0,hadoop1,hadoop2</value>
</property>
<property>
        <name>hbase.zookeeper.property.dataDir</name>
        <value>/software/zk</value>
</property>

(3)修改regionservers文件(存放的region server的hostname),内容修改为如下:

hadoop1  
hadoop2  

(4)复制hadoop0中的hbase文件夹到hadoop1、hadoop2中,在hadoop0中执行如下命令

scp -r /software/hbase hadoop1:/software/  
scp -r /software/hbase hadoop2:/software/  

(5)复制hadoop0中的/etc/profile到hadoop1、hadoop2中,在hadoop1、hadoop2上执行source /etc/profile

scp /etc/profile hadoop1:/etc/  
scp /etc/profile hadoop2:/etc/ 

或者直接修改 vi /etc/profile

export HBASE_HOME=/software/hbase  
export PATH=.:$PATH:$HBASE_HOME/bin  

4 启动/停止HBase集群

1、在三台服务器上分别使用zkServer.sh start启动ZooKeeper

2、在hadoop0先启动Hadoop

3、启动HBASE

在主节点hadoop0上面启动,进入/software/hbase/bin目录

配置了环境变量可以在任意目录下使用start-hbase.sh都可以启动。

./start-hbase.sh

4、停止

cd $HBASE_HOME/bin
./stop-hbase.sh

5、shell命令验证

在主服务器上面

hbase shell

然后list

quit 或 exit 退出

在这里插入图片描述

6、界面化验证

通过浏览器访问:http://hadoop0:16010

原来0.x版本是60010端口

在这里插入图片描述

先停止hbase,再停止hadoop,最后停止zkServer

7、各个节点进程

hadoop0:

[root@hadoop0 bin]# jps
2498 NameNode
3172 HMaster
2311 QuorumPeerMain
2778 ResourceManager
4751 Jps

hadoop1:

[root@hadoop1 bin]# jps
2640 HRegionServer
2259 DataNode
2454 NodeManager
4042 Jps
2157 QuorumPeerMain
2365 SecondaryNameNode

hadoop2:

[root@hadoop2 bin]# jps
2544 HRegionServer
2146 QuorumPeerMain
2242 DataNode
2360 NodeManager
3897 Jps

其中:

ZooKeeper进程为:QuorumPeerMain

Hadoop进程:NameNode、DataNode、ResourceManager、NodeManager、SecondaryNameNode

HBase进程:HMaster、HRegionServer

2.2 HBase2.3.6 集群搭建

2.3.6 是目前的最新稳定版本 ,仅仅到目前讲课时间。

注意安装hbase集群之前一定要保证hadoop集群没有问题,安装之前给所有节点上运行的集群先停了。

1 在hadoop10上面上传解压重命名

mv hbase-2.3.6-bin.tar.gz /software
cd /software
tar -zxvf hbase-2.3.6-bin.tar.gz
mv hbase-2.3.6 hbase

在这里插入图片描述

2 添加环境变量

修改 vi /etc/profile

export HBASE_HOME=/software/hbase
export PATH=.:$PATH:$HBASE_HOME/bin

配置如下图,也可以在一个PATH后面使劲加上所有的大数据文件的bin:

在这里插入图片描述

3 修改配置文件

在目录/software/hbase/conf下面

(1)vi hbase-env.sh

export JAVA_HOME=/software/jdk/
export HBASE_MANAGES_ZK=false #可以在命令模式下通过/进行查找  
这里false代表的使用的外置的zookeeper,true代表的使用的是HBase自带的zookeeper

在这里插入图片描述

(2)vi hbase-site.xml

​ 注意hdfs://hadoop10:8020/hbase的端口和hadoop保持一致,hadoop没有配置端口默认是8020,配置了一般配置9000端口。

<property>
    <name>hbase.rootdir</name>
    <value>hdfs://hadoop10:8020/hbase</value>
</property>
<property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
</property>
<property>
    <name>hbase.zookeeper.quorum</name>
    <value>hadoop10,hadoop11,hadoop12</value>
</property>
<property>
    <name>hbase.zookeeper.property.dataDir</name>
    <value>/software/zk</value>
</property>

(3)修改regionservers文件(存放的region server的hostname),内容修改为如下:

hadoop11
hadoop12

(4)复制hadoop10中的hbase文件夹到hadoop11、hadoop12中,在hadoop10中执行如下命令

scp -r /software/hbase hadoop11:/software/
scp -r /software/hbase hadoop12:/software/

(5)修改hadoop11和hadoop12上面的配置文件 vim /etc/profile

export HBASE_HOME=/software/hbase
export PATH=.:$PATH:$HBASE_HOME/bin

最后source /etc/profile

4 启动/停止HBase集群

1、在三台服务器上分别使用zkServer.sh start启动ZooKeeper

2、在hadoop10先启动Hadoop

3、启动HBASE

在主节点hadoop10上面启动,进入/software/hbase/bin目录

配置了环境变量可以在任意目录下使用start-hbase.sh都可以启动。

./start-hbase.sh

4、停止

cd $HBASE_HOME/bin
./stop-hbase.sh

5、shell命令验证

在主服务器上面

hbase shell

然后list

quit 或 exit 退出(不用加分号)

在这里插入图片描述

6、界面化验证

通过浏览器访问:http://hadoop10:16010/master-status

原来0.x版本是60010端口

在这里插入图片描述

先停止hbase,再停止hadoop,最后停止zkServer

7、各个节点进程

hadoop10:

[root@hadoop10 software]# jps
57681 Jps
55906 QuorumPeerMain
56722 ResourceManager
56229 NameNode
57367 HMaster

hadoop1:

[root@hadoop11 bin]# jps
55587 QuorumPeerMain
56291 HRegionServer
56005 NodeManager
56617 Jps
55758 DataNode
55903 SecondaryNameNode

hadoop2:

[root@hadoop12 bin]# jps
51397 Jps
50471 QuorumPeerMain
50808 NodeManager
50651 DataNode
51087 HRegionServer

其中:

ZooKeeper进程为:QuorumPeerMain

Hadoop进程:NameNode、DataNode、ResourceManager、NodeManager、SecondaryNameNode

HBase进程:HMaster、HRegionServer

第三章 HBase的Shell操作

如果遇到不会的命令,直接使用help查看一下即可。会有案例提示。
hbase(main):080:0> help ‘deleteall’

3.1 小理论

1、进入HBase客户端命令行

bin/hbase shell

在这里插入图片描述

2、查看当前数据库中有哪些表

list

在这里插入图片描述

3、帮助命令

在这里插入图片描述

4、创建表

create 'student','info'

在这里插入图片描述

5、插入数据到表

put 'student','1001','info:sex','male'
put 'student','1001','info:age','18'
put 'student','1002','info:name','zhangsan'
put 'student','1002','info:sex','female'
put 'student','1002','info:age','20'

在这里插入图片描述

6、查看表数据

scan 'student'

在这里插入图片描述

//前闭后开
scan 'student',{STARTROW => '1001', STOPROW  => '1002'}

在这里插入图片描述

7、查看表结构

describe 'student'

8、修改数据

put 'student','1001','info:name','lisi'

9、删除表

先disable,再drop。

3.2 实际操作(除了put之外的相当于DDL操作)

基本操作
1.进入HBase客户端命令行
bin/hbase shell
2.查看帮助命令
hbase(main):001:0> help
3.查看当前数据库中有哪些表
hbase(main):002:0> list
3.2 表的操作
1.创建表
hbase(main):005:0> create 'student','info'
2.插入数据到表
put 'student3','1001','info:name','zhangsan'
put 'student3','1001','info:sex','male'
put 'student3','1001','info:age','18'
put 'student3','1002','info:name','lisi'
put 'student3','1002','info:sex','female'
put 'student3','1002','info:age','20'

hbase(main):003:0> put 'student','1001','info:sex','male'
hbase(main):004:0> put 'student','1001','info:age','18'
hbase(main):005:0> put 'student','1002','info:name','zhangsan'
hbase(main):006:0> put 'student','1002','info:sex','female'
hbase(main):007:0> put 'student','1002','info:age','20'
3.扫描查看表数据
hbase(main):008:0> scan 'student'
hbase(main):009:0> scan 'student',{STARTROW => '1001', STOPROW  => '1002'}
hbase(main):010:0> scan 'student',{STARTROW => '1001'}
4.查看表结构
hbase(main):020:0> describe 'student'
5.更新指定字段的数据
hbase(main):012:0> put 'student','1001','info:name','lisi'
hbase(main):013:0> put 'student','1001','info:age','100'
6.查看“指定行”或“指定列族:列”的数据
hbase(main):014:0> get 'student','1001'
hbase(main):015:0> get 'student','1001','info:name'
7.统计表数据行数
hbase(main):021:0> count 'student'
8.删除数据
删除某rowkey的全部数据:
hbase(main):016:0> deleteall 'student','1001'
删除某rowkey的某一列数据:
hbase(main):017:0> delete 'student','1002','info:sex'
9.清空表数据
hbase(main):018:0> truncate 'student'
提示:清空表的操作顺序为先disable,然后再truncate。
10.删除表
首先需要先让该表为disable状态:
hbase(main):019:0> disable 'student'
然后才能drop这个表:
hbase(main):020:0> drop 'student'
提示:如果直接drop表,会报错:ERROR: Table student is enabled. Disable it first.
11.变更表信息
将info列族中的数据存放3个版本,也就是修改最多保存的版本的个数,注意修改的时候NAME,VERSIONS这些是大小写敏感的:
hbase(main):022:0> alter 'student',{NAME=>'info',VERSIONS=>3}
hbase(main):025:0> describe 'student'

先添加一行,再次测试
hbase(main):005:0> put 'student','1002','info:name','zhangsan'
hbase(main):023:0> get 'student','1001',{COLUMN=>'info:name',VERSIONS=>3}

3.3 关于命名空间NameSpace的操作

hbase(main):035:0> list_namespace
list_namespace          list_namespace_tables
  
hbase(main):035:0> list_namespace
NAMESPACE
default                                                                 
hbase
2 row(s)
Took 0.0317 seconds

hbase(main):036:0> create_namespace 'ns2'
Took 0.1358 seconds

hbase(main):037:0> list_namespace
NAMESPACE
default
hbase 
ns2 
3 row(s)
Took 0.0109seconds

hbase(main):038:0> list
TABLE
student
1 row(s)
Took 0.0042 seconds
=> ["student"]

//不能直接切换namespace,想在创建表的时候,直接在前面加上namespace名字即可。
hbase(main):039:0> use 'ns2'
NoMethodError: undefined method `use' for main:Object

hbase(main):040:0> create "ns2:stu","info"
Created table ns2:stu
Took 2.1326 seconds
=> Hbase::Table - ns2:stu

hbase(main):041:0> list
TABLE 
student
ns2:stu
2 row(s)
Took 0.0121 seconds
=> ["student", "ns2:stu"]

//删除命名空间,需要先给里面的表disable并删除掉。
hbase(main):042:0> drop_namespace 'ns2'
ERROR: org.apache.hadoop.hbase.constraint.ConstraintException: Only empty namespaces can be removed. Namespace ns2 has 1 tables
	at org.apache.hadoop.hbase.master.procedure.DeleteNamespaceProcedure.prepareDelete(DeleteNamespaceProcedure.java:217)
	at org.apache.hadoop.hbase.master.procedure.DeleteNamespaceProcedure.executeFromState(DeleteNamespaceProcedure.java:78)
	at org.apache.hadoop.hbase.master.procedure.DeleteNamespaceProcedure.executeFromState(DeleteNamespaceProcedure.java:45)
	at org.apache.hadoop.hbase.procedure2.StateMachineProcedure.execute(StateMachineProcedure.java:194)
	at org.apache.hadoop.hbase.procedure2.Procedure.doExecute(Procedure.java:962)
	at org.apache.hadoop.hbase.procedure2.ProcedureExecutor.execProcedure(ProcedureExecutor.java:1669)
	at org.apache.hadoop.hbase.procedure2.ProcedureExecutor.executeProcedure(ProcedureExecutor.java:1416)
	at org.apache.hadoop.hbase.procedure2.ProcedureExecutor.access$1100(ProcedureExecutor.java:79)
	at org.apache.hadoop.hbase.procedure2.ProcedureExecutor$WorkerThread.run(ProcedureExecutor.java:1986)

For usage try 'help "drop_namespace"'
Took 0.0439 seconds 

hbase(main):043:0> disable 'ns2:stu'
Took 0.3387 seconds

hbase(main):044:0> drop 'ns2:stu'
Took 0.1344 seconds

hbase(main):045:0> drop_namespace 'ns2'
Took 0.1184 seconds

hbase(main):046:0> list_namespace
NAMESPACE                                                                            
default                                                                                   hbase                                                                                     2 row(s)
Took 0.0140 seconds             

3.4 DML操作

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

hbase(main):052:0> put 'student','1001','info:name','zhangsan'
Took 0.0411 seconds

hbase(main):053:0> scan 'student'
ROW                                         COLUMN+CELL
 1001                                       column=info:name, timestamp=2021-10-12T20:33:17.966, value=zhangsan
 
1 row(s)
Took 0.0041 seconds

hbase(main):055:0> get 'student','1001'
COLUMN                                      CELL
 info:name                                  timestamp=2021-10-12T20:33:17.966, value=zhangsan
1 row(s)
Took 0.0070 seconds

再次多放几条数据进去可以测试使用的。
put 'student','1001','info:sex','male'
put 'student','1001','info:age','18'
put 'student','1002','info:name','zhangsan'
put 'student','1002','info:sex','female'
put 'student','1002','info:age','20'

hbase(main):061:0> scan 'student'
ROW                                         COLUMN+CELL
 1001                                       column=info:age, timestamp=2021-10-12T20:39:38.391, value=18
 1001                                       column=info:name, timestamp=2021-10-12T20:33:17.966, value=zhangsan
 1001                                       column=info:sex, timestamp=2021-10-12T20:39:38.369, value=male
 1002                                       column=info:age, timestamp=2021-10-12T20:39:39.350, value=20
 1002                                       column=info:name, timestamp=2021-10-12T20:39:38.413, value=zhangsan
 1002                                       column=info:sex, timestamp=2021-10-12T20:39:38.443, value=female
 2 row(s)
Took 0.0116 seconds 

hbase(main):062:0> get 'student','1001'
COLUMN                                      CELL 
 info:age                                   timestamp=2021-10-12T20:39:38.391, value=18
 info:name                                  timestamp=2021-10-12T20:33:17.966, value=zhangsan
 info:sex                                   timestamp=2021-10-12T20:39:38.369, value=male
 1 row(s)
Took 0.0061 seconds

hbase(main):063:0> get 'student','1001','info:name'
COLUMN                                      CELL
 info:name                                  timestamp=2021-10-12T20:33:17.966, value=zhangsan
 1 row(s)
Took 0.0065 seconds 

hbase(main):064:0> get 'student','1001','info'
COLUMN                                      CELL
 info:age                                   timestamp=2021-10-12T20:39:38.391, value=18
 info:name                                  timestamp=2021-10-12T20:33:17.966, value=zhangsan
 info:sex                                   timestamp=2021-10-12T20:39:38.369, value=male
 1 row(s)
Took 0.0067 seconds

hbase(main):065:0> 
扫描查看表数据
hbase(main):008:0> scan 'student'
左闭右开
hbase(main):009:0> scan 'student',{STARTROW => '1001', STOPROW  => '1002'}
hbase(main):010:0> scan 'student',{STARTROW => '1001'}


下面修改一下数据

put 'student','1002','info:name','zhangsan2'
查看一下修改的最新的数据
hbase(main):067:0> put 'student','1002','info:name','zhangsan2'
Took 0.0068 seconds 

hbase(main):068:0> scan 'student'
ROW                                         COLUMN+CELL
 1001                                       column=info:age, timestamp=2021-10-12T20:39:38.391, value=18 
 1001                                       column=info:name, timestamp=2021-10-12T20:33:17.966, value=zhangsan
 1001                                       column=info:sex, timestamp=2021-10-12T20:39:38.369, value=male
 1002                                       column=info:age, timestamp=2021-10-12T20:39:39.350, value=20
 1002                                       column=info:name, timestamp=2021-10-12T20:53:40.521, value=zhangsan2
 1002
 value=female
 2 row(s)
Took 0.0075 seconds

除了查看最新的数据,还查看历史的数据
hbase(main):072:0> help "scan"
在 help "scan" 有一个hbase> scan 't1', {RAW => true, VERSIONS => 10} 可以查看最新的10条数据。
操作实践
hbase(main):073:0> scan 'student', {RAW => true, VERSIONS => 10}
ROW                                         COLUMN+CELL
 1001                                       column=info:age, timestamp=2021-10-12T20:39:38.391, value=18
 1001                                       column=info:name, timestamp=2021-10-12T20:33:17.966, value=zhangsan
 1001                                       column=info:sex, timestamp=2021-10-12T20:39:38.369, value=male 
 1002                                       column=info:age, timestamp=2021-10-12T20:39:39.350, value=20
 1002                                       column=info:name, timestamp=2021-10-12T20:53:40.521, value=zhangsan2
 1002                                       column=info:name, timestamp=2021-10-12T20:39:38.413, value=zhangsan 
 1002                                       column=info:sex, timestamp=2021-10-12T20:39:38.443, value=female                                                             
2 row(s)
Took 0.0192 seconds                                                                                                                                                        
hbase(main):074:0> 

下面删除一下数据

删除某rowkey的全部数据:
hbase(main):016:0> deleteall 'student','1001'
删除某rowkey的某一列数据:
hbase(main):017:0> delete 'student','1002','info:sex'
hbase(main):074:0> delete 'student','1002','info:sex'
Took 0.0095 seconds

hbase(main):075:0> scan 'student', {RAW => true, VERSIONS => 10}
ROW                                         COLUMN+CELL
 1001                                       column=info:age, timestamp=2021-10-12T20:39:38.391, value=18
 1001                                       column=info:name, timestamp=2021-10-12T20:33:17.966, value=zhangsan
 1001                                       column=info:sex, timestamp=2021-10-12T20:39:38.369, value=male
 1002                                       column=info:age, timestamp=2021-10-12T20:39:39.350, value=20
 1002                                       column=info:name, timestamp=2021-10-12T20:53:40.521, value=zhangsan2
 1002                                       column=info:name, timestamp=2021-10-12T20:39:38.413, value=zhangsan
 1002                                       column=info:sex, timestamp=2021-10-12T20:39:38.443, type=Delete
 1002                                       column=info:sex, timestamp=2021-10-12T20:39:38.443, value=female
2 row(s)
Took 0.0115 seconds 

你会发现有一个type类型是Delete类型。

hbase(main):076:0> scan 'student'
ROW                                         COLUMN+CELL
 1001                                       column=info:age, timestamp=2021-10-12T20:39:38.391, value=18
 1001                                       column=info:name, timestamp=2021-10-12T20:33:17.966, value=zhangsan
 1001                                       column=info:sex, timestamp=2021-10-12T20:39:38.369, value=male
 1002                                       column=info:age, timestamp=2021-10-12T20:39:39.350, value=20
 1002                                       column=info:name, timestamp=2021-10-12T20:53:40.521, value=zhangsan2
2 row(s)
Took 0.0181 seconds

如果遇到不会的命令,直接使用help查看一下即可。会有案例提示。
hbase(main):080:0> help 'deleteall'

3.5 去Hadoop的页面中去看看hbase的数据

在这里插入图片描述

没有指定新的命名空间的情况下,创建的表在default目录下面。

default点击进去之后,可以看到你创建的student表

在这里插入图片描述

d1f29994fd3793d7e6606c16a6bd7f60其实就是Region的名字。和HBase的页面中显示的是一直的。刚开始就一个Region。

在这里插入图片描述

走HDFS页面点击Region的名字进去之后,可以发现info列簇
在这里插入图片描述

点击Info进去之后,发现空的,这是因为还没有达到刷写到磁盘的条件。这个时候所有的数据还RegionServer的内存中呢。

第四章 HBase的Java API操作

后面放到专门的仓库中



声明:
        文章中代码及相关语句为自己根据相应理解编写,文章中出现的相关图片为自己实践中的截图和相关技术对应的图片,若有相关异议,请联系删除。感谢。转载请注明出处,感谢。


By luoyepiaoxue2014

微博地址: http://weibo.com/luoyepiaoxue2014 点击打开链接

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

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

相关文章

SecXOps 核心技术能力划分

核心能力 为了加快安全分析能力更全面、更深入的自动化 &#xff0c;SecXOps 的目标在于创建一个集成的用于 Security 的 XOps 实践&#xff0c;提升安全分析的场景覆盖率和运营效率。SecXOps 技术并不 015 SecXOps 技术体系 是 Ops 技术在安全领域的简单加和&#xff0c;SecXO…

浏览器输入www.baidu.com的请求过程是怎么样的? 响应的过程是怎样的呢?

假设我们电脑的相关配置为&#xff1a; ip地址&#xff1a;192.168.31.37 子网掩码&#xff1a;255.255.255.0 网关地址&#xff1a;192.168.31.1 DNS地址&#xff1a;8.8.8.8 1. DNS 解析 我们打开一个浏览器&#xff0c;请求ww.baidu.com地址&#xff0c;这个时候找DNS 服务…

梅西进球了,用Python预测世界杯冠军是 ... 网友:痛,太痛了

今天凌晨&#xff0c;夺冠热门阿根廷终于赢球了&#xff0c;梅西也打进了自己本届世界杯的第一粒进球&#xff01;你熬夜看这场比赛了吗&#xff1f; 小编也用Python预测了一下本届世界杯的冠军归属&#xff0c;结果却不是阿根廷&#xff0c;来一起看看吧~ 预测结果 根据Pyt…

《QEMU/KVM源码分析与应用》读书笔记4 —— 第2章 QEMU基本组件(1)

2.1 QEMU事件循环机制 2.1.1 glibc事件循环机制 知识提炼&#xff1a; glib事件循环机制 QEMU程序的运行基于各类文件fd事件&#xff0c;QEMU在运行过程中会将自己感兴趣的文件fd添加到其监听列表上&#xff0c;并定义相应的处理函数。在QEMU主线程中&#xff0c;有一个循环…

JS--数组类型 Array 1

数组是一种特殊的对象&#xff0c;数组是按照顺序排列的一组值&#xff08;元素&#xff09;&#xff0c;每个位置都有一个编号&#xff0c;编号从0开始&#xff0c;编号也叫索引或者下标。数组可以存储任意数据类型。 一 、 创建数组方法 1.用[ ] <script>// 数字的…

【机器学习项目实战10例】(二):利用LightGBM实现天气变化的时间序列预测

🌠 『精品学习专栏导航帖』 🐳最适合入门的100个深度学习实战项目🐳🐙【PyTorch深度学习项目实战100例目录】项目详解 + 数据集 + 完整源码🐙🐶【机器学习入门项目10例目录】项目详解 + 数据集 + 完整源码🐶🦜【机器学习项目实战10例目录】项目详解 + 数据集 +

MyBatis-Plus快速开发

1. 代码生成器原理分析 观察我们之前写的代码&#xff0c;会发现其中也会有很多重复内容&#xff0c;比如&#xff1a; 那我们就想&#xff0c;如果我想做一个Order模块的开发&#xff0c;是不是只需要将内容全部更换成Order即可&#xff0c;如&#xff1a; 所以我们会发现&am…

【Ctool】json 转 mysql

▒ 目录 ▒&#x1f6eb; 导读需求开发环境1️⃣ 编写js实现json转mysql效果图代码及注释2️⃣ 集成到ctool中src/views/tool/json.vuesrc/views/tool/library/json/index.js效果图&#x1f4d6; 参考资料&#x1f6eb; 导读 需求 获取某json格式的数据后&#xff0c;希望将它…

【csdn】gitcode初体验(开发云、Pages等)(持续更新)

▒ 目录 ▒&#x1f6eb; 导读需求开发环境1️⃣ 开发云上免密提交代码【https方式】gitcode页面直接进入开发云2️⃣ 【git方式】通过开发云主页创建项目实现免密更新git1. 通过gitcode页面获取git地址2. 创建并配置SSH公钥&#xff08;所有项目&#xff0c;公用一个公钥&…

【学生网页设计作品 】关于HTML公益主题网页设计——谨防电信诈骗网

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

yocto meta-st-stm32mp conf文件夹分析

meta-st-stm32mp conf文件夹分析 machine conf分析 本节主要分析conf/machine下面的文件 stm32mp1.conf 包含inc文件 include conf/machine/include/st-machine-common-stm32mp.inc include conf/machine/include/st-machine-providers-stm32mp.incst-machine-providers-…

骨传导耳机的危害有哪些,骨传导耳机是不是智商税?

关于骨传导耳机的资讯&#xff0c;在网上众说纷纭&#xff0c;那么骨传导耳机在佩戴使用时到底会不会对我们造成伤害&#xff0c;骨传导耳机到底是不是智商税呢&#xff1f;下面就给大家讲解一下骨传导耳机传播声音的方式吧。 骨传导耳机传播声音的方式是通过耳旁的骨骼传声&am…

地级市高新技术企业统计情况(2000-2019)

1、数据来源&#xff1a;国泰君安 2、时间跨度&#xff1a;2000-2019 3、区域范围&#xff1a;全国 4、指标说明&#xff1a; ① 高新技术企业定义&#xff1a;高新技术企业是指通过科学技术或者科学发明在新领域中的发展&#xff0c;或者在原有领域中革新似的运作。在界定…

C语言实现扫雷游戏(分解代码,超级详细,无压力)

目录 一、扫雷游戏 1.1玩法 1.2游戏的基本功能 二、游戏的实现 2.1创建数组 2.1.1为什么设置两组行和列&#xff1f; 2.2初始化棋盘 ‘ 2.2.1函数的调用 2.2.2函数体的实现 2.3打印棋盘 2.3.1函数的调用 2.3.2函数体的实现 2.3.3运行结果 2.4设置雷的位置 2.4.1函数…

HTML+CSS+JS网页设计期末课程大作业 web前端开发技术 web课程设计 网页规划与设计

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

华为云桌面Workspace,实惠更实用!

今年双十一的活动&#xff0c;在各大平台都掀起一股“剁手热潮”。而对于企业主来说&#xff0c;双十一也有各种活动&#xff0c;比如华为云推出了“实惠更实用&#xff0c;‘11’都如愿”活动&#xff0c;也令到企业采购部门蠢蠢欲动。这究竟是怎么回事呢&#xff1f; 据了解&…

JAVA的学习心路历程之JDK基础入门(下)

这篇是本人JAVA基础学习的下篇&#xff0c;上篇链接在&#xff1a; JAVA的学习心路历程之JDK基础入门&#xff08;上&#xff09;_Thomas_Lbw的博客-CSDN博客_jdk学习 目录 一、字符流 1.1 字符流基类 二、文件操作 2.1 文件操作 三、Swing 四、多线程编程 4.1 多线程…

算法刷题打卡第27天:省份数量---深度优先搜索

省份数量 难度&#xff1a;中等 有 n 个城市&#xff0c;其中一些彼此相连&#xff0c;另一些没有相连。如果城市 a 与城市 b 直接相连&#xff0c;且城市 b 与城市 c 直接相连&#xff0c;那么城市 a 与城市 c 间接相连。 省份 是一组直接或间接相连的城市&#xff0c;组内不…

干测试这些年,去过阿里也去过小公司,给年轻测试员们一个忠告....

前言 你眼中的软件测试岗位是怎样的&#xff1f;大部分人可能会给出这样的回答&#xff1a;“测试&#xff1f;简单啊&#xff0c;没什么技术含量&#xff0c;无非就是看需求、看业务手册、看设计文档、然后点点功能是否实现&#xff0c;麻烦点的就是测试下部署安装是否出现兼…

二十三、CANdelaStudio深入-SnapshotData编辑

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CANdelaStudio的SnapshotData编辑,欢迎各位朋友订阅、评…