HBase(基于HDFS)的介绍及安装

时间:2024-02-22 08:10:06

一: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: