day01—————
一、Hbase的概述
1.1 Hbase是什么
(1) Hbase是apache旗下的一个开源的,分布式的,可扩展的,“面向列式存储”,非关系型的数据库(NoSql)
(2) Hbase的开发灵感来源于google的《big table》论文,实现的编程语言是java
(3) Hbase的设计目标是存储数十亿行x上百万列
(4) Hbase的存储是基于HDFS的
(5) Hbase是Hadoop数据库,功能是存储,而hive是用于分析和计算的
(6) Hbase提供了近似实时读写功能,利用了内存的机制
1.2 Hbase的特点
(1)面向列式存储的一个分布式的非关系型数据库
(2)Hbase的表模型与关系型数据库不一样。
(3)Hbase的表中没有固定的字段定义
(4)Hbase只支持byte[]类型,不维护其他类型
(5)Hbase的表中会包含rowkey,family(列族,列簇),key(column),value,timestamp(时间戳,版本号)
(6)hbase的存储都是按照key-value对存储的
(7)hbase的不同的列族一定存储在不同的文件中
二、Hbase的体系结构
2.1 表模型
2.1.1 关系型数据库的表模型(扩展)
关系型数据库的表是“面向行式存储”的。参考
2.1.2 Hbase的表模型(存储模型)(重点)
(1)面向列的表模型
(2)数据是以K-V对存储,可以存储成千上百位个KV对,KV对支持多版本(历史),版本号是时间戳
(3)为了区分不同的KEY的意义,引入了列族(列簇,column family)的概念
(4)一个表中可以有多个列族,不同的列族一定存储在不同的文件中,一个列族可能包含多个文件
(5)为了区分kv对是不同事物(不同对象)引入了rowkey的概念,rowkey是唯一的
(6)表数据是存储在region里,region是表的存储单位。region是一整张表或是一整张表的一部分。
(7)region是有rowkey范围的。
(8)数据是先按照rowkey排序,然后按照列族排序,同一个列族中按照key进行排序,字典排序
(9)表模型里只支持byte[]类型。
2.2 体系结构(重点)
参考文档中的图形和“组件说明”,还有“组件关系”
--client:
提供客户端访问的API接口和缓存(存储数据的地址,提高查询效率)
--zookeeper:
监控hmaster和hregionserver
zookeeper存储hbase的一些元数据(寻址入口,meta表的位置)
--hmaster:
管理整个集群的负载均衡(region的分配)
处理schema的更新(namespace,table等的创建,删除,修改)
会有垃圾回收机制
--hregionserver
真正负责region的维护(切分,合并)
负责客户端的访问请求(读,写)
将客户端的访问提前写入hlog文件中
--region:是表或者是表的一部分,是hbase的存储模型
--store:
--memstore: 写缓冲
--storefile(hfile)
三、Hbase的安装
3.1 单机模式
就是在一台机器上,使用本地文件系统存储数据,没有hbase的守护进程,比如hregionserver. 使用的zookeeper是内置的。
3.2 伪分布式模式
3.2.1 简介
--1. 也是布局到一台机器上的,但是相关的守护进程都存在,hmaster有,hregionserver也有。
--2. 数据可以存储到本地文件系统,也可以存储在hdfs上
--3. 使用hdfs时,zookeeper可以使用内置的也可以使用用户自己安装的zookeeper集群
下面安装:hdfs+用户zookeeper集群
3.2.2 步骤
1)上传、解压、更名、配置环境变量
2)修改hbase的环境脚本文件
3)修改hbase的用户自定义文件
4)启动
要先启动hdfs和zookeeper,然后再使用start-hbase.sh启动hbase的守护进程
关闭集群:stop-hbase.sh
- 登录
使用hbase的shell客户端连接hbase.
hbase shell
登出:exit
3.3 完全分布式模式(重点)
3.3.1 简介
hbase的守护进程布局在不同的机器上。每个守护进程都是独立的进程。
布局如下:
qianfeng01: hmaster regionserver
qianfeng02: back-up-master regionserver
qianfeng03: regionserver
3.3.2 配置步骤
1) 上传、解压、更名、配置环境变量
注意:
(1)三个节点的免密登录认证一定要做好
(2)三个节点的时间必须是同步的,时间差不能超过30s。
- 配置hbase-env.sh
配置jdk环境和关闭内置zookeeper
3)配置hbase-site.xml
(1)配置hbase在hdfs上的存储路径
(2)配置用户自定义的zookeeper集群
(3)启用hbase的集群模式
(4)可选参数:hbase.unsafe.stream.capability.enforce (最好配置上)
(5)可选参数:hbase.table.sanity.checks (最好配置上,修改为false)
4)配置regionserver所在的节点文件
[root@qianfeng01 ~]# vim ${HBASE_HOME}/conf/regionservers
qianfeng01
qianfeng02
qianfeng03
5)配置备用的hmaster
[root@qianfeng01 ~]# vim ${HBASE_HOME}/conf/backup-masters
qianfeng02
6)将hdfs的core-site.xml和hdfs-site.xml拷贝到hbase的conf下
[root@qianfeng01 local]# cp /usr/local/hadoop/etc/hadoop/{core-site.xml,hdfs-site.xml} /usr/local/hbase/conf/
7)分发到其他节点上
别忘记分发 /etc/profile
3.3.3 启动
注意:先启动hdfs和zookeeper.然后使用start-hbase.sh再启动hbase集群
关闭:stop-hbase.sh
可以查看webui界面。 mei01:16010
四、Hbase shell(熟悉)
hbase的shell中的命令查看方式:
hbase(main):001:0> help
hbase(main):001:0> help 'command group'
hbase(main):001:0> help 'command'
4.1 hbase的DDL操作
4.1.1 namespace的DDL操作
在hbase中是没有database的概念,而是引入了namespace的概念。hbase的表是存在namespace里的。hbase在安装时,自带两个namespace,分别是default和hbase.
语句参考文档
指令如下:
create_namespace
list_namespace
describe_namespace
alter_namespace: add/modify
drop_namesapce:
list_namespace_tables:
4.1.2 table的DDL操作
语句参考文档
指令如下:
create:
list:
describe|desc
alter :追加列族,修改列族中的属性,删除列族
diable|enable:
drop:
day02—————
一、Hbase shell(续)
1.1 table的CRUD操作
create 'ns1:emp','base_info','extra_info'
指令如下:
--put : 只能一个单元格一个的插入
语法:put '表名','行键','列族:列名','列值',[时间戳]
--scan: 查看整张表的数据
--get : 指定行号进行查看数据
--修改数据:put指令就是修改
--delete:删除数据,但是只能删除一个单元格,当指定某一个版本号删除时,那么这个版本号之前的所有版本都会被删除
--deleteall: 删除指定行的所有单元格,就是删除一行记录
扩展:
disable_all
drop_all
二、Hbase的API
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.2.1</version>
</dependency>
2.1 namespace的DDL
createNamespace()
listNamespace()
listNamespaceTables()
describeNamespace()
alterNamespaceAdd()
alterNamespaceModify()
alterNamespaceRemove()
dropNamespace()
2.2 table的DDL
createTable()
describeTable()
alterTableAppendColumnFamily()
alterTableAppendModifyColumnFamilyProperties()
alterTableDeleteColumnFamily()
listAllTable()
dropTable()
2.3 table的crud
putData()
putBatchData()
getSingleRowData()
getMultipleRowData()
scanData()
deleteCell()
deleteRow()
2.4 Filter
SingleColumnValueFilter
day03—————
一、Hbase的API(续)(重点)
1.1 Filter
-- 为什么要使用过滤器: 没有过滤器的话,hbase只能只能查询整张表,或者是行范围的查询,不能使用其他条件进行筛选过滤。
--1.ColumnValue过滤器
- SingleColumnValueFilter
--2. 结构过滤器
- FilterList
--3. 键值过滤器
- FamilyFilter
- QualifierFilter
- ColumnPrefixFilter
- MultipleColumnPrefixFilter
- ColumnRangeFilter
--4. RowKey过滤器
- RowFilter
--5. Utility过滤器
- FirstKeyOnlyFilter
--6. PageFilter
比较器:如果没有比较器,那么hbase在查询时,只能是进行字段值的全匹配,有了比较器,就可以模糊匹配查询。
RegexStringComparator
SubStringComparator
BinaryPrefixComparator
BinaryComparator
二、Hbase的工作机制(重点)
2.1 Hbase的寻址机制(重点)
2.1.1 说明
寻址机制指的是客户端在进行访问Hbase时,要找到具体访问的region。因为region是一张表或者是一张表的一部分,region有行范围,分别有startrow,endrow。
客户端的访问:
写操作:put 'ns1:emp','rk001000','f2:province','广东'
读操作:get 'ns1:emp','rk001000'
读操作:scan 'ns1:emp'
2.1.2 新版本的寻址机制
指的是0.96版本以后的机制,俗称两层跳转
第一步:客户端要访问zookeeper获取元数据表hbase:meta的位置 (存储在zk的/hbase/meta-region-server节点中)
第二步:通过获取到的地址,访问hbase:meta表, 获取要访问的具体的表的region的位置信息
第三步:通过获取的region位置信息,访问具体regionserver上的region。
2.1.3 旧版本的寻址机制(扩展)
旧版本,为meta表的region存储维护了一个root表。俗称三层跳转。
2.2 Hbase的存储机制(重中之重)
2.2.1 概述
参考文档
2.2.2 flush、major_compact
flush: 冲刷的是memstrore内存,形成文件
major_compact: 当store管理的文件数量达到阈值时,比如3,会进行合并文件。合并文件期间会进行真正的删除、修改等操作
2.3 Hbase的Region管理
region的管理指的就是region的切分,合并。
-- region的切分其实就是文件的切分:当某一个文件达到阈值时,比如10G,那么该文件对应的整个region就会被尽可能的均分。切分成两部分的数据,分别由新的region来管理数据,旧的region下线。
2.4 Hbase的读写流程(重点)
写流程:
参考文档
读流程:
(1) Client通过寻址机制,找到要读取的表的具体的region.
(2) Regionserver的内存分为MemStore和BlockCache两部分,MemStore主要用于写数据,BlockCache主要用于读数据。读请求先到MemStore中查数据,然后在到BlockCache中查,最后再到StoreFile上读,并把读的结果放入BlockCache,所有查询到的结果最终返回给客户端。
三、Hbase与Hive的整合(熟悉)
3.1 hive-to-hbase
建表的时候要指定映射关系,同时指定在hbase中的表名
create table if not exists hive2hbase (
.....
)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties(
"hbase.columns.mapping"=":key,........."
)
tblproperties(
"hbase.table.name"="hbase的表全名"
);
注意:
映射关系中可以不写:key。默认hive的第一个字段作为hbase的rowkey.
映射是通过字段顺序映射的,不是通过名称映射。
3.2 hbase-to-hive
参考文档
四、布隆过滤器的原理(重点)
目的:提高hbase的查询效率,经过布隆过滤器的原理计算,某一个key可能存在这个文件中(不一定真正存在),是要查询这个文件的。或者,这个key一定不再这个文件中,那就没有必要查询这个文件。
原理: 内部维护了一个默认大小是64kB的位数组和多个hashCode函数。初始化阶段时,位数组中都是0.
存储元素时,会分别调用每个hashCode函数,计算出来一个int值,当成位数组的下标,查看对应的位置上是否是0,只要有一个为0,说明该元素还没有存储进来,就可以存储,存储后,对应位置的0全变成1.
查询元素时,也要调用每一个hashCode函数,计算出来一个int值,当成下标,查看对应的位置上是否为1,如果全是1,那么这个元素可能存在集合中,只要有一个不为1,说明不存在集合中
day04—————
一、ROWKEY的设计原则(重点)
1.1 热点问题
当大量的客户端访问请求集中到一个机器或者是某几个机器上,这些机器的性能开销非常大,严重影响了查询性能。这种情况就是数据热点问题。
如何避免数据热点问题???通过设计rowkey的方案将数据散列到不同的region里存储
1.2 rowkey的重要性
-- Hbase的特点之一,就是高性能的读写,因此企业中的数据仓库中应用hbase作为存储软件比较多。
-- hbase的高性能除了体现在维护内存外,还有就是通过rowkey可以避免全表扫描,加快查询效率。
如上需求,rowkey的设计在hbase中非常重要。
因此,在插入某些数据之前,应该先思考未来要经常进行什么条件的查询,比如可能要经常做按照部门,日期,地域性等查询。那么就可以将这些信息维护到rowkey上。
1.3 rowkey的设计原则
1. 唯一性原则
rowkey的设计要满足唯一性,如果不唯一,可能会出现单元格的覆盖,比如张三有自己的rowkey,另外一个人的rowk与张三相同,那么另外一个人的数据可能就会把张三的数据覆盖掉
2. 长度统一原则
hbase中的表的rowkey的长度应该统一。如果不统一,可能会出现在查询时,数据包含了我们不想要的数据。
下面举例说明:
-- 假如现在有5个Rowkey,分别是:"012", "0", "123", "234", "3","0555"。 排序后是如下顺序:
"0"
"012"
"0555"
"123"
"234"
"3"
需求如果是查询rowkey从0到123,想要的3没有被查询出来,"0555"却被查询出来
如果统一,这五个rowkey设置统一4个长度,应该如下:
"0000"
"0003"
"0012"
"0123"
"0234"
"0555"
建议:rowkey的长度是8字节的整数倍,比如16字节,最好在10~100字节之间,不过,在满足记录数的前提下,越短越好
3. 散列原则:(为了避免热点问题)
假如普通的rowkey 如下
region: 1231450 1231450-xxxxx
1231456
1231457
1231458
1231459
当大量访问1231450以后的数据,可能会出现热点问题,都访问这一个region.
方法1:reverse反转
将普通rowkey反转后当成新的rowkey
6541321
7541321
8541321
9541321
上述设计,就可以将本来应该存储到一个reigon里的数据散列到不同的region里。避免了热点问题
方法2:salting(加盐): 为普通rowkey 加前缀,比如增加1个字符,或者是相同长度的n个字符。
aaaa-1231458
afge-1231456
ffab-1231459
gefa-1231457
缺点明显:由于前缀是随机的,因此某一个普通rowkey到底存入到哪一个region中不可控。
(,a],[a,b),[b,c),[c,)
方法3:hash算法或者是纯数字的mod
为了弥补加盐的缺陷。可以使用固定算法,比如hashcode,md5等,算出普通字段的对应的值,然后取出前几位作为前缀添加到普通rowkey前。这个好处是可以提前推断我们要查询的数据是不是在一个region中。
纯数字的普通rowkey,可以使用取模的的值作为前缀添加到rowkey上。
1.4 案例演示:多条件的rowkey设计:
1. 需要知道数据是什么 ,参考文档
2. 需要知道要经常查询的操作,定义方法
find(long starttime,long endtime,string filename,string type,int userid)
3. 设计rowkey
rowkey的形式如下:userid+createtime+fileid
注意:userid要统一长度,fileid要统一长度
userid在前面可以立即限定查询的用户,rowkey的范围作了第一次限定
createtime,又一次缩小了行的范围
fileid,为了区分不同的文件
4. 编写方法的具体逻辑
find(long starttime,long endtime,string filename,string type,int userid){
//可以使用scan来限定行范围,rowkey中包含了time,userid
//使用过滤器和比较器来限定filename,type
}
5. 某一次查询的需求
-1. 文件创建时间区间 (比如从20120901到20120914期间创建的文件)
-2. 文件名(“中国好声音”),
-3. 分类(“综艺”),
-4. 所有者(“浙江卫视”)。
4. 编写方法的具体逻辑
find(long starttime,long endtime,string filename,string type,int userid){
scan.startrow("00000120120901");
scan.endrow("00000120120914");
SingleColumnValueFilter(,,,"中国好声音")
SingleColumnValueFilter(,,,"综艺")
}
二、Hbase的二级索引(熟悉)
rk00001 filename:中国好声音第一期, time:
rk00002 filename:中国花絮 time: userid:
rk00003 filename:中国好声音第二期 time: userid:
....
rk01001 filename:中国声音第三期
另外一张表:
“中国好声音” filename1: rk00001
filename2: rk00003
filename3: rk01001
“中国花絮” filename1: rk00002
....
..............
需求: 查询filename是中国好声音的所有行的time单元格的数据
如果维护了第二章表:
可以现在第二张表中查询rowkey是中国好声音的所有单元格(单元格中维护的是第一张表的有中国好声音的单元格的所有的rowkey)
再使用获取的rowkey去第一张表中,按照rowkey查询指定行中是否有time单元,如果有就返回
什么是二级索引表?
就是在表B中维护另一张表A中的列值与rowkey的映射关系。 在按照指定列查询表A时,先去表B中查询对应的rowkey,然后再返回表A中,通过rowkey查询其他指定字段。表B就是二级索引表,用空间换取时间。
三、Hbase的协处理器(重点)
3.1 协处理器的引入
hbase在低版本时,是很难轻易建立二级索引表、实现求和、记数、排序等操作的。所以在高版本中引入了协处理器的技术,来实现上述需求。
3.2 协处理器的分类
分两大类:
1、observer
- 细分子类型
(1)RegionObserver
(2)RegionServerObserver
(3)WALObserver
(4)MasterOberver
- 类似于 RDBMS 中的触发器,主要在服务端工作
- 可以实现权限管理、优先级设置、监控、ddl 控制、二级索引等功能
2、endpoint
- 类似于 RDBMS 中的存储过程,主要在服务端工作
- 可以实现 min、max、avg、sum、distinct、group by 等功能
3.3 协处理器的应用:二级索引表的创建
1. 关注表
create 'guanzhu','f1'
rowkey: 用户名-明星名
column1: from:用户名
to:明星名
2. 粉丝表
create 'fensi','f1'
rowkey: to-明星名
s001:粉丝名
需求:当关注表添加一条记录时,那么粉丝表对应的数据应该自动添加一条信息
3. 自定义一个类型,继承BaseRegionObserver类型,重写prePut()方法
4. 写好程序,打包,上传到hdfs上
5. 将协处理器挂载到关注表中
alter 'hello',METHOD => 'table_att','coprocessor'=>'hdfs://mei01/jar/my.jar|com.qf.hbase.coprocessor.FensiObserver1|1001|'
6. 可以使用API向关注表中添加数据
7. 查看粉丝表的数据
协处理器的加载方式:
1. 静态加载: 在hbase-site.xml文件配置协处理器,全局效果,也就是所有的region都会执行该处理器
2. 动态加载: 在hbase shell中为某一个表添加。
注意:卸载时,应该先禁用表,然后执行卸载语句。
动态加载时,最好也先禁用表,在执行加载语句
四、Hbase的优化参数(熟悉)
参考文档
总结:
1 hbase的概念
2.hbase的表模型(重点)
3.hbase的体系结构(重点)
4.hbase的安装
5.hbase的shell操作(熟悉)
6.hbase的api(重点)
7.hbase的工作机制(重点)
- 寻址机制
- 存储机制
- 读写流程
8.布隆过滤器的原理(重点)
9.rowkey设计原则(重点)
10.二级索引表的概念
11.协处理器(重点)
12.优化参数