1.基本命令

  • 启动 HBase:./start-hbase.sh
  • 查看 HBase 是否启动:jps(注:docker 容器内没有该命令)
  • 进入 HBase 的客户端:./hbase shell

2.命名空间

1)创建命名空间

create_namespace '命名空间'

如何查看hbase某个分区是否正在分裂 查看hbase是否启动_hbase

2)查看命名空间

list_nameapce

如何查看hbase某个分区是否正在分裂 查看hbase是否启动_命名空间_02

注:HBase系统默认定义了两个默认的 namespace

  • hbase:系统内建表,包括 namespace 和 meta 表
  • default:用户建表时未指定 namespace 的表都创建在此

3)删除命名空间

drop_namespace ‘命名空间'

如何查看hbase某个分区是否正在分裂 查看hbase是否启动_数据_03

3.表相关

1)创建表(重点)

因为 HBase 是列族式数据库,所以在创建表实质上就是创建一个个列族(并设置列族属性),而不像 MySQL 设置的是具体列。

PS:列族与列的关系是,一个列族由多个列构成,列名都以列族名作为前缀。例如java:springjava:netty都属于java这个列族。

create '命名空间:表名',{NAME => ’列族名‘, '列族属性' =>  ''}

举个例子,创建一个有两个列族(baseInfo,otherInfo)的 user 表,并指定 VERSIONS、TTL、BLOOMFILTER 这几个比较重要的列族属性(注:所有列族属性都是有默认值的):

create_namespace 'test'
  	
create 'test:user', {NAME => 'b', VERSIONS => '3', TTL => '2147483647', 'BLOOMFILTER' => 'ROW'}, 
					{NAME => 'o', VERSIONS => '3', TTL => '2147483647', 'BLOOMFILTER' => 'ROW'}

# 意思是,在 test 命名空间下创建 user 表,表中有两个列族,分别是列 b 和 o,版本有3个,存活时间 2147483647(s),布隆过滤器过滤依据是 RowKey。

如何查看hbase某个分区是否正在分裂 查看hbase是否启动_hbase_04


另外,我们在 web 控制台也能看到表信息

如何查看hbase某个分区是否正在分裂 查看hbase是否启动_hbase_05

2)查看表结构(列族)

desc '命名空间:表名'

如何查看hbase某个分区是否正在分裂 查看hbase是否启动_数据_06


可以看到,有两个列族,另外那些没有设值的列族属性都被附上了默认值:

NAME => 'b', 						# 列族名
BLOOMFILTER => 'ROW', 			    # 布隆过滤器
VERSIONS => '3',  					# 版本数量
IN_MEMORY => 'false',  				# 激进缓存
KEEP_DELETED_CELLS => 'FALSE', 	    # 保留删除的单元格
DATA_BLOCK_ENCODING => 'NONE',  	# 数据块编码
TTL => 'FOREVER',  					# 存活时间
COMPRESSION => 'GZ',  				# 压缩
MIN_VERSIONS => '0',  				# 最小版本数
BLOCKCACHE => 'true', 				# 块缓存
BLOCKSIZE => '65536',  				# 数据块大小
REPLICATION_SCOPE => '0'  			# 复制范围

3)修改列族属性

alter '命名空间:表名', NAME => '列族名', 列族属性=> 'NewValue'

4)查看命名空间下的表

list_namespace_tables '命名空间'

如何查看hbase某个分区是否正在分裂 查看hbase是否启动_hbase_07

5)删除表

disable 'test:user' # 删除前要先禁用表
drop 'test:user' 	# 执行删除

如何查看hbase某个分区是否正在分裂 查看hbase是否启动_如何查看hbase某个分区是否正在分裂_08

4.数据操作(重点)

1)扫描数据(多行)

scan '命名空间:表名'

上面新建了 user 表,还没有添加过数据,所以,可想而知,查询结果为空:

如何查看hbase某个分区是否正在分裂 查看hbase是否启动_命名空间_09

2)添加数据

put ‘命名空间:表名’, 'RowKey', '列族:列', '具体值'

注:HBase 是列族式数据库,所以是在真正添加数据时才指定有哪些列


举个例子,我们向上面的 user 表的 b 列族(baseInfo)中创建一个 name 列,在 o 列族(otherInfo)中创建一个 phone 列,并赋上具体值:

put 'test:user','1', 'b:name', 'zhangsan'
put 'test:user','1', 'o:phone', '12345678919'

如何查看hbase某个分区是否正在分裂 查看hbase是否启动_hbase_10


再来查询一下,就可以看到刚才添加的数据了:

如何查看hbase某个分区是否正在分裂 查看hbase是否启动_数据_11


问题一:上面是相同 RowKey,那如果 RowKey 不同呢?

我们再来添加一条不是同一个 RowKey 的数据,看看会是什么样

put 'test:user','2', 'b:name', 'lisi'

如何查看hbase某个分区是否正在分裂 查看hbase是否启动_hbase_12

问题二:在建表时不是我们不是设置了 Version=3 吗,那这里是不是说我的 b:name 可以保存三个值?

是的。所以我们再来给 RowKey=1 的这一行的 b:name 再来添加两个数据

put 'test:user','1', 'b:name', 'wangwu'
put 'test:user','1', 'b:name', 'zhaoliu'

如何查看hbase某个分区是否正在分裂 查看hbase是否启动_hbase_13


为什么添加后我再 scan 看不到添加的数据呢?因为 scan 扫描多行,所以显示的是所有列的最新版本;要获取一个列列数据的所有版本要通过单列查询 get…

3)获取数据(单行)

get '命名空间:表名', 'RowKey' 						 # 获取指定行键的数据
get '命名空间:表名', 'RowKey', {COLUMN => '列族:列'}    # 获取指定行键的指定列的数据
get '命名空间:表名', 'RowKey', {COLUMN => '列族:列', VERSIONS => n}   # 获取指定行键的指定列的数据,显示n个版本

1.我们先来看获取 n 个版本的数据

get 'test:user', '1', {COLUMN => 'b:name', VERSIONS => 3} # 注:建表时设置的 3,即使你这写个 4,也只能返回三行数据

如何查看hbase某个分区是否正在分裂 查看hbase是否启动_如何查看hbase某个分区是否正在分裂_14


可以看到,果然是我们之前设置的张三、李四、王五,它们按照倒序的方式排列。

2.再来看获取指定行键的数据,查询 RowKey = 1 的数据:

get 'test:user', '1'

如何查看hbase某个分区是否正在分裂 查看hbase是否启动_命名空间_15


可以看到,如果直接获取的话,返回的是时间戳最小(新)的数据。

3.获取指定行键的指定列的数据,查询 RowKey = 1 的 b:name 的数据:

get 'test:user', '1', {COLUMN => 'b:name'}

如何查看hbase某个分区是否正在分裂 查看hbase是否启动_数据_16


同样是获取到最新的版本。

4)更新数据

更新其实就是追加(如果此时数据个数到达 Version 数了,那么前面最老的版本就会被淘汰)

put ‘命名空间:表名’, 'RowKey', '列族:列', 'NewValue'

比如我们要将上面 RowKey 为 1 的 b:name 修改为 Jack,那么 zhangsan 应该就没了

put 'test:user', '1', 'b:name', 'Jack'

如何查看hbase某个分区是否正在分裂 查看hbase是否启动_如何查看hbase某个分区是否正在分裂_17

5)删除数据

delete '命名空间:表名', 'RowKey', '列族:列', 时间戳(注:如果不指定时间戳,则默认删除最新版本)

比如我们去删除 user 表中 RowKey=1 的 b:name = zhaoliu:

delete 'test:user', '1', 'b:name', 1611678810121 # 注:如果不指定时间戳,删除的就是 Jack

如何查看hbase某个分区是否正在分裂 查看hbase是否启动_表名_18


可以看到,删除 zhaoliu 后,原来被更新后挤走的 zhangsan 的回来了。

重点:HBase 的删除只是打上了删除了标记(墓碑标记),跟更新一样,并不是真正移除,过早的版本会在执行 Major Compaction 时真正删除

6)清空表中数据

truncate` '命名空间:表名' # 三步:1.禁用 2.删除 3.重建

如何查看hbase某个分区是否正在分裂 查看hbase是否启动_hbase_19

注:HBase 的脚本是.hsh,跟.sql一个意思。