HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PCServer上搭建起大规模结构化存储集群。HBase利用Hadoop HDFS作为其文件存储系统,利用HadoopMapReduce来处理HBase中的海量数据,利用Zookeeper作为协调工具。
1.HBase(NoSQL)的数据模型
1.1 表(table),是存储管理数据的。
HBASE中的每一张表,就是所谓的BigTable。稀疏表。
RowKey和 ColumnKey是二进制值byte[],按字典顺序排序;
Timestamp是一个 64位整数;
value是一个未解释的字节数组byte[]。
表中的不同行可以拥有不同数量的成员。即支持“动态模式“模型
1.2 行键(row key),类似于MySQL中的主键。
行键是HBase表天然自带的。
1.3 列族(column family),列的集合。
“族:标签”
其中,族和标签都可为任意形式的串
HBase表中的数据,每个列族单独一个文件。
1.4 时间戳(timestamp),列(也称作标签、修饰符)的一个属性。
行键和列确定的单元格,可以存储多个数据,每个数据含有时间戳属性,数据具有版本特性。
如果不指定时间戳或者版本,默认取最新的数据。
1.5 存储的数据都是字节数组。
1.6 表中的数据是按照行键的顺序物理存储的。
表是存放数据的。表由行和列组成
数据模型
2.HBase的物理模型
2.1 HBase是适合海量数据(如20PB)的秒级简单查询的数据库。
2.2 HBase表中的记录,按照行键进行拆分, 拆分成一个个的region。
许多个region存储在region server(单独的物理机器)中的。
这样,对表的操作转化为对多台region server的并行查询。
3.HBase的体系结构
3.1 HBase是主从式结构,HMaster、HRegionServer
HBase中有两张特殊的Table,-ROOT-和.META.
Zookeeper中记录了-ROOT-表的location
Client访问用户数据之前需要首先访问zookeeper,然后访问-ROOT-表,接着访问.META.表,最后才能找到用户数据的位置去访问
4.HBase伪分布安装
4.1 解压缩、重命名、设置环境变量
#cd /usr/local
#tar -zxvfhbase-0.94.2-security.tar.gz
#mv hbase-0.94.2-securityhbase
修改/etc/profile文件。
#vi /etc/profile
增加
export HBASE_HOME=/home/hbase
修改
exportPATH=$JAVA_HOME/bin:$PATH:$HADOOP_HOME/bin:$HBASE_HOME/bin
保存退出
#source /etc/profile
4.2 修改$HBASE_HOME/conf/hbase-env.sh,修改内容如下:
export JAVA_HOME=/usr/local/jdk
export HBASE_MANAGES_ZK=true
4.2 修改$HBASE_HOME/conf/hbase-site.xml,修改内容如下:
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop0:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop0</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
注意:$HBASE_HOME/conf/hbase-site.xml的hbase.rootdir的主机和端口号与$HADOOP_HOME/conf/core-site.xml的fs.default.name的主机和端口号一致
4.3 (可选)文件regionservers的内容为hadoop0
4.4 启动hbase,执行命令start-hbase.sh
******启动hbase之前,确保hadoop是运行正常的,并且可以写入文件*******
4.5 验证:(1)执行jps,发现新增加了3个java进程,分别是HMaster、HRegionServer、HQuorumPeer
(2)使用浏览器访问http://hadoop0:60010
1.hbase的机群搭建过程(在原来的hadoop0上的hbase伪分布基础上进行搭建)
1.1 集群结构,主节点(hmaster)是hadoop0,从节点(region server)是hadoop1和hadoop2
1.2 修改hadoop0上的hbase的几个文件
(1)修改hbase-env.sh的最后一行export HBASE_MANAGES_ZK=false
(2)修改hbase-site.xml文件的hbase.zookeeper.quorum的值为hadoop0,hadoop1,hadoop2
(3)修改regionservers文件(存放的region server的hostname),内容修改为hadoop1、hadoop2
1.3 复制hadoop0中的hbase文件夹到hadoop1、hadoop2中
复制hadoop0中的/etc/profile到hadoop1、hadoop2中,在hadoop1、hadoop2上执行source /etc/profile
1.4 首先启动hadoop,然后启动zookeeper集群。
最后在hadoop0上启动hbase集群。
HBASE Shell
名称 |
命令表达式 |
创建表 |
create '表名称', '列族名称1','列族名称2','列族名称N' |
添加记录 |
put '表名称', '行名称', '列名称:', '值' |
查看记录 |
get '表名称', '行名称' |
查看表中的记录总数 |
count '表名称' |
删除记录 |
delete '表名' ,'行名称' , '列名称' |
删除一张表 |
先要屏蔽该表,才能对该表进行删除,第一步 disable '表名称' 第二步 drop '表名称' |
查看所有记录 |
scan "表名称" |
查看某个表某个列中所有数据 |
scan "表名称" , {COLUMNS=>'列族名称:列名称'} |
更新记录 |
就是重写一遍进行覆盖 |
>create 'users','user_id','address','info'
表users,有三个列族user_id,address,info
>list
>describe 'users'
>create 'users_tmp','user_id','address','info'
>disable 'users_tmp'
>drop 'users_tmp'
put'users','xiaoming','info:age','24';
put'users','xiaoming','info:birthday','1987-06-17';
put 'users','xiaoming','info:company','alibaba';
put 'users','xiaoming','address:contry','china';
put 'users','xiaoming','address:province','zhejiang';
put 'users','xiaoming','address:city','hangzhou';
put'users','zhangyifei','info:birthday','1987-4-17';
put 'users','zhangyifei','info:favorite','movie';
put 'users','zhangyifei','info:company','alibaba';
put 'users','zhangyifei','address:contry','china';
put 'users','zhangyifei','address:province','guangdong';
put 'users','zhangyifei','address:city','jieyang';
put 'users','zhangyifei','address:town','xianqiao';
1.取得一个id的所有数据
>get 'users','xiaoming'
2.获取一个id,一个列族的所有数据
>get 'users','xiaoming','info'
3.获取一个id,一个列族中一个列的
所有数据
get 'users','xiaoming','info:age'
>put 'users','xiaoming','info:age' ,'29'
>get 'users','xiaoming','info:age'
>put 'users','xiaoming','info:age' ,'30'
>get 'users','xiaoming','info:age'
>get 'users','xiaoming',{COLUMN=>'info:age',VERSIONS=>1}
>get 'users','xiaoming',{COLUMN=>'info:age',VERSIONS=>2}
>get 'users','xiaoming',{COLUMN=>'info:age',VERSIONS=>3}
〉get 'users','xiaoming',{COLUMN=>'info:age',TIMESTAMP=>1364874937056}
>scan 'users'
>delete 'users','xiaoming','info:age'
>get 'users','xiaoming'
>deleteall 'users','xiaoming'
>count 'users'
>truncate 'users'