一:HBase简介
(一)HBase了解(实现对大<普通PC集群、十亿行,百万列>数据随机、实时存取操作)
前提:
基于Hdfs的查询由于其存储机制的限制,导致查询速度响应缓慢,无法解决一些对速度有要求的场景;
传统数据库虽然查询快,但是无法支撑海量数据。因此就出现了HBase这种"数据库"。
HBase是一个高可靠、高性能、面向列、可伸缩的分布式数据库,是建立在hdfs之上,被设计用来提供高可靠性,高性能、列存储、可伸缩、多版本,的Nosql的分布式数据存储系统(相对于文件系统查询等操作效率更高,实时性更高),实现对大型数据的实时,随机的读写请求。更是弥补了hive不能低延迟、以及行级别的增删改的缺点。
HBASE依赖于hdfs做底层的数据存储
HBASE依赖于MapReduce做数据计算
HBASE依赖于zookeeper做服务协调
HBase基于Hdfs作为默认推荐的存储引擎,采用基于kv结构的存储方式,内部基于LSM算法进行数据排序,可以支持基于rowkey的快速检索,但是不适合复杂的数据分析,比如join,group等。
另外:相对于其他关系型数据库《优点:主要用于处理复杂的表与表之间关系,进行各自关联查询》,而HBase不提供表与表之间的关联查询(对于关系的处理很弱---也用不到分表),只进行简单的查询数据,几乎没有事务特性
二:HBase逻辑架构
(一)传统数据库结构
传统的数据库需要事先定义数据表的结构,并指定数据的类型,一旦创建就不能改变,修改的代价比较高。
而HBase则是采用kv的存储方式,按照列族把不同的数据组织在一起。
(二)HBase数据库结构
要查询某一个具体字段的值,需要指定坐标:表名--->行键--->列族(ColumnFamily):列名(Qualifier)--->版本
三:HBase数据组织形式(大到小)
namespace:命名空间
一般就是逻辑上用于表的区分,类似数据库中的database。在最终物理文件存储的时候,会根据namespace切分目录。
table:表
类似于数据库中的table
column family:列族
相同列族的列会存放在一起。
row:行
由基于字符串的rowkey唯一指定,rowkey全局不能重复,按照字典序顺序存储,rowkey的设计对最终的查询起到关键性作用。
column:列
用于存放字段的数据内容。
version:版本
如果数据存在多个版本,那么每个时间戳(版本)会对应一个数据。
四:物理架构
HBase底层基于hdfs构建,因此最终数据都存储于hdfs中。整个HBase有三种核心角色:
Master:负责节点的管理
RegionServer:负责数据的读写
Client:维护连接池,缓存元数据
另外Zookeeper是一个不可缺少的角色,查询或者写入都依赖于zk,因为zk中存储了元数据位置的相关信息。
因此可以看到,HBase中的Master其实是一个相对弱化的Master。
五:HBase核心组件RegionServer
HBase中核心的组件就是这个RegionServer,它是由WAL和Region组成。
WAL是一种顺序写入的日志,全称是write ahead log,主要用于备份数据,当机器宕机后内存中的数据丢失,可以通过预写日志进行恢复。
Region是主要的存储结构,一个Region就代表一个数据分片,HBase默认提供了很多分片的机制,也可以在创建表时自定义分片。
Region内部由多个Store组成,每个Store代表一个列族,查询的时候也是每个Store单独进行查询。
Store由memstore和Hfile组成,一般一个列族对应一个Store。新的数据写入时,会先记录在WAL中,然后存储在内存中的memstore。
当数据量到达一定的阈值时,memstore中的数据会形成HFile写入hdfs。读数据的时候,会从memstore以及Hfile中读取。
六:HBase寻址过程
HBase采用三级寻址方式(不会再多级了,因为每级寻址范围够大),并且客户端不会每次都从头查询数据位置,会在客户端建立缓存,提高查询效率(因为空间、时间就近,极有可能 重复查询该数据或者数据附件数据)
七:HBase体系架构
Client
包含访问HBase的接口并维护cache来加快对HBase的访问
Zookeeper
保证任何时候,集群中只有一个master
存贮所有Region的寻址入口。
实时监控Region server的上线和下线信息。并实时通知Master
存储HBase的schema和table元数据
Master
为Region server分配region
负责Region server的负载均衡
发现失效的Region server并重新分配其上的region
管理用户对table的增删改操作
RegionServer
Region server维护region,处理对这些region的IO请求
Region server负责切分在运行过程中变得过大的region
HLog(WAL log)---存放最新最新数据和操作(小文件)
– HLog文件就是一个普通的Hadoop Sequence File,Sequence File 的Key是 HLogKey对象,HLogKey中记录了写入数据的归属信息,
除了table和 region名字外,同时还包括sequence number和timestamp,timestamp是” 写入时间”,sequence number的起始值为0,
或者是最近一次存入文件系 统中sequence number。
– HLog SequeceFile的Value是HBase的KeyValue对象,即对应HFile中的 KeyValue
Region
– HBase自动把表水平划分成多个区域(region),每个region会保存一个表 里面某段连续的数据;每个表一开始只有一个region,随着数据不断插 入表,
region不断增大,当增大到一个阀值的时候,region就会等分会 两个新的region(裂变);
– 当table中的行不断增多,就会有越来越多的region。这样一张完整的表 被保存在多个Regionserver上。
Memstore 与 storefile
– 一个region由多个store组成,一个store对应一个CF(列族)
– store包括位于内存中的memstore和位于磁盘的storefile写操作先写入 memstore,当memstore中的数据达到某个阈值,
hregionserver会启动 flashcache进程写入storefile,每次写入形成单独的一个storefile
– 当storefile文件的数量增长到一定阈值后,系统会进行合并(minor、 major compaction),在合并过程中会进行版本合并和删除工作 (majar),
形成更大的storefile。
– 当一个region所有storefile的大小和超过一定阈值后,会把当前的region 分割为两个,并由hmaster分配到相应的regionserver服务器,实现负载均衡。
– 客户端检索数据,先在memstore找,找不到再找storefile (会将搜索的最多的数据存放在memstore中,而不用去读取storefile)
– HRegion是HBase中分布式存储和负载均衡的最小单元。最小单元就表 示不同的HRegion可以分布在不同的HRegion server上。
– HRegion由一个或者多个Store组成,每个store保存一个columns family。
– 每个Strore又由一个memStore和0至多个StoreFile组成。
如图:StoreFile 以HFile格式保存在HDFS上。
八:应用场景
从上面的架构可以看出HBase适合海量数据、基于列的存储,并且列比较稀疏的场景。典型的应用场景有:
1 用户画像
用户画像在精准营销、个性化推荐等场景都有很重要的意义。因此每个用户是一个rowkey,不同的用户所拥有的画像标签不一样,可以用不同的column来表示。在精准营销的场景,则可以根据营销的粒度(如店铺),在用户Id前面拼接店铺id,查询的时候可以通过指定开始和结束的范围,实现快速查询。
2 用户行为
如果要分析单个用户的行为,则可以通过设计某个字段最大版本数,存储用户的各种行为数据。当需要分析时,可以搭配Impala或者presto(需要自定义数据源),基于rowkey快速抓取用户行为链路,进行分析。
九:安装HBase
(一)确保zk集群安装完毕
(二)要把hadoop的hdfs-site.xml和core-site.xml 放到hbase/conf下
(三)修改hbase-env.sh环境配置文件
export JAVA_HOME=/home/hadoop/App/jdk1.8.0_241 //告诉hbase使用外部的zk export HBASE_MANAGES_ZK=false
(四)修改hbase-site.xml配置文件
<configuration> <!-- 指定hbase在HDFS上存储的路径 --> <property> <name>hbase.rootdir</name> <value>hdfs://ns1/hbase</value> //无法解析,所以需要我们拷贝Hadoop下的两个配置文件 </property> <!-- 指定hbase是分布式的 --> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <!-- 指定zk的地址,多个用“,”分割 --> <property> <name>hbase.zookeeper.quorum</name> <value>hadoopH5:2181,hadoopH6:2181,hadoopH7:2181</value> </property> </configuration>
(五)配置regionservers节点信息,修改regionservers文件
hadoopH5
hadoopH6
hadoopH7
(六)拷贝文件到其他节点(可以删除文档目录再传)
hadoopH3本地上传到hadoopH4、H5、H6、H7。使用scp命令进行
(七)HBase启动测试
会自动在启动节点中设置Master
注意在hadoopH4中也启动一个master用于设置高可用
./hbase-daemon.sh start master
web页面访问:
通过kill一个master可以测试另一个的使用,实现HA: