HBase是什么? 2004 谷歌发表的论文
1 衍生:bigtable
2 概念:数据库--》 底层hdfs ---> mysql ---》 存储量TB
3 HBASE: 纯净:---》视图 事务 存储过程 语句 。。。。:
4hbase: 读写速度快 --》 hdfs--》?
5 hbase--> 存储格式: hbase byte[]----> 存储类型宽泛
Apache HBase™ is the Hadoop database, a distributed, scalable, big data store.
Apache Hbase 是hadoop数据库,一个分布式的,可扩展(hdfs)的大数据存储。(hbase是hdfs的上层架构)
Hbase 非关系型数据库: nosql:--->---》 面向列存储--》
Hbase ---> byte[] ----> 可以存储任意格式的数据---》
Use Apache HBase™ when you need random, realtime read/write access to your Big Data. This project's goal is the hosting of very large tables -- billions of rows X millions of columns -- atop clusters of commodity hardware. Apache HBase is an open-source, distributed, versioned, non-relational database modeled after Google's Bigtable: A Distributed Storage System for Structured Data by Chang et al. Just as Bigtable leverages the distributed data storage provided by the Google File System, Apache HBase provides Bigtable-like capabilities on top of Hadoop and HDFS.
当你需要对你的大量数据进行随机近实时读写时使用Hbase。HBase的目标是在商用硬件集群上管理非常大的表,数十亿条目数(行)X数百万列,6稀疏表(非关系型,结构化强),宽表(列),高表(行)。
Hbase ---> 数据库---》 databases tables
7
Rowkey---> value --> n多个字段
Mysql:
Id()---> columns
---。 hbase -->
Create table user,”info”,”address”
Name age ...
Rowkey :默认是第一个列---> rowkey一般是有意义的而且是排序(字典顺序)
列族: column family:
列族下面不一定有列
列族下面有列的话取决于rowkey对应的列有没有值
hbase是面向列存储的:---》 弹性十足,空间使用率高
HBase跟hive有什么区别?
Hive的定位是数据仓库,虽然也有增查,但其删改查对应的是整张表而不是单行数据,查询的延迟较高。其本质是更加方便的使用mr的威力来进行离线分析的一个数据分析工具。
HBase的定位是hadoop的数据库,是一个典型的Nosql,所以HBase是用来在大量数据中进行低延迟的随机查询的。
Hive:仓库---》 mr ---》 sql----->mr---》工具---》 hive--->处理结果----》hbase
Hbase存数据 ---》 hive--->处理结果----》hbase ----》 hdfs ---> hive--》 hbase取数据:
Hbase结构
HBase下载
HBase官网
http://hbase.apache.org/
HBase下载页面
http://mirror.bit.edu.cn/apache/hbase/stable/
我们的课程中使用Hbase的最新稳定(stable)版,即hbase-1.1.2-bin.tar.gz。
HBase安装和基本使用
安装前的规划
集群中机器名:master、slave1、slave2
单机方式安装
注意:单机方式安装时若安装所在的机器上有已经启动的zookeeper,要将其关闭,因为HBase内部会启动一个单机版的zookeeper,一般两者都使用2181端口,可能会造成端口冲突。
- 配置JAVA_HOME
进入到Hbase的安装路径下的conf目录,在hbase-env.sh文件中配置JAVA_HOME信息(即打开JAVA_HOME那一行的注释,并且根据本机真实的JAVA_HOME来进行配置,可使用which java命令快速查询java所安装的位置)
export JAVA_HOME=/usr/jdk1.8.0_6
export HADOOP_HOME=/root/Downloads/hadoop-2.6.5
- 配置被hbase-site.xml文件
进入到Hbase的安装路径下的conf目录,在hbase-site.xml文件中配置相关信息
添加如下配置项:
上述两个配置项中,hbase.rootdir指的是HBase用来存放数据的目录,这个目录不需要自己创建,HBase会帮助我们进行配置。如果你自己创建了这个目录,HBase会尝试将其做一个迁移,这可能不是你想要的结果。hbase.zookeeper.property.dataDir是用来存放HBase自己管理的zookeeper的属性数据信息的目录
至此,Hbase的单机安装配置就完毕了。
Hbase shell基本使用
启动HBase
(单机方式为了演示方便,我们就不在/etc/profile中配置HBase的Home了)
单机模式无需启动即可直接进入到HBase的shell,方式为:进入到Hbase的安装目录,执行如下命令:
# ./bin/start-hbase.sh
启动后可通过jps查看其进程,如下图所示,单机版启动后只有一个HMaster进程。
连接HBase
(单机方式为了演示方便,我们就不在/etc/profile中配置HBase的Home了)
进入到HBase的shell,方式为:进入到Hbase的安装目录,执行如下命令:
# ./bin/hbase shell
查看帮助信息
在HBase shell中使用help命令
hbase(main):001:0>help
执行一些命令
- 创建表(需要创建表名和列族)
hbase(main):001:0> create 'test', 'cf'
- 列出表信息
hbase(main):001:0>list 'test'
- 往表中添加数据
hbase(main):001:0>put 'test', 'row1', 'cf:a', 'value1'
hbase(main):002:0>put 'test', 'row2', 'cf:b', 'value2'
hbase(main):003:0>put 'test', 'row3', 'cf:c', 'value3'
- 扫描全表数据
hbase(main):001:0> scan 'test'
- 获取某行数据
hbase(main):003:0>get 'test', 'row1'
- 禁用表(在删除表之前要现将其禁用)
hbase(main):001:0>disable 'test'
- 启用表
hbase(main):001:0>enable 'test'
- 删除表
hbase(main):001:0>drop 'test'
退出HBase
在HBase shell中使用quit命令
hbase(main):001:0>quit
伪分布方式安装
伪分布式方式安装时,HBase的每个守护程序(HMaster,HRegionServer,和Zookeeper)都将作为一个单独的进程运行在同一台机器上,并且会将数据的存储方式由Linux本地文件系统更换为HDFS分布式文件系统,这意味着需要有一个可用的hadoop集群。
如果刚进行单机方式的安装,我们需要将HBase关闭,伪分布式安装会指定一个新的目录来存放HBase中的数据,所以刚才创建的表等数据将会丢失。
- 配置JAVA_HOME
进入到Hbase的安装路径下的conf目录,在hbase-env.sh文件中配置JAVA_HOME信息(即打开JAVA_HOME那一行的注释,并且根据本机真实的JAVA_HOME来进行配置,可使用which java命令快速查询java所安装的位置)
export JAVA_HOME=/usr/jdk1.8.0_6
- 配置被hbase-site.xml文件
进入到Hbase的安装路径下的conf目录,在hbase-site.xml文件中配置相关信息
添加如下信息,以保证使用伪分布方式:
将单机模式中存储数据的地址由Linux本地文件系统地址改为HDFS地址
—
注意,这里添加的是HDFS的fs.defaultFS 配置项的值,这个值跟HDFS是否开启HA有关系
-->
这个目录不需要自己创建,HBase会帮助我们进行配置。如果你自己创建了这个目录,HBase会尝试将其做一个迁移,这可能不是你想要的结果。
保留存储zookeeper的配置
全分布式安装配置
- 首先保证已有一个独立的zookeeper集群,并设置hbase不自己管理zookeeper(我们现在使用的版本中默认就是如此,可以不进行配置)
- 在$HBASE_HOME/conf/hbase-env.sh中配置如下信息(若已有HBASE_MANAGES_ZK,将其改为false即可):
export HBASE_MANAGES_ZK=false
export JAVA_HOME=/usr/jdk1.8.0_60
export HADOOP_HOME=/usr/hadoop
- 在$HBASE_HOME/conf/regionservers中配置需要作为Hbase regin的机器名称,跟hadoop配置文件中的slaves文件类似,本例中配置信息如下
Hadoop01
Hadoop02
Hadoop03
- 在$HBASE_HOME/conf/hbase-site.xml文件中配置如下信息:
这个目录不需要自己创建,HBase会帮助我们进行配置。如果你自己创建了这个目录,HBase会尝试将其做一个迁移,这可能不是你想要的结果。
- 给hbase添加HADOOP_HOME信息
由于HDFS做了高可用,所以需要告知HBASE HADOOP_HOME
就算在/etc/profile中已经配置了HADOOP_HOME,也还需要必须在hbase-env.sh 文件中添加HADOOP_HOME信息:
export HADOOP_HOME=/home/bigdata/hadoop
- 整体拷贝Hbase配置文件到regionservers中配置的其他机器上
做好上述配置后,跟hadoop类似,需要将其拷贝到在reginservers中配置的其他机器上。
完全分布方式的启动和关闭
全分布方式(集群方式)的HBase因为依赖hadoop和zookeeper,所以在启动HBase的时候,需要先保证这两者已经启动起来了再来启动HBase。
简便检测方法,使用jps命令检测各个组件的进程即可。
启动HBase服务
以下命令的执行前提是已经在系统中配置好了HBASE_HOME.
在master机器上执行如下命令(因为其上配置了从master到各个slave的ssh免密码登录):
# sh start-hbase.sh
启动后可通过jps命令查看HBase的进程信息:
- 普通的RegionServer
- Hbase的master
HquorumPeer进程证明Hbase内部的Zookeeper已启动
QuorumPeerMain进程证明外部的Zookeeper已启动
一般都启动外部的、独立的Zookeeper
进入HBase shell
# hbase shell
退出HBase shell
hbase(main):001:0> quit
关闭HBase服务
# sh stop-hbase.sh
Hbase webUI
默认地址为:http://master:16010/
注意:0.9x极以前的版本中,webUI地址的默认端口为60010。
建议使用Chrome浏览器观看,IE有兼容问题。
Hbase的经典使用场景
HBase基本概念
逻辑概念
如下图所示,是一个HBase的典型表,HBase中通过多个条件(经常称之为坐标)来定位表中的数据:
表
HBase表由多行组成。
行
一行在HBase由行键和一个或多个列的值组成。如下图所示:
行按字母顺序排序的行键存储,行健类似关系型数据库中的ID列。如下图所示:
出于这个原因,行键的设计是非常重要的。目的是存储数据的方式接近彼此相关的行。常见的行键模式是一个网站域名。如果您的域名是行键,您应该将它们翻转后存储,(例如:org.apache.www, org.apache.mail, org.apache.jira)。这种方式,所有的Apache表中的域相互靠近,而不是基于子区域的第一个字母展开。
列
列是表中的最基本元素,HBase的列包含一个列族和一个列限定符,列属于一个列族,列族属于一个行。列中的内容不需要指定类型,这也是与关系型数据不同的地方,也是HBase被称之为无类型的数据库的原因。HBase的列与关系型数据库不同,在于其含有版本的概念,一个列的数据可以有多个历史版本,体现形式就是时间戳。
列族
在关系型数据库中没有列族的概念,在HBase中,列族是一行中一个或多个列的集合,就是一行数据的一部分。列族需要在表创建时就定义好,并且不能修改的太频繁,数量也不能太多,在以前的HBase实现中有少量已知的缺陷,导致列族的数量最多只能使用几十个。列族中的列的数量是没有限制的。
列限定符
如图所示,列族中可以包含多个列,一个表中的某个列的定位方式就成为了meta:size 这种方式。我们就称之为列限定符,说白了,列限定符即指一个列族中的某个列。
单元格
一个单元格是行、列族和列限定符的结合,也就是说,通过这三个值(也称之为坐标)来唯一确定一个单元格。其中包含值和创建这个值的时间(即时间戳)。单元格中的值与关系型数据库不同的是,其如果没有值的话,就为空,什么也不写,也不占用底层物理存储。关系型数据中则需要存储null。
时间戳
时间戳就是写入某个单元格中的数据时候的具体时间(从1970年1月1日开始到当前系统时间的一个毫秒值),用来表示一个单元格中的数据的新旧。
数据模型
逻辑模型:有序映射的映射集合
存储模型:列式存储
物理模型:面向列族
HBase增删改查内部流程
HBase写流程和更新流程
HBase读流程
HBase删流程
HBase shell
详见HBaseShell常用命令.docx文档
HBase java api
使用eclipsh开发Hbase 程序
先将Hbase 安装目录下的lib目录中的所有jar包导入到项目中
只需创建普通的java应用程序即可,需要在项目中创建conf目录,并将hbase-site.Xml文件放进其中(此时hbase-site.xml文件中的hbase.rootdir配置项的值应为hdfs://master:8020/hbase的形式,这种方式不影响使用HDFS的HA,但是不能直接配置成HDFS中的HA的方式)。再通过Configure Build Path将conf目录添加为ClassFloder即可。
同时还需要在Windows中配置hosts文件,以方便访问Hbase服务器。
具体语法
详见代码和HBase JAVA API.docx文档
HBase的HA之backupMaster
HBase的HA与HDFS的HA类似,也是通过多Master程序来实现的,其中有一个Master为主提供服务的Master,剩下的master对活跃的Master进行备份,习惯称之为backupMaster,也称之为slave类型的Master。主master与slave类型的master之间不需要通过其他额外的方式进行数据共享。当主Mater挂掉时,会自动切换到slave类型的Master上(需要几秒钟时间)。(HBase的HA机制可以在HBase的master已有数据时进行操作)
实现方式
在habse的conf目录里添加backup-master文件,其中填入需要作为Master的机器即可,在本例中,其内容如下(其中每个主机名占一行):
master
slave1
注意:实际操作发现在master机器上的conf目录下创建此文件即可,无需在所有机器上都添加此文件,同样的,启动时需要在master机器上启动Hbase程序。
如果不配置此文件,Hbase本身也是支持多Master的,只需要在多台机器上启动master即可。启动命令如下:
# sh hbase-daemon.sh start master
检测方式
在master机器上正常启动Hbase即可,启动后在slave1机器上通过jps命令可以看到slave1机器上也开启了master进程。
启动命令:
# sh start-hbase.sh
正常启动的web信息
- Master机器上的web界面如下图所示:
- Slave1机器上的web界面如下图所示:
杀死slave1上的master进程后的web信息
使用如下两种方式皆可杀死slave1机器上的Hbase 的master进程
- 直接杀死进程:
Kill -9 master进程的端口号
- 使用hbase自带的命令关闭master进程
sh hbase-deamon.sh stop master
[0-2) 包前不包后
64K
Rk001
---
Ke001
….
Rk1000
Rk001
Rk1000
Ke001
Hbase能存储倾斜数据 度
Rowkey
hbase表最终目标: 数据稀疏、数据尽量小倾斜
不倾斜 站
尽量倾斜
完全倾斜 躺
关系型数据库