HBase是一种数据库:Hadoop分布式数据库。总体上来说,它是一个随机访问存储和检索数据的平台。HBase作用不适合处理实时数据,它适合处理海量数据,这与Hbase的极易扩展性息息相关。
HBase是Google Bigtable的开源实现,但是也有很多不同之处。比如:Google Bigtable利用GFS作为其文件存储系统,HBase利用Hadoop HDFS作为其文件存储系统;Google运行MAPREDUCE来处理Bigtable中的海量数据,HBase同样利用Hadoop MapReduce来处理HBase中的海量数据;Google Bigtable利用Chubby作为协同服务,HBase利用Zookeeper作为对应。
关系型数据库(RDBMS), mysql/oracle/sqlserver/db2,在这几十年里取得了巨大的成功。联机式事务处理(OLTP)系统使用RDBMS,来实时记录交易信息
还一个系统(OLAP)用来分析查询所存储的数据,一般来说都是按天、周、月生成销售报表,
按地域从不同的角度分析信息。
准备
# 解压HBase到指定目录:
[root@tianqinglong101 software]# tar -zxvf hbase-1.3.1-bin.tar.gz -C /opt/apps
[root@tianqinglong101 software]# cd apps
[root@tianqinglong101 apps]# cd hbase-1.3.1
# 配置环境变量
[root@tianqinglong101 hbase-1.3.1]# vi /etc/profile
export HBASE_HOME=/opt/apps/hbase-1.3.1
export PATH=$HABSE_HOME/bin
:wq
[root@tianqinglong101 hbase-1.3.1]# source /etc/profile
[root@tianqinglong101 hbase-1.3.1]# cd conf
[root@tianqinglong101 conf]# vi hbase-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
export HBASE_MANAGES_ZK=true #ture是用自己的zookeeper
[root@tianqinglong101 conf]# vi hbase-site.xml
<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:///opt/apps/hbase-1.3.1/tmp</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>opt/apps/hbase-1.3.1/zkData</value>
</property>
</configuration>
:wq
#启动hbase服务
[root@tianqinglong101 conf]# start-hbase.sh
[root@tianqinglong101 conf]# stop-hbase.sh # 停止
[root@tianqinglong101 conf]# hbase shell
hbase(main):001:0 >
# 修改 hbase-site.xml
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://tianqinglong101:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>opt/apps/hbase-1.3.1/zkData</value>
</property>
</configuration>
#启动测试
[root@tianqinglong101 conf]# start-hbase.sh
#测试webui
http://tianqinglong101:16010/master-status
[root@tianqinglong101 hbase-1.3.1]# rm -rf *.txt zkData/ tmp/
[root@tianqinglong101 hbase-1.3.1]# cd ..
[root@tianqinglong101 apps]# cd ..
[root@tianqinglong101 opt]# cd software/
# 解压
[root@tianqinglong101 software]# tar -zxvf zookeeper-3.4.5.tar.gz -C /opt/apps/
# 配置环境变量
[root@tianqinglong101 zookeeper-3.4.5]# vi etc/profile
export ZOOKEEPER_HOME=/opt/apps/zookeeper-3.4.5
export PATH=$ZOOKEEPER_HOME/bin
[root@tianqinglong101 zookeeper-3.4.5]# source etc/profile
[root@tianqinglong101 zookeeper-3.4.5]# echo "1" > myid
[root@tianqinglong101 zookeeper-3.4.5]# cd conf/
[root@tianqinglong101 conf]# mv zoo_sample.cfg zoo.cfg
[root@tianqinglong101 conf]# vi zoo.cfg
dataDir=/opt/apps/zookeeper-3.4.5
server.1=tianqinglong101:2888:3888
server.2=tianqinglong102:2888:3888
server.3=tianqinglong103:2888:3888
:wq
#分发
[root@tianqinglong101 zookeeper-3.4.5]# cd ..
[root@tianqinglong101 apps]# scp -r zookeeper-3.4.5/ tianqinglong102:/opt/apps/
[root@tianqinglong101 apps]# scp -r zookeeper-3.4.5/ tianqinglong103:/opt/apps/
[root@tianqinglong101 apps]# scp /etc/pofile tianqinglong102:/etc/pofile
[root@tianqinglong101 ~]# zkServer.sh start scp /etc/pofile tianqinglong103:/etc/pofile
## 修改每一个myid
tianqinglong102 2 source /etc/pofile
tianqinglong103 3 source /etc/pofile
#启动zookeeper(每台都启动)
[root@tianqinglong101 ~]# zkServer.sh start
[root@tianqinglong101 ~]# zkServer.sh status # 查看
# 修改hbase-env.sh
[root@tianqinglong101 conf]# vi hbase-env.sh
export HBASE_MANAGES_ZK=false
# 配置hbase-site.xml
[root@tianqinglong101 conf]# vi hbase-site.xml
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://tianqinglong101:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 0.98后的新变动,之前版本没有.port,默认端口为60000 -->
<property>
<name>hbase.master.port</name>
<value>16000</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>tianqinglong101:2181,tianqinglong102:2181,tianqinglong103:2181</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/opt/module/zookeeper-3.4.10/zkData</value>
</property>
</configuration>
# regionservers
[root@tianqinglong101 conf]# vi regionservers
tianqinglong101
tianqinglong102
tianqinglong103 注意映射(/etc/hosts)
# 配置从机
[root@tianqinglong101 conf]# vi backup-masters
tianqinglong102
:wq
# 时间同步
[root@tianqinglong101 conf]# ntpdate ntp1.aliyun.com
# 分发
[root@tianqinglong101 app]# scp -r hbase-1.3.1/ tianqinglong102:/opt/apps/
[root@tianqinglong101 app]# scp -r hbase-1.3.1/ tianqinglong103:/opt/apps/
#启动并且测试
[root@tianqinglong101 conf]# start-dfs.sh
[root@tianqinglong101 conf]# start-hbase.sh
[root@tianqinglong101 conf]# hbase shell
NoSql与RDBMS区别
从图中可以看出Hbase是由Client、Zookeeper、Master、HRegionServer、HDFS等几个组件组成,下面来介绍一下几个组件的相关功能:
client :客户端。访问hbase的组件都可以是客户端。she11、java.python
zookeeper :
监控hmaster,保证一个集群中有且仅有一台hmaster.
存储所有region的寻址入口
实时监控regionserver的状态,感知regionserver上下线,并实时的通知hmaster
存储hbase的部分的元数据信息
hmaster :整个hbase的主机
为regionserver分配region。
负责regionserver的负载均衡。
负责region的重新分配
hdfs上的垃圾回收
处理schema的更新请求
regionserver :整个hbase的从机节点之一
维护hmaster分配给他的region。
负责处理c1ient对这些region的读写请求,并和hdfs进行交互
负责具体的region的切分
hlog :日志
对hbase所有的操作进行记录,当我们有插入操作的时候,先将操作写入到日志,然后再写元数据库。
region :表的一部分
hbhase中分布式存储和负载均衡的最小单元
store : 列簇
memstore :
内存缓冲区,用于将数据批量刷新的hdfs,默认为128M
HFile
这是在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。StoreFile是以Hfile的形式存储在HDFS的。
help
help 'status' #查询指定命令的帮助文档
Commands: status version whoami table_help
list_namespace # 展示hbase中所有的namespace
list_namespace_table # 展示hbase下所有的表
create_namespace # 创建命名空间
create_namespace 'ns1'
create_namespace 'ns2',{'name'=>'lixi'}
describe_namespace # 查询指定的namespace的详细信息
describe_namespace 'ns1'
describe_namespace 'ns2'
alter_namespace # 修改 (很少用)
alter_namespace 'ns1',{METHOD=>'set','name'='rock'}
drop_namespace # 删除
drop_namespace 'ns2'
create # 建表 不写就是默认
create '[default:]student','Sname','Ssex','Sage','Sdept','course'
create 'teacher',{NAME=>'username',VERSIONS=>5}
create 'ns1:teacher',{NAME=>'f1',VERSIONS=>5}
list # 查看所有的表
describe # 查询表结构
describe 'teacher'
alter # 修改表
alter 'ns1:t1',{NAME=>'f2'} #增加一个列簇
alter 'ns1:t1','delete'=>'f2' #删除一个列簇
# 删除表
disable 'ns1:t1' #先让表失效
drop 'ns1:t1' #才能删除
put # 插入数据/修改(如果有)
put 't1','001','f1:name','lixi'
put 't1','001','f1:sex','man'
scan # 扫描表中的信息
scan 't1'
# 查询指定版本数据 (历史版本)
scan 't1',{RAW=>true,VERSION=>10}
# 查询指定列
scan 't1',{COLUMNS=>'f1:name'}
#分页查询
scan 't1',{COLUMNS=>['f1'],LIMIT=>3,STARTROW=>'001'} #查了4行
#get 查询 一般查询指定列簇的信息
get 't1','001','f1:name'
get 't1','001'
incr 插入一条数据,但是它的数据类型就不是string
incr 't1','005','f1:age' # 默认从1开始 再执行递增
delete # 删除
delete 't1','005','f1:age' # 删一个kv键值对
deleteall 't1','005' # 删一行
# 判断表是否存在
exists 't1';
count 't1' #看有几行
#清空表
truncate 't1'
# 1.创建表
hbase(main):002:0> create 'student','info'
# 2.插入数据到表
hbase(main):003:0> put 'student','1001','info:sex','male'
hbase(main):004:0> put 'student','1001','info:age','18'
hbase(main):005:0> put 'student','1002','info:name','Janna'
hbase(main):006:0> put 'student','1002','info:sex','female'
hbase(main):007:0> put 'student','1002','info:age','20'
# 3.扫描查看表数据
hbase(main):008:0> scan 'student'
hbase(main):009:0> scan 'student',{STARTROW => '1001', STOPROW => '1001'}
hbase(main):010:0> scan 'student',{STARTROW => '1001'}
# 4.查看表结构
hbase(main):011:0> describe ‘student’
# 5.更新指定字段的数据
hbase(main):012:0> put 'student','1001','info:name','Nick'
hbase(main):013:0> put 'student','1001','info:age','100'
# 6.查看“指定行”或“指定列族:列”的数据
hbase(main):014:0> get 'student','1001'
hbase(main):015:0> get 'student','1001','info:name'
# 7.统计表数据行数
hbase(main):021:0> count 'student'
# 8.删除数据
# 删除某rowkey的全部数据:
hbase(main):016:0> deleteall 'student','1001'
# 删除某rowkey的某一列数据:
hbase(main):017:0> delete 'student','1002','info:sex'
# 9.清空表数据
hbase(main):018:0> truncate 'student'
# 提示:清空表的操作顺序为先disable,然后再truncate。
# 10.删除表
# 首先需要先让该表为disable状态:
hbase(main):019:0> disable 'student'
# 然后才能drop这个表:
hbase(main):020:0> drop 'student'
# 提示:如果直接drop表,会报错:ERROR: Table student is enabled. Disable it first.
# 11.变更表信息
# 将info列族中的数据存放3个版本:
hbase(main):022:0> alter 'student',{NAME=>'info',VERSIONS=>3}
hbase(main):022:0> get 'student','1001',{COLUMN=>'info:name',VERSIONS=>3}