《HBase 不睡觉》第三章 - HBase 基本操做

《HBase 不睡觉书》是一本让人看了不会睡着的 HBase 技术书籍,写的很是不错,为了加深记忆,决定把书中重要的部分整理成读书笔记,便于后期查阅,同时但愿为初学 HBase 的同窗带来一些帮助。shell

目录

本文主要介绍 hbase shell 的使用。数据库

1、表操做(DDL)

一、启动 HBase Shell

通常的数据库都有命令行工具,HBase 也自带了一个用 JRuby(JRuby 是用 Java 写的 Ruby 解释器)写的 shell 命令行工具,执行如下命令来进入 HBase 的 shell:编程

# 通常集群安装好能够直接使用 hbase shell 启动
$ HBASE_HOME/bin/hbase shell
复制代码

启动 HBase Shell

二、新建表(create)

新建表须要注意的几点:bash

  • HBase 的表都是由列族(Column Family)组成的;
  • 没有列族的表是没有意义的;
  • 列并非依附于表上,而是依附于列族上。

HBase 表结构

可用经过下面的命令新建一个表:并发

# 新建一个表 'test',包含了一个列族 'cf'
# HBase 新建表时,至少须要一个列族
create 'test', 'cf'
复制代码

三、查看数据库表(list)

用list命令能够看到整个库中有哪些表:工具

hbase(main):010:0> list
TABLE                                                                           
test                                                                            
test1                                                                           
test3                                                                           
3 row(s)
Took 0.0048 seconds                                                             
=> ["test", "test1", "test3"]
复制代码

四、查看表属性(describe)

用 describe 命令查看表的元信息:post

hbase(main):018:0> describe "test"
Table test is ENABLED
test
COLUMN FAMILIES DESCRIPTION
{
    NAME => 'cf', 
    VERSIONS => '1', 
    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'
}
1 row(s)
Took 0.0504 seconds
复制代码

能够看到,默认是没有设置压缩和数据块编码。性能

五、删除表(drop)

在删除 HBase 表以前的时候,必须先执行停用(disable)命令,由于可能有不少客户端如今正好连着,并且也有可能 HBase 正在作合并或者分裂操做。若是你这时删除了表,会形成没法恢复的错误,HBase 也不会让你直接就删除表,而是须要先作一个 disable 操做,意思是把这个表停用掉,而且下线。ui

hbase(main):019:0> disable "test"
Took 0.8052 seconds                                                             
hbase(main):020:0> drop "test"
Took 0.4512 seconds                                                             
hbase(main):021:0> 
复制代码

在没有什么数据或者没有什么人使用的状况下 disable 命令执行得很快,但若是在系统已经上线了,而且负载很大的状况下 disable 命令会执行得很慢,由于 disable 要通知全部的 RegionServer 来下线这个表,而且有不少涉及该表的操做须要被停用掉,以保证该表真的已经彻底不参与任何工做了。编码

六、修改表(alter)

可使用 alter 命令对表进行修改,修改时无需禁用表,可是强烈建议在生产环境下执行这个命令以前,最好先停用(disable)这个表。由于对列族的全部操做都会同步到 全部拥有这个表的 RegionServer 上,当有不少客户端都在连着的时候,直接新增一个列族对性能的影响较大(还有可能出现意外的问题)。

# 修改多个属性
alter 't1', 'f1', {NAME => 'f2', IN_MEMORY => true}, {NAME => 'f3', VERSIONS => 5}
# 新增列族
alter 't1', 'cf2'
# 删除列族
alter 't1', NAME => 'f1', METHOD => 'delete'
复制代码

2、数据操做(DML)

一、插入(put)

HBase 中行的每个列都存储在不一样的位置,插入数据时必须指定要存储在哪一个单元格;而单元格须要根据表、行、列这几个维度来定位,所以插入数据的时候必须指定把数据插入到哪一个表的哪一个列族的哪一个行的哪一个列,例如:

hbase(main):024:0> put 'test1','row1','cf:name','jack'
Took 0.0838 seconds                                                             
hbase(main):025:0> scan 'test1'
ROW                   COLUMN+CELL                                               
 row1                 column=cf:name, timestamp=1543161899520, value=jack       
1 row(s)
Took 0.0301 seconds 
复制代码

向 test 表插入一个单元格,这个单元格的 rowkey 为 row1,该单元格的列族为 cf,该单元格的列名为 name,数据值为 jack。

插入成功后,使用 scan 命令查看表中数据,能够看到表中有一条记录,ROW 列显示的就是 rowkey,COLUMN+CELL 显示的就是这个记录的具体列族(column 里面冒号前面的 部分)、列(colum 里面冒号后面的部分)、时间戳(timestamp)、值(value)信息。

  • 时间戳:每个单元格均可以存储多个版本(version)的值,HBase 的单元格并无 version 这个属性,它用 timestamp 来存储该条记录的时间戳,这个时间戳就用来当版本号使用;这个 timestamp 虽说是时间的标定,其实你能够输入任意的数字,好比 一、二、3 均可以存储进去。
  • 列族和列的标识:HBase 并无专门的一个列族的栏来显示列族这个属性,它老是把列族和列用 “列族:列” 的组合方式来一块儿显示,不管是 put 存储仍是 scan 的查询使用的列定义,都是 列族:列” 的格式。

二、获取单条数据(get)

get 只能查询一个单元格的记录,在表的数据很大的时候,get 查询的速度远远高于 scan。

get 'test','row7',{COLUMN=>'cf:name',VERSIONS=>5}

COLUMN        CELL 
cf:name       timestamp=3, value=wangwu 
cf:name       timestamp=2, value=lisi 
cf:name       timestamp=1, value=zhangsan
复制代码

三、查询多条数据(scan)

Scan 是最经常使用的查询表数据的命令,这个命令至关于传统数据库的 select。在 HBase 中咱们用起始行(STARTROW)和结束行(ENDROW)来限制显示记录的条数。

STARTROW 和 ENDROW 都是可选的参数,能够不输入。若是 ENDROW 不输入的话,就从 STARTROW 开始一直显示下去直到表的结尾;若是 STARTROW 不输入的话,就从表头一直显示到 ENDROW 为止。

scan 'test',{STARTROW=>'row3'}
ROW         COLUMN+CELL 
row3        column=cf:name, timestamp=1471112677398, value=alex 
row4        column=cf:name, timestamp=1471112686290, value=jim

scan 'test',{ENDROW=>'row4'}
ROW         COLUMN+CELL 
row2        column=cf:name, timestamp=2222222222222, value=billy 
row3        column=cf:name, timestamp=1471112677398, value=alex
复制代码

四、删除单元格数据(delete)

删除表数据可使用 delete 命令:

# 删除某一单元格数据
delete 'test','row4','cf:name'

# 根据版本删除数据(删除这个版本以前的全部版本)
delete't1','r1','c1',ts
复制代码

HBase 删除记录并非真的删除了数据,而是放置了一个墓碑标记(tombstone marker),把这个版本连同以前的版本都标记为不可见了。这是为了性能着想,这样 HBase 就能够按期去清理这些已经被删除的记录,而不用每次都进行删除操做。

“按期” 的时间点是在 HBase 作自动合并(compaction,HBase整理存储文件时的一个操做,会把多个文件块合并成一个文件)的时候,这样删除操做对于 HBase 的性能影响被降到了最低,就算在很高的并发负载下大量删除记录也不怕了!

在记录被真正删除以前仍是能够查询到的,只须要在 scan 命令后跟上 RAW=>true 参数和适当的 VERSIONS 参数就能够看到被打上墓碑标记(tombstone marker)的记录,跟上 RAW 就是查询到表的全部未通过过滤的原始记录。

五、删除整行数据(deleteall)

若是一个行有不少列,用 delete 来删除记录会把人累死,能够 deleteall 命令来删除整行记录。

# 只须要明确到 rowkey 便可
deleteall 'test','row3'
复制代码

3、获取帮助

HBase 还有不少表相关的操做,这里不一一列出,在 shell 控制台能够输入 help 命令得到帮助信息;若是但愿查看某个命令的帮助信息,能够执行 help '指令'

hbase(main):026:0> help
HBase Shell, version 2.0.0-cdh6.0.1, rUnknown, Wed Sep 19 09:14:00 PDT 2018
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.
复制代码

Any Code,Code Any!

扫码关注『AnyCode』,编程路上,一块儿前行。

相关文章
相关标签/搜索