HBase架构与基础命令

news/2024/11/17 19:08:42/文章来源:https://www.cnblogs.com/bjynjj/p/18550913

HBase架构与基础命令

一、了解HBase

官方文档:https://hbase.apache.org/

image-20220608204643002

1.1 HBase概述

HBase 是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,用于存储海量的结构化或者半结构化,非结构化的数据(底层是字节数组做存储的)

HBase是Hadoop的生态系统之一,是建立在Hadoop文件系统(HDFS)之上的分布式、面向列的数据库,通过利用Hadoop的文件系统提供容错能力。如果需要进行实时读写或者随机访问大规模的数据集的时候,会考虑使用HBase。

HBase作为Google Bigtable的开源实现,Google Bigtable利用GFS作为其文件存储系统类似,则HBase利用Hadoop HDFS作为其文件存储系统;Google通过运行MapReduce来处理Bigtable中的海量数据,同样,HBase利用Hadoop MapReduce来处理HBase中的海量数据;Google Bigtable利用Chubby作为协同服务,HBase利用Zookeeper作为元数据的元数据存储和容灾。在2010年5月,成为apache顶级项目

image-20220608204054001

1.2 HBase处理数据

虽然Hadoop是一个高容错、高延时的分布式文件系统和高并发的批处理系统,但是它不适用于提供实时计算;

HBase是可以提供实时计算的分布式数据库,数据被保存在HDFS分布式文件系统上,由HDFS保证期高容错性;

但是再生产环境中,HBase是如何基于hadoop提供实时性呢?

​ HBase上的数据是以StoreFile(HFile)二进制流的形式存储在HDFS上block块儿中;

​ 但是HDFS并不知道的HBase用于存储什么,它只把存储文件认为是二进制文件,也就是说,HBase的存储数据对于HDFS文件系统是透明的。

1.3 HBase与HDFS

在下面的表格中,我们对HDFS与HBase进行比较:

HDFS HBase
HDFS适于存储大容量文件的分布式文件系统。 HBase是建立在HDFS之上的数据库。
HDFS不支持快速单独记录查找。 HBase提供在较大的表快速查找
HDFS提供了高延迟批量处理;没有批处理概念。 HBase提供了数十亿条记录低延迟访问单个行记录(随机存取)。
HDFS提供的数据只能顺序访问。 HBase内部使用哈希表和提供随机接入,并且其存储索引,可将在HDFS文件中的数据进行快速查找。

Hbase--->HashMap

二、HBase相关概念

2.1 分布式数据库

1、画图理解分布式是什么样子(region)

2.2 列式存储

2、画图理解列式存储 拿与mysql(必须项:表+列)中的表做对比(必须项:表+列簇)

2.3 稀疏性

3、画图理解稀疏(rowkey)

HBase中需要根据行键、列族、列限定符和时间戳来确定一个单元格,因此,可以视为一个“四维坐标”,即[行键, 列族, 列限定符, 时间戳]

2.4 数据模型

HBase通过表格的模式存储数据,每个表格由列和行组成,其中,每个列又被划分为若干个列族(colnum family),请参考下面的图:

image-20220608214455582

# 三维有序:
1) 一个hbase表中,行键之间按照字典顺序排序
2)一行中每一个列名之间按照字典顺序排序
3)同一个列多个版本号数据,版本之间按照字典顺序排序

表:HBase的数据同样是用表来组织的,表由行和列组成,列分为若干个列族,行和列的坐标交叉决定了一个单元格。

行:每个表由若干行组成,每个行有一个行键作为这一行的唯一标识。访问表中的行只有三种方式:通过单个行键进行查询、通过一个行键的区间来访问、全表扫描。

列簇:一个HBase表被分组成许多“列族”的集合,它是基本的访问控制单元。

列修饰符(列限定符):列族里的数据通过列限定符(或列)来定位

单元格:在HBase表中,通过行、列族和列限定符确定一个“单元格”(cell),单元格中存储的数据没有数据类型,总被视为字节数组byte[]

时间戳:每个单元格都保存着同一份数据的多个版本,这些版本采用时间戳进行索引

2.4.1 Hbase数据模型

HBase将数据存放在带有标签的中,表由行和列组成,行和列交叉确定一个单元格,单元格有版本号,版本号自动分配,为数据插入该单元格时的时间戳。单元格的内容没有数据类型,所有数据都被视为未解释的字节数组

表格中每一行有一个行键(也是字节数组,任何形式的数据都可以表示成字符串,比如数据结构进行序列化之后),整个表根据行键的字节序来排序,所有对表的访问必须通过行键。

表中的列又划分为多个列族(column family),同一个列族的所有成员具有相同的前缀,具体的列由列修饰符标识,因此,列族和列修饰符合起来才可以表示某一列,比如:info:format、cotents:image

image-20220608215452989

在创建一个表的时候,列族必须作为模式定义的一部分预先给出,而列族是支持动态扩展的,也就是列族成员可以随后按需加入。物理上,所有的列族成员一起存放在文件系统上,所以实际上说HBase是面向列的数据库,更准确的应该是面向列族,调优和存储都是在列族这个层次上进行的。一般情况下,同一个列族的成员最后具有相同的访问模式和大小特征。

总结起来,HBase表和我们熟知的RDBMS的表很像,不同之处在于:行按行键排序,列划分为列族,单元格有版本号,没有数据类型。

2.4.2 Hbase数据坐标

HBase中需要根据行键、列族、列限定符和时间戳来确定一个单元格(cell),cell中的数据是没有类型的,全部是字节码形式存贮。,因此,可以视为一个“四维坐标”,即[行键, 列族, 列限定符, 时间戳]

image-20220608215545217

对于上图这样一个HBase表,其数据坐标举例如下:

[“201505003”, “Info”, “email”, 1174184619081] “xie@qq.com”
[“201505003”, “Info”, “email”, 1174184620720] “you@163.com”

2.4.3 HBase区域

HBase自动把表水平划分为区域(Region),每个区域都是有若干连续行构成的,一个区域由所属的表、起始行、终止行(不包括这行)三个要素来表示。

一开始,一个表只有一个区域,但是随着数据的增加,区域逐渐变大,等到它超出设定的阈值(128M)大小,就会在某行的边界上进行拆分,分成两个大小基本相同的区域。然后随着数据的再增加,区域就不断的增加,如果超出了单台服务器的容量,就可以把一些区域放到其他节点上去,构成一个集群。也就是说:集群中的每个节点(Region Server)管理整个表的若干个区域。所以,我们说:区域是HBase集群上分布数据的最小单位

image-20220608215649244

三、HBase系统架构

3.1 架构图

image-20220608221621833

3.2 组件介绍

HBase由三种类型的服务器以主从模式构成:

  • Region Server:负责数据的读写服务,用户通过与Region server交互来实现对数据的访问。
  • HBase HMaster:负责Region的分配及数据库的创建和删除等操作。
  • ZooKeeper:负责维护集群的状态(某台服务器是否在线,服务器之间数据的同步操作及master的选举等)。

HDFS的DataNode负责存储所有Region Server所管理的数据,即HBase中的所有数据都是以HDFS文件的形式存储的。出于使Region server所管理的数据更加本地化的考虑,Region server是根据DataNode分布的。HBase的数据在写入的时候都存储在本地。但当某一个region被移除或被重新分配的时候,就可能产生数据不在本地的情况。这种情况只有在所谓的compaction之后才能解决。

Client

包含访问HBase的接口并维护cache来加快对HBase的访问

Zookeeper

保证任何时候,集群中只有一个master

存贮所有Region的寻址入口。

实时监控Region server的上线和下线信息。并实时通知Master

存储HBase的schema和table元数据的meta信息

Master

为Region server分配region

负责Region server的负载均衡

发现失效的Region server并重新分配其上的region

管理用户对table的增删改操作

RegionServer

Region server维护region,处理对这些region的IO请求

Region server负责切分在运行过程中变得过大的region 

HLog(WAL log):

HLog文件就是一个普通的Hadoop Sequence File,Sequence File 的Key是 HLogKey对象,HLogKey中记录了写入数据的归属信息,除了table和 region名字外,同时还包括sequence number和timestamp,timestamp是” 写入时间”,sequence number的起始值为0,或者是最近一次存入文件系 统sequence number。

HLog SequeceFile的Value是HBase的KeyValue对象,即对应HFile中的 KeyValue

Region

HBase自动把表水平划分成多个区域(region),每个region会保存一个表里面某段连续的数据;每个表一开始只有一个region,随着数据不断插 入表,region不断增大,当增大到一个阀值的时候,region就会等分会两个新的region(裂变);

当table中的行不断增多,就会有越来越多的region。这样一张完整的表被保存在多个Regionserver上。

Memstore 与 storefile

  1. 一个region由多个store组成,一个store对应一个CF(列簇)

  2. store包括位于内存中的memstore和位于磁盘的storefile写操作先写入 memstore,当memstore中的数据达到某个阈值,hregionserver会启动 flashcache进程写入storefile,每次写入形成单独的一个storefile

  3. 当storefile文件的数量增长到一定阈值后,系统会进行合并(minor、 major compaction),在合并过程中会进行版本合并和删除工作 (majar),形成更大的storefile。

  4. 当一个region所有storefile的大小和超过一定阈值后,会把当前的region 分割为两个,并由hmaster分配到相应的regionserver服务器,实现负载均衡。

  5. 客户端检索数据,先在memstore找,找不到再找storefile

  6. HRegion是HBase中分布式存储和负载均衡的最小单元。最小单元就表 示不同的HRegion可以分布在不同的HRegion server上。

  7. HRegion由一个或者多个Store组成,每个store保存一个columns family。

  8. 每个Strore又由一个memStore和0至多个StoreFile组成。

如图:StoreFile 以HFile格式保存在HDFS上。

image-20220608221644247

image-20220608221654847

3.3 理解难点

  1、flush刷新在HDFS上呈现究竟是怎么刷新的呢??我们目前刚刚学习的时候,添加数据,都是一条一条的put进去,而我们在put的数据比较少(小于128M)的时候,我们put完去HDFS上并未查看到我们put的文件,这是因为数据还在内存中,也就是还在memStore中,所以要想在HDFS中查看到,我们必须手动刷新到磁盘中,这是将memStore的数据刷新到StoreFile中去,这样我们在HDFS中就可以查看到了。  2、为什么Hbase不可以使用像Mysql那样进行查询??首先,我们应该可以感受到,我们在插入的时候,每行数据,有多少列,列名叫什么完全是我们自己定义的,之所以不支持像MySql那样对列进行查询和操作,因为不确定列的个数和名称。3、数据最后存在HDFS上的,HDFS不支持删改,为什么Hbase就可以呢??这里有个思想误区,的确,数据是以HFile形式存在HDFS上的,而且HDFS的确是不支持删改的,但是为什么Hbase就支持呢?首先,这里的删除并不是真正意义上的对数据进行删除,而是对数据进行打上标记,我们再去查的时,就不会查到这个打过标记的数据,这个数据Hmaster会每隔1小时清理。修改是put两次,Hbase会取最新的数据,过期数据也是这个方式被清理。

四、HBase 2.2.7安装搭建(详细可见另一篇搭建文档)

4.1 hbase下载

官网下载地址:https://www.apache.org/dyn/closer.lua/hbase/1.4.6/hbase-1.4.6-bin.tar.gz

image-20220907193935229

4.2 前期准备(Hadoop,zookeeper,jdk)

启动hadoop

start-all.sh

验证

http://master:50070

启动zookeeper(三台分别启动)

zkServer.sh start

检查状态

zkServer.sh status

4.3 搭建Hbase

1、上传解压

tar -zxvf hbase-1.4.6-bin.tar.gz

2、配置环境变量

export HBASE_HOME=/usr/local/soft/hbase-1.4.6$HBASE_HOME/bin

source /etc/profile

3、修改hbase-env.sh文件

增加java配置

export JAVA_HOME=/usr/local/soft/jdk1.8.0_171

关闭默认zk配置(原本是注释的,放开修改false)

export HBASE_MANAGES_ZK=false

4、修改hbase-site.xml文件

# 增加以下配置
<!--指定 zookeeper 服务器 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>master,node1,node2</value>
</property><!--指定 hbase 根路径 -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://master:9000/hbase</value>
</property><!--将 hbase 设置为分布式部署。有 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property><!-- 避免出现启动错误。 有-->
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property> 

5、修改regionservers文件

如果是伪分布式版本,增加master即可

node1
node2

6、同步到所有节点(如果是伪分布式不需要同步)

scp -r hbase-1.4.6 node1:`pwd`
scp -r hbase-1.4.6 node2:`pwd`

7、启动hbase集群 , 在master上执行

start-hbase.sh

image-20220608224430921

8、验证hbase

http://master:16010

image-20220608224544266

hbase日志文件所在的目录: /usr/local/soft/hbase-1.7.1/logs

9、关闭集群的命令

stop-hbase.sh

4.4 启动顺序

启动顺序
Hadoop及hbase集群启动顺序 zookeepeer -> hadoop -> hbase停止顺序
Hadoop及hbase集群关闭顺序 hbase -> hadoop -> zookeepeer

4.5 重置hbase

1、关闭hbase集群
   1)杀死进程2)stop-hbase.sh
2、删除数据 hdfs
hdfs dfs -rmr /hbase
3、删除元数据 zk
   zkCli.shrmr /hbase
4、重新启动hbase
   start-hbase.sh
时间同步
yum install ntp -yntpdate -u time.windows.com

五、hbase shell

命名 描述 语法
help ‘命名名’ 查看命令的使用描述 help ‘命令名’
whoami 我是谁 whoami
version 返回hbase版本信息 version
status 返回hbase集群的状态信息 status
table_help 查看如何操作表 table_help
create 创建表 create ‘表名’, ‘列族名1’, ‘列族名2’, ‘列族名N’
alter 修改列族 添加一个列族:alter ‘表名’, ‘列族名’
删除列族:alter ‘表名’,
describe 显示表相关的详细信息 describe ‘表名’
list 列出hbase中存在的所有表 list
exists 测试表是否存在 exists ‘表名’
put 添加或修改的表的值 put ‘表名’, ‘行键’, ‘列族名’, ‘列值’
put ‘表名’, ‘行键’, ‘列族名:列名’, ‘列值’
scan 通过对表的扫描来获取对用的值 scan ‘表名’
扫描某个列族: scan ‘表名’, {COLUMN=>‘列族名’}
扫描某个列族的某个列: scan ‘表名’, {COLUMN=>‘列族名:列名’}
查询同一个列族的多个列: scan ‘表名’,
get 获取行或单元(cell)的值 get ‘表名’, ‘行键’
get ‘表名’, ‘行键’, ‘列族名’
count 统计表中行的数量 count ‘表名’
incr 增加指定表行或列的值 incr ‘表名’, ‘行键’, ‘列族:列名’, 步长值
get_counter 获取计数器 get_counter ‘表名’, ‘行键’, ‘列族:列名’
delete 删除指定对象的值(可以为表,行,列对应的值,另外也可以指定时间戳的值) 删除列族的某个列: delete ‘表名’, ‘行键’, ‘列族名:列名’
deleteall 删除指定行的所有元素值 deleteall ‘表名’, ‘行键’
truncate 重新创建指定表 truncate ‘表名’
enable 使表有效 enable ‘表名’
is_enabled 是否启用 is_enabled ‘表名’
disable 使表无效 disable ‘表名’
is_disabled 是否无效 is_disabled ‘表名’
drop 删除表 drop的表必须是disable的
disable ‘表名’
drop ‘表名’
shutdown 关闭hbase集群(与exit不同)
tools 列出hbase所支持的工具
exit 退出hbase shell

HBase Shell 是官方提供的一组命令,用于操作HBase。如果配置了HBase的环境变量了,就可以知己在命令行中输入hbase shell 命令进入命令行。

hbase shell

image-20220608225844374

在hbase中如果输入错误,按住ctrl+退格 才能删除(新版本不用)

5.1 help命令

可以通过 help '命名名称'来查看命令行的具体使用,包括命令的作用和用法。
通过help ‘hbase’ 命名来查看hbase shell 支持的所有命令,hbase将命令进行分组,其中ddl、dml使用较多。

image-20220608230009607

help 'list'

image-20220608230050274

5.2 general 类

5.2.1 显示集群状态status

image-20220608230310182

5.2.2 查询数据库版本version

image-20220608230440754

5.2.3 显示当前用户与组 whoami

image-20220608230519490

5.2.4 查看操作表的命令table_help

image-20220608230553346

5.2.5 退出HBase Shell exit

image-20220608230623889

5.3 DDL相关

5.3.1. 创建表create

注意:创建表时只需要指定列族名称,不需要指定列名。

# 语法
create '表名', {NAME => '列族名1'}, {NAME => '列族名2'}, {NAME => '列族名3'}
# 此种方式是上上面的简写方式,使用上面方式可以为列族指定更多的属性,如VERSIONS、TTL、BLOCKCACHE、CONFIGURATION等属性
create '表名', '列族名1', '列族名2', '列族名3'create '表名', {NAME => '列族名1', VERSIONS => 版本号, TTL => 过期时间, BLOCKCACHE => true}# 示例
create 'tbl_user', 'info', 'detail'
create 't1', {NAME => 'f1', VERSIONS => 1, TTL => 2592000, BLOCKCACHE => true},{NAME => 'f2',..}

image-20220608230826425

5.3.2 修改(添加、删除)表结构Schema alter

5.3.2.1 添加一个列簇
# 语法 
alter '表名', '列族名'# 示例
alter 'tbl_user', 'address'

image-20220608230938763

5.3.2.2 删除一个列簇
# 语法 
alter '表名', {NAME=> '列族名', METHOD=> 'delete'}alter 't1',{NAME => 'cf2', METHOD => 'delete'}
# 示例
alter 'tbl_user', {NAME=> 'address', METHOD=> 'delete'}

image-20220608231027899

5.3.2.3 修改列族的属性

可以修改列族的VERSIONS、IN_MEMORY

# 修改f1列族的版本为5
alter 't1', NAME => 'f1', VERSIONS => 5# 修改多个列族,修改f2为内存,版本号为5
alter 't1', 'f1', {NAME => 'f2', IN_MEMORY => true}, {NAME => 'f3', VERSIONS => 5}# 也可以修改table-scope属性,例如MAX_FILESIZE, READONLY,MEMSTORE_FLUSHSIZE, DEFERRED_LOG_FLUSH等。
# 例如,修改region的最大大小为128MB:
alter 't1', MAX_FILESIZE => '134217728'

5.3.3 获取表的描述describe

# 语法 
describe '表名'# 示例
describe 'tbl_user'

image-20220608231308673

5.3.4 列举所有表list

image-20220608231334575

5.3.5 表是否存在exists

# 语法 
exists '表名'# 示例
exists 'tbl_user'

image-20220608231431898

5.3.6 启用表enable和禁用表disable

通过enable和disable来启用/禁用这个表,相应的可以通过is_enabled和is_disabled来检查表是否被禁用。

# 语法
enable '表名'
is_enabled '表名'disable '表名'
is_disabled '表名'# 示例
disable 'tbl_user'
is_disabled 'tbl_user'enable 'tbl_user'
is_enabled 'tbl_user'

5.3.7 禁用满足正则表达式的所有表disable_all

  • .匹配除“\n”和"\r"之外的任何单个字符
  • *匹配前面的子表达式任意次
# 匹配以t开头的表名
disable_all 't.*'
# 匹配指定命名空间ns下的以t开头的所有表
disable_all 'ns:t.*'
# 匹配ns命名空间下的所有表
disable_all 'ns:.*'

5.3.8 启用满足正则表达式的所有表enable_all

enable_all 't.*'
enable_all 'ns:t.*'
enable_all 'ns:.*'

5.3.9 删除表drop

需要先禁用表,然后再删除表,启用的表是不允许删除的

# 语法
disable '表名'
drop '表名'# 示例
disable 'tbl_user'
drop 'tbl_user'

直接删除报错:

image-20220608231641417

先禁用后删除

image-20220608231726087

5.3.10 删除满足正则表达式的所有表drop_all

drop_all 't.*'
drop_all 'ns:t.*'
drop_all 'ns:.*'

5.3.11 获取某个表赋值给一个变量 get_table

通过 var = get_table ‘表名’ 赋值给一个变量对象,然后对象.来调用,就像面向对象编程一样,通过对象.方法来调用,这种方式在操作某个表时就不必每次列举表名了。

image-20220608232059349

5.3.12 获取rowKey所在的区 locate_region

locate_region '表名', '行键'

5.3.13 显示hbase所支持的所有过滤器show_filters

过滤器用于get和scan命令中作为筛选数据的条件,类型关系型数据库中的where的作用

image-20220608232227422

5.4 namespace

hbase中没有数据库的概念 , 可以使用namespace来达到数据库分类别管理表的作用

5.4.1 列举命名空间 list_namespace

image-20220608232407636

5.4.2 获取命名空间描述 describe_namespace

describe_namespace 'default'

image-20220608232448689

5.4.3 查看命名空间下的所有表 list_namespace_tables

list_namespace_tables 'default'list_namespace_tables 'hbase'

image-20220608232555107

5.4.4 创建命名空间create_namespace

create_namespace 'bigdata17'

5.4.5 删除命名空间drop_namespace

drop_namespace '命名空间名称'

5.5 DML

5.5.1 插入或者修改数据put

image-20220608232846139

# 语法
# 当列族中只有一个列时'列族名:列名'使用'列族名'
put '表名', '行键', '列族名', '列值'
put '表名', '行键', '列族名:列名', '列值'# 示例# 创建表
create 'users', 'info', 'detail', 'address'# 第一行数据
put 'users', 'mengday', 'info:id', '1'
put 'users', 'mengday', 'info:name', '张三'
put 'users', 'mengday', 'info:age', '28'
put 'users', 'mengday', 'detail:birthday', '1990-06-26'
put 'users', 'mengday', 'detail:email', 'abc@163.com'
put 'users', 'mengday', 'detail:create_time', '2019-03-04 14:26:10'
put 'users', 'mengday', 'address', '上海市'# 第二行数据
put 'users', 'vbridbest', 'info:id', '2'
put 'users', 'vbridbest', 'info:name', '李四'
put 'users', 'vbridbest', 'info:age', '27'
put 'users', 'vbridbest', 'detail:birthday', '1990-06-27'
put 'users', 'vbridbest', 'detail:email', 'xxx@gmail.com'
put 'users', 'vbridbest', 'detail:create_time', '2019-03-05 14:26:10'
put 'users', 'vbridbest', 'address', '北京市'# 第三行数据
put 'users', 'xiaoming', 'info:id', '3'
put 'users', 'xiaoming', 'info:name', '王五'
put 'users', 'xiaoming', 'info:age', '26'
put 'users', 'xiaoming', 'detail:birthday', '1990-06-28'
put 'users', 'xiaoming', 'detail:email', 'xyz@qq.com'
put 'users', 'xiaoming', 'detail:create_time', '2019-03-06 14:26:10'
put 'users', 'xiaoming', 'address', '杭州市'put 'users', 'apple', 'info:id', '4'
put 'users', 'apple', 'info:name', '李刚'
put 'users', 'apple', 'info:age', '26'
put 'users', 'apple', 'detail:birthday', '1991-06-28'
put 'users', 'apple', 'detail:email', 'lg@qq.com'
put 'users', 'apple', 'detail:create_time', '2024-03-06 14:26:10'
put 'users', 'apple', 'address', '合肥市'

5.5.2 全表扫描scan

# 语法
scan '表名'# 示例
scan 'users'   // 效果类似于sql语句中select * from users

image-20220608233212478

扫描整个列簇

# 语法
scan '表名', {COLUMN=>'列族名'}# 示例
scan 'users', {COLUMN=>'info'}

扫描整个列簇的某个列

# 语法
scan '表名', {COLUMN=>'列族名:列名'}# 示例
scan 'users', {COLUMN=>'info:age'}

5.5.3 获取数据get

# 语法
get '表名', '行键'# 示例
get 'users', 'xiaoming'

根据某一行某列族的数据

# 语法
get '表名', '行键', '列族名'# 示例
get 'users', 'xiaoming', 'info'
# 创建表,c1版本为4, 元数据mykey=myvalue
hbase(main):009:0> create 'test1', {NAME => 'cf1', VERSIONS => 4}
0 row(s) in 2.2810 seconds=> Hbase::Table - t1
# 添加列族c2, c3
hbase(main):010:0> alter 't1', 'c2', 'c3'
Updating all regions with the new schema...
1/1 regions updated.
Done.
Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 3.8320 seconds# 出入数据,c1 插入4个版本的值
hbase(main):011:0> put 't1', 'r1', 'c1', 'v1'
0 row(s) in 0.1000 secondshbase(main):012:0> put 't1', 'r1', 'c1', 'v11'
0 row(s) in 0.0180 secondshbase(main):013:0> put 't1', 'r1', 'c1', 'v111'
0 row(s) in 0.0140 secondshbase(main):014:0> put 't1', 'r1', 'c1', 'v1111'
0 row(s) in 0.0140 seconds# 插入c2、c3的值
hbase(main):015:0> put 't1', 'r1', 'c2', 'v2'
0 row(s) in 0.0140 secondshbase(main):016:0> put 't1', 'r1', 'c3', 'v3'
0 row(s) in 0.0210 seconds# 获取rowKey=r1的一行记录
hbase(main):017:0> get 't1', 'r1'
COLUMN                                              CELLc1:                                                timestamp=1552819382575, value=v1111c2:                                                timestamp=1552819392398, value=v2c3:                                                timestamp=1552819398244, value=v3
3 row(s) in 0.0550 seconds# 获取rowKey=r1并且 1552819392398 <= 时间戳范围 < 1552819398244
hbase(main):018:0> get 't1', 'r1', {TIMERANGE => [1552819392398, 1552819398244]}
COLUMN                                              CELLc2:                                                timestamp=1552819392398, value=v2
1 row(s) in 0.0090 seconds# 获取指定列的值
hbase(main):019:0> get 't1', 'r1', {COLUMN => 'c1'}
COLUMN                                              CELLc1:                                                timestamp=1552819382575, value=v1111
1 row(s) in 0.0160 seconds# 获取指定列的值,多个值使用数组表示
hbase(main):020:0> get 't1', 'r1', {COLUMN => ['c1', 'c2', 'c3']}
COLUMN                                              CELLc1:                                                timestamp=1552819382575, value=v1111c2:                                                timestamp=1552819392398, value=v2c3:                                                timestamp=1552819398244, value=v3
3 row(s) in 0.0170 seconds# 获取c1的值,获取4个版本的值,默认是按照时间戳降续排序的
hbase(main):021:0> get 't1', 'r1', {COLUMN => 'c1', VERSIONS => 4}
COLUMN                                              CELLc1:                                                timestamp=1552819382575, value=v1111c1:                                                timestamp=1552819376343, value=v111c1:                                                timestamp=1552819368993, value=v11c1:                                                timestamp=1552819362975, value=v1
4 row(s) in 0.0180 seconds# 获取c1的3个版本值
hbase(main):027:0* get 't1', 'r1', {COLUMN => 'c1', VERSIONS => 3}
COLUMN                                               CELLc1:                                                 timestamp=1552819382575, value=v1111c1:                                                 timestamp=1552819376343, value=v111c1:                                                 timestamp=1552819368993, value=v11
3 row(s) in 0.0090 seconds# 获取指定时间戳版本的列
hbase(main):022:0> get 't1', 'r1', {COLUMN => 'c1', TIMESTAMP => 1552819376343}
COLUMN                                              CELLc1:                                                timestamp=1552819376343, value=v111
1 row(s) in 0.0170 secondshbase(main):023:0> get 't1', 'r1', {COLUMN => 'c1', TIMESTAMP => 1552819376343, VERSIONS => 4}
COLUMN                                              CELLc1:                                                timestamp=1552819376343, value=v111
1 row(s) in 0.0130 seconds# 获取rowKey=r1中的值等于v2的所有列
hbase(main):024:0> get 't1', 'r1', {FILTER => "ValueFilter(=, 'binary:v2')"}
COLUMN                                              CELLc2:                                                timestamp=1552819392398, value=v2
1 row(s) in 0.0510 secondshbase(main):025:0> get 't1', 'r1', {COLUMN => 'c1', ATTRIBUTES => {'mykey'=>'myvalue'}}
COLUMN                                              CELLc1:                                                timestamp=1552819382575, value=v1111
1 row(s) in 0.0100 seconds

5.5.4 删除某个列族中的某个列delete

# 语法
delete '表名', '行键', '列族名:列名'delete 'users','xiaoming','info:age'create 'tbl_test', 'columnFamily1'put 'tbl_test', 'rowKey1', 'columnFamily1:column1', 'value1'
put 'tbl_test', 'rowKey1', 'columnFamily1:column2', 'value2'delete 'tbl_test', 'rowKey1', 'columnFamily1:column1'

5.5.5 删除某行数据deleteall

# 语法
deleteall '表名', '行键'# 示例
deleteall 'users', 'xiaoming'

5.5.6 清空整个表的数据truncate

先disable表,然后再drop表,最后重新create表

truncate '表名'

image-20220608233602414

5.5.7 自增incr

# 语法
incr '表名', '行键', '列族:列名', 步长值# 示例 
# 注意:incr 可以对不存的行键操作,如果行键已经存在会报错,如果使用put修改了incr的值再使用incr也会报错
# ERROR: org.apache.hadoop.hbase.DoNotRetryIOException: Field is not a long, it's 2 bytes wide
incr 'tbl_user', 'xiaohong', 'info:age', 1

image-20220608233701046

5.5.8 计数器get_counter

# 点击量:日、周、月
create 'counters', 'daily', 'weekly', 'monthly'
incr 'counters', '20240415', 'daily:hits', 1
incr 'counters', '20110101', 'daily:hits', 1
get_counter 'counters', '20110101', 'daily:hits'

5.5.9 修饰词

1、修饰词
# 语法
scan '表名', {COLUMNS => [ '列族名1:列名1', '列族名1:列名2', ...]}# 示例
scan 'tbl_user', {COLUMNS => [ 'info:id', 'info:age']}
2、TIMESTAMP 指定时间戳
# 语法
scan '表名',{TIMERANGE=>[timestamp1, timestamp2]}# 示例
scan 'tbl_user',{TIMERANGE=>[1551938004321, 1551938036450]}
3、VERSIONS

默认情况下一个列只能存储一个数据,后面如果修改数据就会将原来的覆盖掉,可以通过指定VERSIONS时HBase一列能存储多个值。

create 'tbl_test', 'columnFamily1'
describe 'tbl_test'# 修改列族版本号
alter 'tbl_test', { NAME=>'columnFamily1', VERSIONS=>3 }put 'tbl_test', 'rowKey1', 'columnFamily1:column1', 'value1'
put 'tbl_test', 'rowKey1', 'columnFamily1:column1', 'value2'
put 'tbl_test', 'rowKey1', 'columnFamily1:column1', 'value3'# 默认返回最新的一条数据
get 'tbl_test','rowKey1','columnFamily1:column1'# 返回3个
get 'tbl_test','rowKey1',{COLUMN=>'columnFamily1:column1', VERSIONS=>3}
# 返回2个
get 'tbl_test','rowKey1',{COLUMN=>'columnFamily1:column1', VERSIONS=>2}
4、STARTROW

ROWKEY起始行。会先根据这个key定位到region,再向后扫描

# 语法
scan '表名', { STARTROW => '行键名'}# 示例
scan 'tbl_user', { STARTROW => 'vbirdbest'}
5、STOPROW :截止到STOPROW行,STOPROW行之前的数据,不包括STOPROW这行数据
# 语法
scan '表名', { STOPROW => '行键名'}# 示例
scan 'tbl_user', { STOPROW => 'xiaoming'}
6、LIMIT 返回的行数
# 语法
scan '表名', { LIMIT => 行数}# 示例
scan 'tbl_user', { LIMIT => 2 }

5.5.10 FILTER条件过滤器

过滤器之间可以使用AND、OR连接多个过滤器。

1、ValueFilter 值过滤器
# 语法:binary 等于某个值
scan '表名', FILTER=>"ValueFilter(=,'binary:列值')"
# 语法 substring:包含某个值
scan '表名', FILTER=>"ValueFilter(=,'substring:列值')"# 示例
scan 'tbl_user', FILTER=>"ValueFilter(=, 'binary:26')"
scan 'tbl_user', FILTER=>"ValueFilter(=, 'substring:6')"
2、ColumnPrefixFilter 列名前缀过滤器
# 语法 substring:包含某个值
scan '表名', FILTER=>"ColumnPrefixFilter('列名前缀')"# 示例
scan 'tbl_user', FILTER=>"ColumnPrefixFilter('birth')"
# 通过括号、AND和OR的条件组合多个过滤器
scan 'tbl_user', FILTER=>"ColumnPrefixFilter('birth') AND ValueFilter(=,'substring:26')"
3、rowKey字典排序

Table中的所有行都是按照row key的字典排序的

image-20220608234458949

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Blender 效果制作:制作起伏不平的路面

前置准备正常纹理贴图,置换贴图,法线贴图,粗糙贴图方法一首先用UV坐标,纹理贴图,法线贴图,粗糙贴图构建材质将网格细分多一点,并采用置换修改器,置换修改器使用置换贴图获得成图方法二首先用UV坐标,纹理贴图,法线贴图,粗糙贴图构建材质细分网格将【置换】改成“置换…

团队作业4-第5篇Scrum博客

团队作业4-第5篇Scrum博客 1 站立式会议 1.1 会议照片1.2 会议内容 昨天已完成的工作:已初步完成数据库记录的备份、恢复和退出功能及账目记录的增删改功能今天计划完成的工作项目模块 需要实现的功能 负责人 预计用时主界面模块 右键实现增删改功能 黄锐 2h主界面模块 报告界…

PCFN

import torch import torch.nn as nn import torch.nn.functional as Fclass PCFN(nn.Module):使用带有GELU的激活函数的1*1卷积对扩展的隐藏空间进行跨信道交互。 然后将隐藏特征分割成两块 对其中一块使用3*3卷积核GELU激活函数 编码局部上下文将处理后的结果和另一块合并def…

Linux 内核如何装载和启动一个可执行程序

张晓攀+原创作品转载请注明出处+《Linux内核分析》MOOC课程https://mooc.study.163.com/course/1000029000 实验七——Linux 内核如何装载和启动一个可执行程序 一、实验过程 1.从github上下载相关代码2.然后用test_exec.c 替换test.c,再重新编译生成根文件系统3.启动调试内核…

java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现

java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现@目录背景说明前言Runtime.exec()常见的几种陷阱以及避免方法陷阱1:IllegalThreadStateException陷阱2:Runtime.exec()可能hang住,甚至死锁陷阱3:不同平台上,命令的兼容性陷阱4:错把Runtime.exec()的…

昆工891数据库系统原理强化课程

--昆工昆明理工大学、计算机技术、人工智能、软件工程、网络空间安全、891计算机专业核心综合、计算机系统结构、计算机软件与理论、网络与信息安全、计算机应用技术、综合程序设计、通信工程、817信号与系统、信号与信息处理、通信与信息系统

第7篇Scrum博客

1.站立式会议 1.1 会议照片1.2 会议内容 昨天已完成的工作: 昨天已基本实现用条形图,折线图,饼图展示数据界面功能。 今天计划完成的工作项目模块 需要实现的功能 负责人 预计用时主界面模块 整合代码,查漏补缺 王伊若 5h主界面模块 主界面设计 王伊若 2h主界面模块 查询界…

Ant Design Vue组件安装

https://www.antdv.com/docs/vue/getting-started-cn

书生共学大模型实战营L1G6000 XTuner微调

任务描述:使用XTuner微调InternLM2-Chat-7B实现自己的小助手认知 该任务分为数据集处理、微调训练、合并部署三个环节。数据处理:主要是将目标json文件中的字段替换为和自己用户名相关的字段,这里我们将“尖米”替换为“科研狗1031”:微调训练:采用教程中的XTuner框架,在…

request to https://registry.npm.taobao.org/ant-design-vue failed, reason: certificate has expire

一、原因分析 其实早在 2021 年,淘宝就发文称,npm 淘宝镜像已经从 http://registry.npm.taobao.org 切换到了 http://registry.npmmirror.com。旧域名也将于 2022 年 5 月 31 日停止服务(直到 HTTPS 证书到期才真正不能用了)2024年1 月 22 日,淘宝原镜像域名(http…

【学校训练记录】11月个人训练赛4个人题解

A题意可以理解为在a,b的范围内如果一个数是某个整数的立方,求与其距离为k的范围内有几个整数的平方数,我们可以对于每个立方数求出其数量,注意边界问题 #include <bits/stdc++.h> #define int long long using namespace std;int a, b, k; void solve(){cin >>…