Hbase教案 HBase是什么? 什么是nosql?Hbase not only sql HBase能用来干什么? HBase跟hive有什么区别? Hbase结构 HBase下载 HBase安装和基本使用 Hbase的经典使用场景 HBase基本概念 HBase shell HBase java api HBase的HA之backupMaster
HBase是什么?
Apache HBase™ is the Hadoop database, a distributed, scalable, big data store.
Apache Hbase 是hadoop数据库,一个分布式的,可扩展的大数据存储。
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 -- a top 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数百万列,
稀疏表,宽表,高表。HBase是一个模仿Gootable’s Bigtable的,开源的、分布式的、版本化的非关系型数据库。
Google’s Bigtable是一个由Chang等人创建的一个结构化的分布式存储系统。正如Bigtable利用谷歌的分布式文件存储系统,Apache HBase 在Hadoop和HDFS上提供类似Bigtable的功能。
关系型数据库
Mysql oracle sqlServer web 事务 type 结构化
Curd
存储不了大数据 结构化不严谨的存储不了
爬虫:爬取网页数据 java ---->http--->www.baidu.com----> <html></html>
---><div id=3>02 06 32 21 12 05</div> ---->保存在数据库中---->web
页面形式 mp3 mp4 pic
mongodb
Mysql innodb/myisam驱动
Id name age sex ....
1 zhangsan 12 null
2
3 nan
Document文档形式---->mongodb进行数据存储 ----->文档存储 ---->都会借助内存
Hbase大数据专用数据库 没有格式int varchar ....
Byte[] 半结构化存储 文档形式存储
1(id) zhangsan(name) 30(age) sex(woman)
1(id) 30(age)
Sex(woman)
Video(xxx.avi)
Document hbase == nosql ==not only sql === redis memcache mongodb
非结构化的数据(爬虫) 网页数据
Mysql
Centent varchar(2000)
Hbase mongodb redis .....
hbase纯数据库 curd 大量数据存储 查询速度特别快 高可靠(hdfs)
Hive区别
Hbase存储数据的 hdfs
Hive存储 hdfs
Hive数据处理(mr) hive存储数据只能是存储,而且有模板的概念
Hbase就是用来做数据存储的
Curd 速度 存储量 数据结构是hbase本身的
数据清洗的结果
Hbase byte【】
类似于文档,而且没有数据格式
User Userid(byte[]) username password
Select * from xx
Mysql oracle sqlServer.... sql
Nosql redis memcache mongodb
hbase和hive的关系? hive是数据仓库,只是通过mr这个超级工具进行数据分析
Hbase是真正的数据库 可以对每条数据进行curd hbase不能进行数据处理
Hbase的使用 存储比如格式化不严谨的数据 收集的数据会保存在hdfs中
Hdfs中的数据要进行清洗 --- hbase中 ---- mr
注:Hbase也是常见的Nosql之一。Rowkey
随机实时 mysql 毫秒
随机近实时 hbase 1秒
离线读取 mr hive 20秒 分钟
RDBMS:关系型数据库的特点:存储结构化数据、文本存储、单机、存储小1G以下或左右
一月1pb— 查询 、数据类型 varchar 、int、行存储、主键
rowkey 1,sdf,sfasdfsdf , 2 ,3
低延时 存储容量多:Big Table - C++、Google山寨:hadoop(hdfs、mapreduce)、
hbase特点:表结构(非结构化)、容量大(1张表1tb 行 几十亿行 和列 上千万列)、数据类型:
二进制 列族:列名称
rowkey ,sdf,sfasdfsdf , ,
rowkey 1 ,sdf,sfasdfsdf 2, 2,2
rowkey 1 ,sdf,sfasdfsdf 3, 2,2
rowkey 1 ,sdf,sfasdfsdf 4, 2,2
rowkey 1 ,sdf,sfasdfsdf 5, 2,2
rowkey 1 ,sdf,sfasdfsdf 6, 2,2
version timestamp
rowkey 1 ,sdf,sfasdfsdf 2, 2,2 1 ,sdf,sfasdfsdf 2, 2,2
非结构化数据
分布式文件存储系统:HDFS、S3 任何类型文件、块存储(128Mb)、分布式、有副本(多个)、对数据没有任何要求—不适合实时查询 查询特点 高延时 离线、数据类型 纯字符串
,sdf,sfasdfsdf , ,
关键字:稀疏 高表 宽表
什么是nosql?Hbase not only sql
Nosql的定义
NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,具体来说就是跟关系型数据库有些类似(查询低延迟),
但同时能够存储的数据类型却更加灵活,常见的有列式存储和文档存储等,为了跟关系型数据库加以区分,
称之为非关系型的数据库。Hbase是Nosql的一个种类,其特点是列式存储。
出现的原因
随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的web2.0纯动态网站已经显得力不从心,
暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。
互联网+
普通+物联网
--数据量产生巨大
Nosql的作用
Content varchar(2000) text
NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
常见的nosql数据库类型及其代表
非关系型数据库——列存储(HBase)
非关系型数据库——文档型存储(MongoDb)bson
{id:3,content:{pic:xxx,info:{work:xxx,educate:xxxx,marry:{1:xxx,2:xxxx}}}}
非关系型数据库——内存式存储(redis) k-v 只能存储小数据 get name
非关系型数据库——图形模型(GraphX)
HBase能用来干什么?
存储大量结果集数据,并提供低延迟的随机查询。说的通俗一些,就是一个超级版的数据库,相比较与mysql、postgresql和oracle、sqlserver等关系型数据库而言
,能够存储的数据量更大(比关系型数据库大很多很多),同时查询延迟相比较与其他hadoop产品(pig、hive)要低。
HBase跟hive有什么区别?
Hive的定位是数据仓库,虽然也有增查,但其删改查对应的是整张表而不是单行数据,查询的延迟较高。其本质是更加方便的使用mr的威力来进行离线分析的一个数据分析工具。
HBase的定位是hadoop的数据库,是一个典型的Nosql,所以HBase是用来在大量数据中进行低延迟的随机查询的。
Hbase结构
HBase下载
HBase官网
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
- 配置被hbase-site.xml文件
进入到Hbase的安装路径下的conf目录,在hbase-site.xml文件中配置相关信息
添加如下配置项:
<property>
<name>hbase.rootdir</name>
<value>file:///home/bigdata/hbase/data</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/bigdata/zookeeper</value>
</property>
上述两个配置项中,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文件中配置相关信息
添加如下信息,以保证使用伪分布方式:
<!-- 配置HBase使用分布式方式-->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
将单机模式中存储数据的地址由Linux本地文件系统地址改为HDFS地址
<!--hbase中的数据在HDFS上的位置-->
<!—
注意,这里添加的是HDFS的fs.defaultFS 配置项的值,这个值跟HDFS是否开启HA有关系
-->
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop01:8020/hbase</value>
</property>
这个目录不需要自己创建,HBase会帮助我们进行配置。如果你自己创建了这个目录,HBase会尝试将其做一个迁移,这可能不是你想要的结果。
保留存储zookeeper的配置
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/bigdata/zookeeper</value>
</property>
全分布式安装配置
- 首先保证已有一个独立的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使用分布式方式-->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!--hbase中的数据在HDFS上的位置(此处假设HDFS已经做了HA)-->
这个目录不需要自己创建,HBase会帮助我们进行配置。如果你自己创建了这个目录,HBase会尝试将其做一个迁移,这可能不是你想要的结果。
<property>
<name> hbase .rootdir</name>
<value>hdfs://hadoop01:8020/hbase</value>
</property>
<!--hbase需要连接的zookeeper集群-->
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop01,hadoop02,hadoop03</value>
</property>
<!--hbase中保存zookeeper数据的地址-->
<property>
<name>hbase.zookeeper.property.data.dir</name>
<value>/home/bigdata/hbase/var/zookeeper</value>
</property>
- 给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进程的端口号
2.使用hbase自带的命令关闭master进程
sh hbase-deamon.sh stop master
[0-2) 包前不包后
64K
Rk001
---
Ke001
….
Rk1000
Rk001
Rk1000
Ke001
Hbase能存储倾斜数据 度
Rowkey
hbase表最终目标: 数据稀疏、数据尽量小倾斜
不倾斜 站
尽量倾斜
完全倾斜 躺
关系型数据库