Hbase常用命令

tech2024-03-09  65

1、Hbase shell客户端使用

启动 start-hbase.sh ​ a、进入客户端 hbase shell

​ b、常用命令

​ list 列出Hbase中存在的所有表

​ alter 修改列簇(column family)模式

​ count 统计表中行的数量

​ create 创建表

​ describe 显示表相关的详细信息

​ delete 删除指定对象的值(可以为表,行、列对应的值,另外也可以指定时间戳的值)

​ deleteall 删除指定行的所有元素值

​ disable 使表无效

​ drop 删除表

​ enable 使表有效

​ exists 测试表是否存在

​ exit 退出Hbaseshell

​ get 获取行或单元(cell)的值

​ incr 增加指定表,行或列的值

​ put 向指向的表单元添加值

​ tools列出Hbase所支持的工具

​ scan 通过对表的扫描来获取对用的值

​ status 返回Hbase集群的状态信息

​ shutdown 关闭Hbase集群(与exit不同)

c、关于表: (创建表create、查看表列表list、查看表的详细信息desc、删除表drop、清空表truncate、修改表的定义alter、)

d、关于数据的操作(增put、删delete、查get + scan,改=变相的增加)

e、查看有哪些命令: help;如果哪个命令不会使用 help “command”

2、操作例子

创建表student和stu

create 'student','cf1' ​ create 'stu','cf1','cf2','cf3'

​ 查看表的描述: desc ‘student’

​ 一个大括号就相当于一个列簇: {NAME => ‘cf1’, VERSIONS => ‘1’, EVICT_BLOCKS_ON_CLOSE => ‘false’, NEW_VERSION_BEHAVIOR => ‘false’, KEEP_DELETED_CELLS => ‘FALSE’, CACH E_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’}

​ stu插入一条数据:

​ put 'stu','rk001','cf1:age','18'

​ put ‘stu’,‘rk001’,‘cf1:name’,‘zhangsan’ 发现hdfs中stucf1下没有内容去观察对应表的region在那一台服务器上杀掉regionserver之后就会有了…

​ scan ‘stu’

​ 解释:/hbase/data/default/stu/8ca25fe0d49972b2efb4c36537daf1a2/cf1/d89f620da4754e1092402b577f589f8a

​ data:目录即是Hbase自动生成的用来存储所有表数据的一个目录

​ default:默认的一个namespace

​ stu:就是一张表,其实就是一个文件夹

​ 8ca25fe0d49972b2efb4c36537daf1a2:就是stu这张表中的一个region

​ cf1:就是这个region中第一个列簇所对应的一个store

​ d89f620da4754e1092402b577f589f8a:这就是用来存储真实数据的hfile

​ b、创建表指定版本

​ create ‘stu2’,{NAME => ‘cf1’, VERSIONS => 5},{NAME => ‘cf2’, VERSIONS => 2} cf1下任何一个key-value最多版本5个

​ 放入数据:

put 'stu2','rk01','cf1:age',18 //表,行键,列族:列,值 ​ put 'stu2','rk01','cf1:age',19 ​ put 'stu2','rk01','cf1:age',20 ​ put 'stu2','rk01','cf1:age',21 put 'stu2','rk01','cf1:name','lisi'

​ get 'stu2','rk01' 出现:(默认的情况下是最新的值,get指定rowkey,scan )

​ COLUMN CELL ​ cf1:age timestamp=1552348396259, value=21 ​ cf1:name timestamp=1552348699286, value=lisi ​ 1 row(s) ​ Took 0.0201 seconds

put ‘stu2’,‘rk01’,‘cf1:age’,22

get ‘stu2’,‘rk01’,{COLUMN => ‘cf1:age’, VERSIONS => 5}

put ‘stu2’,‘rk01’,‘cf1:age’,23

get ‘stu2’,‘rk01’,{COLUMN => ‘cf1:age’, VERSIONS => 5} 18不出现了

get ‘stu2’,‘rk01’,{COLUMN => ‘cf1:age’, TIMESTAMP => 1552348396259} 根据时间戳获取唯一的一个

put ‘stu2’,‘rk01’,‘cf2:p’,‘xxxxxx’

get ‘stu2’,‘rk01’,‘cf2’

查询分页:

​ scan ‘stu2’,{COLUMNS => ‘cf1:age’}

​ scan ‘stu2’,{COLUMNS => ‘cf1:age’, LIMMIT 10, STARTROW => ‘xx’}

删除某个时间戳的: delete ‘stu2’,‘rk01’,‘cf1:age’,1552348396259;这个时间戳以前的数据都被删除了

put命令的使用:

​ put 表 行健 列定义 值

​ put ‘stu2’,‘rk01’,‘cf1:age’,22

​ get 表 行健

​ get 表 行健 列簇

​ get 表 行健 列簇:列

​ get 表 行健 列簇:列 时间戳

​ scan 表

​ scan 表 起始行健 结束行健

​ scan 表 列簇

​ scan 表 列簇:列

c、删除表

​ disable 'student' ​ drop 'student'

​ d、清空truncate ‘stu’ 删除数据key-value也删除

​ drop == 情况数据truncate + 删除表定义

​ e、Hbase的表一经创建之后,那么列簇的名字就不能更改了,列簇的属性可以改。

​ 如果说列簇的名字指定有误,可以通过先删除列簇,然后添加回来。

​ 但是你必须要承受,损失这个列簇数据的代价。

f、修改alter

​ 1、增加一个列簇

​ alter ‘stu2’,NAME=>‘f1’,VERSIONS=>4 增加一个列簇f1,每个region会多一个store

​ Updating all regions with the new schema… ​ 1/1 regions updated. ​ Done. ​ Took 2.8088 seconds

​ 2、删除一个列簇

​ alter ‘stu2’, NAME => ‘cf1’,METHOD => ‘delete’

​ alter ‘stu2’, ‘delete’ => ‘f1’

​ g、show_filters 查看所有过滤器

​ h、往HBase插入数据的五种方式

​ 1、table.put(put)

​ 2、table.put(puts)

​ 3、MR

​ 4、多线程多客户端并发写入

​ 5、bulkload 其实是使用MR程序提前生成好HFile

​ 1、首先往WAL LOG中记录日志数据

​ 2、把数据更新到内存

​ 3、内存达到一定的值,就会flush数据到磁盘HFile

​ 4、Hfile达到一定数据之后,就会进行合并,storefile

3、过滤器查询

​ 引言:过滤器主要分为两大类(比较过滤器、专用过滤器)

​ 过滤器的作用是在服务端判断数据是否满足条件,然后只将满足条件的数据返回给客户端;

​ 条件:各种过滤规则 + 比较规则;

​ 比较规则: == 、!=、<、>、>=、<=

​ hbase过滤器的比较运算符:

​ LESS <

​ LESS_OR_EQUAL <=

​ EQUAL =

​ NOT_EQUAL <>

​ GREATER_OR_EQUAL >=

​ GREATER >

​ NO_OP 排除所有

​ hbase过滤器的比较器(指定比较机制):

​ BinaryComparator按字节索引顺序比较指定字节数组,采用Bytes.compareTo(byte[]);

​ BinaryPrefixComparator跟前面相同,只是比较左端的数据是否相同;

​ NullComparator判断给定的是否为空;

​ BitComparator按位比较;

​ RegexStringComparator 提供一个正则的比较器,仅支持EQUAL和非EQUAL;

​ SubstringComparator判断提供的子串是否出现在value中;

1、比较过滤器

​ a、行健过滤器RowFilter

​ Filter filter = new RowFilter (CompareOp.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes(“user000”)));

​ b、列簇过滤器FamilyFilter

​ Filter filter = new FamilyFilter(CompareOp.LESS, new BinaryComparator(Bytes.toBytes(“列簇name->cf1”)));

​ c、 列过滤器QualifierFilter

​ Filter filter = new QualifierFilter(CompareOp.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes(“name”)));

​ d、 值过滤器ValueFilter

​ Filter filter = new ValueFilter(CompareOp.EQUAL, new SubstringComparator(“zhangsan”);

最新回复(0)