内容简介:5. HBase Shell命令简单使用HBase 是一个可以建立在HDFS上的分布式NoSQL数据库(非关系型数据库只有对数据表进行增、删、查操作;没有改地操作,要做改的操作,需要先删除,再插入来代替)。
目录
5. HBase Shell命令简单使用
1. HBase简介
HBase是一个基于HDFS的面向列的分布式数据库 。HDFS基于流式数据访问,低时间延迟的数据访问并不适合在HDFS上运行。所以,如果需要实时地随机访问超大规模数据集,使用HBase是更好的选择。HBase时NoSQL(非关系型数据库)数据库,不支持关系型数据库地SQL,并且是 以键值对地方式按列存储 ,是非关系型数据库(Not Only SQL)中的一个重要代表。NoSQL目前并没有明确地范围和定义,其主要特点是通常被用于大规模数据地存储、没有预定义地模式(如表结构)、表和表之间没有复杂的关系。总体上可将NoSQL数据库分为以下4类:
- 基于列存储地类型
- 基于文档存储的类型
- 基于键值对存储的类型
- 基于图形数据存储的类型
HBase 是一个可以建立在HDFS上的分布式NoSQL数据库(非关系型数据库只有对数据表进行增、删、查操作;没有改地操作,要做改的操作,需要先删除,再插入来代替)。
2. hbase安装
hbase有三种安装方式:单机、伪分布式、完全分布式。
【 单机hbase】 :hbase数据库的数据文件存在 单一的一台设备上 ,使用的是该设备的文件系统。
【 伪分布式hbase】 :hbase数据库的数据文件存在 一台设备构成的hdfs上 ,数据库也分主从结构。
【 完全分布式hbase】:hbase数据库的数据文件存在
多台设备构成的hdfs上
,数据库也分主从结构。
我们这里为了后期学习,直接采用【 完全分布式hbase 】方式安装:
1)获取hbase安装包并解压到node1的/home/hdser/下 并重命名为hbase
[hduser@node1 ~]$ tar -zxvf /home/hduser/桌面/hbase-1.2.0-bin.tar.gz -C /home/hduser/ [hduser@node1 ~]$ mv /home/hduser/hbase-1.2.0/ /home/hduser/hbase
2)配置hbase核心配置文件(hbase-site.xml)
/home/hduser/hbase/conf/下
用安装的gedit记事本进入:
[hduser@node1 conf]$ gedit hbase-site.xml
增加以下核心内容:
<!-- 设置hbase 在hdfs 数据的存储位置 即配置HRegionServer的数据库存储目录--> <property> <name>hbase.rootdir</name> <value>hdfs://node1:9000/hbase</value> </property> <!-- 设置hbase是完全分布式类型,默认为false,即单机运行,true表示在分布模式运行 --> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <!-- 指定hbase的HMaster访问地址、端口 --> <property> <name>hbase.master</name> <value>node1:60000</value> </property> <!-- hbase的家庭成员(主从机的网络用户名) --> <property> <name>hbase.zookeeper.quorum</name> <value>node1,node2,node3</value> </property>
3)配置hbase环境配置文件(hbase-env.sh)
/home/hduser/hbase/conf/下
用安装的gedit记事本进入:
[hduser@node1 conf]$ gedit hbase-env.sh
在文末增加以下环境变量配置:
修改JAVA_HOME配置:
export JAVA_HOME=/usr/java/jdk1.8.0_171
增加HADOOP_HOME配置:
export HADOOP_HOME=/home/hduser/hadoop
增加HBASE_HOME配置:
export HBASE_HOME=/home/hduser/hbase
增加启用hbase 内置zookeeper配置:
export HBASE_MANAGERS_ZK=true
4)配置从机网络用户名(regionservers)
/home/hduser/hbase/conf/下
用安装的gedit记事本进入:
[hduser@node1 conf]$ gedit regionservers
将内容更改成从机用户名信息:
node2 node3
5)拷贝node1的hbase的主目录到node2,node3下,使得各个节点上都能运行HBase来构建HBase集群,执行以下两个命令
[hduser@node1 ~]$ scp -r hbase hduser@node2:/home/hduser/ [hduser@node1 ~]$ scp -r hbase hduser@node3:/home/hduser/
6)配置hbase的环境变量
用记事本命令打开配置环境
[hduser@node1 ~]$ sudo gedit /etc/profile
增加以下配置内容:
export HBASE_HOME=/home/hduser/hbase export PATH=$PATH:$HBASE_HOME/bin
保存并退出,使文件生效:
[hduser@node1 ~]$ source /etc/profile
3. hbase的启动与关闭
1)启动(启动前必须保证hdfs已经启动)
语法:【$>hbase主目录下/bin/start-base.sh】
[hduser@node1 ~]$ ./hbase/bin/start-hbase.sh node1: starting zookeeper, logging to /home/hduser/hbase/logs/hbase-hduser-zookeeper-node1.out node2: starting zookeeper, logging to /home/hduser/hbase/logs/hbase-hduser-zookeeper-node2.out node3: starting zookeeper, logging to /home/hduser/hbase/logs/hbase-hduser-zookeeper-node3.out starting master, logging to /home/hduser/hbase/logs/hbase-hduser-master-node1.out node3: starting regionserver, logging to /home/hduser/hbase/logs/hbase-hduser-regionserver-node3.out node2: starting regionserver, logging to /home/hduser/hbase/logs/hbase-hduser-regionserver-node2.out node3: Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0 node3: Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0 node2: Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0 node2: Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
Hbase首先启动的是ZooKeeper,再启动的是HMaster和HRegionServer,启动成功后注意node1上增加了两个 java 进程—"HQuorumPeer"和"HMaster",分别是ZooKeepper进程和HBase进程:
[hduser@node1 bin]$ jps 12226 HMaster 11186 NameNode 13651 Jps 11526 ResourceManager 11384 SecondaryNameNode 5353 HQuorumPeer 12748 Main
再看从机的Java进程,这里多了两个进程“HQuorumPeer”和“HRegionServer”,同样分别是ZooKeepper进程和HBase进程:
[hduser@node2 bin]$ jps 5444 DataNode 5557 NodeManager 4437 HQuorumPeer 4542 HRegionServer 6303 Jps
2)关闭
语法:【 $>hbase主目录下/bin/stop-base.sh】
[hduser@node1 hbase]$ /home/hduser/hbase/bin/stop-hbase.sh stopping hbase................ node3: stopping zookeeper. node2: stopping zookeeper. node1: stopping zookeeper.
3)浏览器测试:
访问: http://node1.16010
4)命令测试(登陆进入数据库)
语法:【$>hbase主目录下/bin/hbase shell】
[hduser@node1 ~]$ ./hbase/bin/hbase shell
进入HBase Shell后,使用HBase Shell命令“status”可在HBase Shell中查看HBase的运行状态,如下,表示当前共有两个HRegionServer正在正常运行:
hbase(main):001:0> status 2 servers, 0 dead, 1.5000 average load
4. 术语
1)hregion
hregion指的是hbase的数据存储是以区块(region)存储的。
2)hregionserver
hregionserver指的是hbase数据库从机,存具体数据。
3)hmaster
hmaster指的是hbase主机,存储元数据(结构数据)。
4)行(row)与行键(rowkey)
hbase中一条完整的数据即一行,由一个唯一的行键+多个列键值构成。
行键:每一行都有一条内置的主键,用于区别其他行数据。
5)列簇(columnfamily)
hbase中列簇指的是一个大列,这个大的列可以有0个(列簇即列)或多个列(column)构成。
如成绩表score中course列簇由数学(math)、美术(art)等。
新建表只需要指定列簇,而不需要指定列。
create table score ,'course:'.
6)列键(column key)
hbase中每一行数据都是由很多列键构成的,其中一个列一般都有一个或多个列键。
每一个列键值都由行键、单元格值、时间戳、版本构成。
如:成绩表中数学成绩结构如下->
行键 列 单元格值 时间戳 版本
1001 course:math 55 2019-1*** 1(及时间戳,以1,2,3.....增加)
7)单元格(cell 或者列键值)
在hbase中,值是作为一个单元保存在系统中的,要定位一个单元,需要使用”行键+列键+时间戳“等三要素
8)时间戳(Timestamp)
插入单元格时的时间,默认作为单元格的版本号。
9)来两个自定义的概要图理解
5. HBase Shell命令简单使用
命令都在hbase主目录下/bin/下,可以配置bin到环境变量PATH下(即上面做的环境变量配置)
注意:所有的表名和列名都要用单引号括起来并以逗号分隔开。
1)查看所有表: list
语法:【$hbase>list】
示例:
hbase(main):006:0> list TABLE music scores 2 row(s) in 0.0310 seconds => ["music", "scores"]
2) 查看当前表所有列簇的详细描述信息: describe
语法:【$hbase>describe '表名'】
示例:
hbase(main):007:0> describe 'scores'
Table scores is ENABLED
scores
COLUMN FAMILIES DESCRIPTION
{NAME => 'course', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false',
KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER',
COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '
65536', REPLICATION_SCOPE => '0'}
{NAME => 'grade', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', K
EEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', C
OMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '6
5536', REPLICATION_SCOPE => '0'}
2 row(s) in 0.3110 seconds
3)新建表、列、列簇: create
简化方式语法 :【$hbase>create '表名’,‘列簇1',......'列簇n'】
示例:
hbase(main):005:0> create 'scores','grade','course' 0 row(s) in 1.6600 seconds => Hbase::Table - scores
完整的语法写法:【$hbase>create '表名',{NAME=>'列簇名',VERSIONS=>可保存在单元时间版本的最大数量},....】
样例:
$hbase>create 'scores',{NAME=>'grade',VERSIONS=>5},{NAME=>'course',VERSIONS=5}
对比上一个方式,此命令制定了列簇名及可保存的单元时间版本最大数量。可以看出,指定列簇参数的格式为:参数名=>参数值,注意赋值符号为“=>”且参数名必须大写。如果制定了多个参数,应以逗号分开,最后所有参数以“{}”括起来表示一个列簇。
4)插入数据: put
语法:【$hbase>put '表名','行键名','列键名称','单元格值'】
样例:插入播放记录
$hbase>put 'music','1001','song','music1'
$hbase>put 'music','1001','singer','singer1'
$hbase>put 'music','1001','playdata','2019-11-1'
示例:
hbase(main):008:0> put 'scores','tom','grade:','1' 0 row(s) in 0.2000 seconds hbase(main):009:0> put 'scores','tom','course:art','80' 0 row(s) in 0.0400 seconds hbase(main):010:0> put 'scores','tom','course:math','89' 0 row(s) in 0.0090 seconds hbase(main):011:0> put 'scores','jason','grade:','2' 0 row(s) in 0.0330 seconds hbase(main):012:0> put 'scores','jason','course:art','87' 0 row(s) in 0.0120 seconds hbase(main):013:0> put 'scores','jason','course:math','57' 0 row(s) in 0.0040 seconds
5)扫描一张表: scan
语法:【 $hbase>scan '表名',{COLUMNS=>['列簇名1’,‘列簇名2'......],参数名=>参数值....}】 大括号内的内容为扫描条件,如果不指定则查询所有数据。
示例1:
hbase(main):014:0> scan 'scores' ROW COLUMN+CELL jason column=course:art, timestamp=1547563878493, value=87 jason column=course:math, timestamp=1547563894482, value=57 jason column=grade:, timestamp=1547563847271, value=2 tom column=course:art, timestamp=1547563796441, value=80 tom column=course:math, timestamp=1547563812083, value=89 tom column=grade:, timestamp=1547563754447, value=1 2 row(s) in 0.0550 seconds
示例2:以上输出结果显示2行数据,因为在scan的结果中,将相同的行键的所有单元视为一行。如果对有些列簇不关心,便可以指定只查询某一个列簇:
hbase(main):015:0> scan 'scores',{COLUMNS=>'course'}
ROW COLUMN+CELL
jason column=course:art, timestamp=1547563878493, value=87
jason column=course:math, timestamp=1547563894482, value=57
tom column=course:art, timestamp=1547563796441, value=80
tom column=course:math, timestamp=1547563812083, value=89
2 row(s) in 0.0260 seconds
语法:【 $hbase>scan '表名' ,{COLUNMN=>['列键1’,‘列键2'......],参数名=>参数值....}】将COLUMNS替换成COLUMN,表示当前扫描的目标时列键,如下示例中扫描所有行的列键为“course:math”的单元,并使用LIMIT参数限制只输出一个单元:
示例3:
hbase(main):016:0> scan 'scores',{COLUMN=>'course:math',LIMIT=>1}
ROW COLUMN+CELL
jason column=course:math, timestamp=1547563894482, value=57
1 row(s) in 0.2050 seconds
6)查询一行数据(不筛选): get
语法:【 $hbase>get '表名' ,'行主键名'】
样例:只查看 1001的数据
$hbase>get 'music','1001'
示例:查找行键为“jason”的所有单元
hbase(main):018:0> get 'scores','jason' COLUMN CELL course:art timestamp=1547563878493, value=87 course:math timestamp=1547563894482, value=57 grade: timestamp=1547563847271, value=2 3 row(s) in 0.1180 seconds
7)查询一行中某些单元格的数据(筛选): get
语法:【 $hbase>get '表名' ,'行主键名',{COLUNMNS=>['列簇名1’,‘列簇名2'......],参数名=>参数值....}】
语法:【 $hbase>get '表名' ,'行主键名',{COLUNMN=>['列键1’,‘列键2'......],参数名=>参数值....}】
示例:精确查找行键为“jason”,列键为"course:math"的单元
hbase(main):020:0> get 'scores','jason',{COLUMN=>'course:math'}
COLUMN CELL
course:math timestamp=1547563894482, value=57
1 row(s) in 0.0080 seconds
与scan相比多一个行键参数。因为scan查找的目标是全表的某个列簇、列键,而get查找的目标是某行的某个列簇、列键。
提示:
- get 'scores','jason',{COLUMNS=>'course'} 等价于 get 'scores','jason','course'
- get 'scores','jason',{COLUMN=>'course:math'} 等价于 get 'scores','jason','course:math'
- get 'scores','jason',{COLUMNS=>['course','grade']} 等价于 get 'scores','jason','course','grade'
- get 'scores','jason',{COLUMN=>['course:math','grade:']} 等价于 get 'scores','jason','course:math','grade:'
7)删除数据(删除一行中的一个单元): delete
语法:【$hbase>delete '表名','行主键名' {CLOUMNS=>'列键值'}】
注意:'列键值'--->'列簇名:查找的单元名称'
示例:
hbase(main):021:0> delete 'scores','jason','course:art' 0 row(s) in 0.0690 seconds hbase(main):022:0> get 'scores','jason' COLUMN CELL course:math timestamp=1547563894482, value=57 grade: timestamp=1547563847271, value=2 2 row(s) in 0.0150 seconds
8)删除一行: deleteall
语法:【$hbase>deleteall '表名','行主键名'】
9)修改表: alter
语法:【$hbase>alter'表名称',参数名=>参数值,........】为表增加或修改列簇;其中列簇名参数NAME必须提供,如果已存在则修改,否则会增加一个列簇。
示例:将scores表的列簇“course”的“VERSIONS”参数修改为“5”
hbase(main):023:0> alter 'scores',NAME=>'course',VERSIONS=>'5' Updating all regions with the new schema... 1/1 regions updated. Done. 0 row(s) in 2.4070 seconds
语法:【$hbase>alter'表名称',{参数名=>参数值,....},{参数名=>参数值,....}.......】 同时修改或增加多个列簇时应用逗号分开,并且每个列簇用“{}”括起来。
示例:将同时修改scores表的两个列簇
hbase(main):024:0> alter 'scores',{NAME=>'grade',VERSIONS=>'5'},{NAME=>'course',VERSIONS=>'5'}
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.8990 seconds
10)删除表: drop
语法:【$hbase>drop '表名'】
HBase表分为两种状态:ENABLED和DISABLED,分别表示是否可用。
使用disable将表设置为不可用状态:
语法:【$hbase>disable'表名'】
使用enable将表设置为可用状态:
语法:【$hbase>enable '表名'】
当表为ENABLED状态时,会被禁止删除,所以必须先将表设置为DISABLED状态才可以被删除。
示例:
hbase(main):032:0> disable 'scores' 0 row(s) in 2.2610 seconds hbase(main):033:0> drop 'scores' 0 row(s) in 1.2970 seconds hbase(main):034:0> list TABLE music 1 row(s) in 0.0040 seconds => ["music"] hbase(main):035:0>
提示:以上示例的顺序不完全是按正常顺序操作下来的,所以,应该按照正常的创建,增加,获取,修改,删除流程来操作。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Game Programming Patterns
Robert Nystrom / Genever Benning / 2014-11-2 / USD 39.95
The biggest challenge facing many game programmers is completing their game. Most game projects fizzle out, overwhelmed by the complexity of their own code. Game Programming Patterns tackles that exac......一起来看看 《Game Programming Patterns》 这本书的介绍吧!