概括: 高性能,分布式,可伸缩, 面向列,实时读写,随机访问
轻易地通过在集群中增加或者减少硬件数量来从水平方向上实现性能的伸缩
。表, 是HBase中数据的逻辑组织方式, 从用户视图来看, HBase的逻辑模型如表1所示, HBase中的一个表有若干行, 每行有多个列族, 每个列族中包含多个列, 列的值可以有多个版本;
表1, 展示了HBase中一张典型的表, 表是学生信息表Student, 有三行记录和两个列族, 行键(RowKey)分别为0001, 00002, 0003, 两个列族(Column Fambily)分别为StuInfo 和 Grades, 每个列族中含有若干列, 如列族StuInfo中包含Name, Age, Sex和Class 四列, 列族Grades包括Bigdata, Computer和Math 三列;
注意: 在HBase中, 列不是固定的表结构, 在创建表时, 不需要预先定义列名, 可以在插入数据时临时创建.
HBase表逻辑结构与关系数据库表结构的区别:
- 关系数据库添加新列, 需要修改表结构, 这会对已有的数据产生很大的影响, 同时, 关系数据库中的表为每个列都预留了存储空间, 即表1中的空白Cell数据在关系型数据库中以"Null"值实际的占用存储空间, 所以, 对于稀疏数据来说, 关系型数据库表中就会产生很多Null值, 消耗大量的存储空间;
- 在HBase中, 如表1中的空白Cell在物理上是不占用存储空间的, 即不会存储空白的键值对, 因此, 若一个请求为获取RowKey:001, 列族为StuInfo, 列名为Class, 时间戳为T2, 得到的是一个空白值;
- 与面向行存储的关系型数据库不同, HBase 是面向列存储的, 在实际的物理存储中, 列是分开存储的, 即表1的学生信息将会被存储为StuInfo和Grades两个部分.
对HBase 表关键词的解释
NameSpace- 命名空间
RowKey-行键:
HBase使用RowKey来唯一的区分一行数据
;ColumnFambily-列族:
ColumnQualifier-列限定符:
Cell-单元格:
timeStamp-时间戳:
rigion-分区:
#搭配之前使用的hadoop, zk集群启停脚本, 开启各自的集群
>myhadoop start
>zk start
/opt/software
中, 并把它解压到我们前面经常使用的/opt/module/
中去, 并改名为hbase-2.3.7
>tar -zxvf apache-hadoop-hbase-2.3.7.tar.gz /opt/module
>mv apache-hadoop-hbase-2.3.7.tar.gz hbase-2.3.7
./conf/hbase-env.sh
export JAVA_HOME=/opt/module/jdk1.8
export HBASE_MANAGES_ZK=false #hbase自带的zk管理
./conf/regionservers
bigdata01
bigdata02
bigdata03
./conf/Hbase-site.xml
<configuration>
<property>
<name>hbase.rootdirname>
<value>hdfs://bigdata01:9000/hbasevalue>
property>
<property>
<name>hbase.cluster.distributedname>
<value>truevalue>
property>
<property>
<name>hbase.master.portname>
<value>16000value>
property>
<property>
<name>hbase.master,info.portname>
<value>16010value>
property>
<property>
<name>hbase.zookeeper,quorumname>
<value>bigdata01,bigdata02,bigdata03value>
property>
<property>
<name>hbase.zookeeper.property.dataDirname>
<value>/opt/module/zookeeper-3.5.7/zkDatavalue>
property>
configuration>
>xsync hbase-1.3.1
启动方式一:
>bin/hbase-daemon.sh start master
>bin/hbase-daemon.sh start regionserver
启动方式二;:
>bin/start-hbase.sh
>bin/stop-hbase.sh
/bin/hbase shell
, 查看帮助命令help
, 查看数据中有哪些表list
:另外: 如果在hbase shell中打错命令了, 而且你已经回车了怎么办?
create '表名-table','列族1-Column_family_1', '列族2_Column_family_2'....
create 'person','familyOne','familyTwo','familyThree'
enable '表名'
, 相应的关闭表就是: disable '表名'
list
;describe "表名"
count "表名"
'disable '表名'
,truncate '表名'
即可清除表中的数据;Alter a table. Tables can be altered without disabling them first.
Altering enabled tables has caused problems
in the past, so use caution and test it before using in production.
You can use the alter command to add,
modify or delete column families or change table configuration options.
Column families work in a similar way as the 'create' command. The column family
specification can either be a name string, or a dictionary with the NAME attribute.
Dictionaries are described in the output of the 'help' command, with no arguments.
For example, to change or add the 'f1' column family in table 't1' from
current value to keep a maximum of 5 cell VERSIONS, do:
hbase> alter 't1', NAME => 'f1', VERSIONS => 5
You can operate on several column families:
hbase> alter 't1', 'f1', {NAME => 'f2', IN_MEMORY => true}, {NAME => 'f3', VERSIONS => 5}
To delete the 'f1' column family in table 'ns1:t1', use one of:
hbase> alter 'ns1:t1', NAME => 'f1', METHOD => 'delete'
hbase> alter 'ns1:t1', 'delete' => 'f1'
put
表名->rowkey->列族:列->
来取出/读取一行数据put '表名','RowKey', '列族:列', '要插入的值'
put 'table', 'rowkey','columnfambily:column','value'
hbase(main)>put 'person','1001','familyOne:name','happy'
注意: hbase的’put’命令, 一条语句只能插入或更新一个cell即一个单元格的数据; 如果我们需要往同一个rowkey,同一个列族但不同的列下插入多条数据, 需要使用多条语句实现:
put
get
get '表名-table', 'rowkey', ...
注意: 使用get命令时, 表名, rowkey是必选项, 我们还可以根据需要在后面加入一些筛选条件;
scan
当然, 我们也是可以加入一些筛选条件的, 就像再别的数据库查询中加入了where语句一样;
delete
注意, 如下图中帮助信息所述,
delete '表名','rowkey','列族:列名'
delete命令只能删除某一rowkey中, 处于某一个列族下的一个列的数据, 也就是一个单元格的数据, 所以我们还有个deleteall命令,用于删除一整行数据,
deleteall '表名','rowkey'