HBase

HBase介绍

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作为对应。

HBase背景

关系型数据库(RDBMS), mysql/oracle/sqlserver/db2,在这几十年里取得了巨大的成功。联机式事务处理(OLTP)系统使用RDBMS,来实时记录交易信息

还一个系统(OLAP)用来分析查询所存储的数据,一般来说都是按天、周、月生成销售报表,
按地域从不同的角度分析信息。

OLAP和OLTP的区别

HBase_第1张图片

HBase单机节点安装

准备

HBase_第2张图片

# 解压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伪分布式安装

# 修改 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

zookeeper安装

[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全分布式式安装

# 修改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

HBase特性

HBase_第3张图片

HBase_第4张图片

HBase与RDBMS

HBase_第5张图片

NoSql与RDBMS区别

HBase_第6张图片

HBase 表模型

HBase_第7张图片

HBase表与mysql表对比

HBase_第8张图片

HBase工作机制

HBase_第9张图片

从图中可以看出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的。

HBase命令

通用命令

help

help 'status' #查询指定命令的帮助文档

Commands: status version whoami  table_help

命名空间命令(Namespace)

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'

常用DDL命令

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'   #才能删除

DML命令

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}

你可能感兴趣的:(Hadoop,hbase)