【NoSql】之Hbase

Hbase概述

·  Hbase是构建在hdfs上的分布式列式存储系统算法

·  Hbase内部管理的文件所有存储在HDFS上面,sql

·  Hbase是基于google bigtable 模型开发的,典型的noSql-KeyValue数据库;数据库

·  Hbase是hadoop生态系统中的重要一员,主要用于海量结构化数据的存储;apache

·  从逻辑上讲,Hbase将数据按照表,行和列进行存储安全

·  与hadoop同样,Hbase目标主要依靠横向扩展,经过不断的增长廉价的商服务器

用服务器来增长计算能力和存储能力。架构

Hbase表的特色

·  大:一个表能够有数十亿,上百万列;并发

·  无模式:每行都有一个可排序的主键和任意多的列,列能够根据需求动态的增长,同一张表中不一样的行包括了不一样的列app

·  面向列:面向列(族)的存储和权限控制,列(族)独立检索负载均衡

·  稀疏:空(null并不占有存储空间)表能够设计的很是稀疏

·  数据多版本:每一个单元中的数据能够有多个版本,默认状况下,版本好自动

分配,是单元格插入的时间戳

·  数据类型单一:Hbase中的数据都是字符串.没有其余类型

HBase的数据模型

·  Hbase的逻辑视图

          

 

·  Hbase的基本概念

 RowKey:是byte array 是表中每条记录的主键,方便快速查找,rowkey的设计很是重要。

 Columns Family:列族,拥有一个名称String,包含一个或多个相关列

 Column :属于某一个ColumnsFamily familyName:columnname 每条记录动态添加

 VersionNumber :类型为long ,默认值是系统时间戳,可由用户自定义

 Value(cell)byte array

 

 

·  Hbase的物理模型

每一个colums family存储在HDFS上的一个单独文件中,空值不被保存

Key和version number 在每一个column family 中均有一份

Hbase为每一个值维护了多级索引

    <key,column family,column name ,timastamp>

 

·  Hbase的物理存储

Table中全部的行都按照rowkey的字典顺序排序

Table 在行的方向上被分为多个Region

Region 按大小分割的.每一个表开始只有一个Region 随着数据的增多,Region不断增大,当增大到一个阀值的时候,Region就会等分红两个新的Region,以后会愈来愈多的Region

Region是Hbase中分布式存储和负载均衡的最小单元,不一样Region被分配到不一样的RegionServer上。

     

Region虽然是分布式存储的最小单元,但并非存储的最小单元。Region由多个Store组成,每一个store保存着一个columns family ;每一个Store又由一个memStore和多个0个或多个StoreFile组成,StoreFile 包含HFile; memStore存储在内存中,StoreFile存储在HDFS上

  

·  Hbase的架构及基本组件

    

 

 基本组件说明

  • Client

包含访问Hbase的接口,并维护cache来加快hbase的访问 好比Region的位置信息

  • Master

RegionServer 分配Region

负责RegionServer的负载均衡

发现失效的RegionServer并从新分配其上的Region

管理用户对table的增删改查

  • RegionServer

RegionServer 维护Region 处理对这些Region的IO请求

RegionServer 负责切分在运行过程当中变大的Region

  • Zookeeper

经过选举,保证任什么时候候,集群当中只有一个Master.Master与RegionServer启动的时候会向Zookeeper注册

存储全部的Region的地址

实时监控RegionServer的上线和下线的信息。并适时通知给Master

存储着Hbase的schema和table元数据

默认状况下,Hbase管理Zookeeper实例,好比,启动或者中止Zookeeper

Zookeeper 的引入使得Master再也不是单点故障

 

  Hbase的容错与恢复机制

从架构中咱们能够发现,每个RegionServer中有一个HLog文件, 在每次用户操做写入MemStore的同时,也会先向Hlog中写一份,Hlog文件会按期更新,并删除旧的文件(已经持久化到StoreFile中的数据)。当RegionServer宕机之后,Master会经过Zookeeper感知到,Master首先会处理遗留的Hlog文件,将其不一样的Region的log数据进行拆分,分别放到相应的Region目录上,而后再将失效的Region从新分配到其余RegionServers上,RegionServer在load Region过程当中,会发现有历史Hlog须要处理,所以会replay Hlog中的数据到MemStore中而后flush进StoreFile中 完成数据的恢复

 

 Hbase的容错性

  • Master容错:zookeeper 从新选举一个Master
  • RegionServer容错:定时向Zookeeper汇报心跳,若是一旦时间内未进行心跳,Master将该RegionServer上的Region从新分配到RegionServer上,失效服务器上 预写 hlog有Master分割并发送给其余的RegionServer上
  • Zookeeper容错:Zookeeper是一个可靠的服务,通常配置3个或5个Zookeeper实例

 

Hbase的读写都要先通过先肯定RegionServer的地址

过程大概以下:客户端先向ZK请求目标数据的地址

ZK保存了-ROOT-表的location,客户端根据location找到.META.表 其中包含了全部的用户空间Region列表,以及RegionSever地址,根据请求参数去表中查找,而后获得一个regionInfo列的数据  RegionServer

客户端根据RegionServer地址而后开始进行数据读和写

 

读:客户端发出读请求,客户端根据用户提供的表名,行键去客户端里的缓冲区进行查找,若是没有,就去Zookeeper进行查询,经过上面过程找到RegionServer地址和regioninfo信息,而后与RegionServer创建链接,将regioninfo列的数据提交给Regionserver

    RegionServer接收到客户端的请求,而后建立一个RegionScanner对象,经过该对象定位到Region,而后Region建立StoreScanner,经过StoreScanner对定位到Store,Store建立一个MemStoreScanner对象,这个对象负责去MemStore中有没有数据,有就返回,没有就建立多个StoreFIleScanner对象,每一个对象,负责去不一样的HFile中查询数据。若是找到返回,找不到返回null

 

写:客户端发出写的请求,

当客户端进行put操做时,数据会自动保存到HRegion上,在HRegionServer中,找到对应要写入的HRegion以后,数据会写入到HLog中并同时写入到HStore的MemStore内存中,会在内存中按照行键对数据进行排序,当内存中的数据达到必定阈值后,会触发flush操做。Flush操做主要就是把MemStore内存中的数据写入到StoreFile中,当HDFS中的StoreFile个数达到必定的阈值后,会触发compact(合并)操做,将HDFS中全部的StoreFile合并成一个新的SotreFile,在合并的时候会按照行键进行排序,而且会进行版本合并和数据删除。当StoreFile经过不断的合并操做后,StoreFile文件会变得愈来愈大,当这个StoreFile达到必定的阈值后,会触发Split(切分)操做,同时把当前region拆分红两个新的region,原有的region会下线,新的两个region会被HMaster分配到相应的HRegionServer上,使得原来一个Region的压力得以分流到两个Region上,其实,HBase只是增长数据,更新和删除操做都是compact阶段作的,因此,客户端写入成功的标志是HLog和MemStore中都有数据。

先写HLog,可是若是显示MemSotre也是没问题的,由于MemStore的MVCC(多版本并发控制)不会向前滚动,这些变化在更新MVCC以前,Scan是没法看到的,因此在写入HLog以前,即便MemStore有数据,客户端也查询不到。

 

 

HBase的使用场景

  • 大数据两存储.大数据两高并发操做
  • 须要对数据随机读写操做
  • 读写访问都是很是简单的操做

HBase的优化

1.RowKey的设计

Hbase是经过RowKey进行检索的,系统经过找到某个RowKey(或者某个RowKey范围)所在的Region。而后将查询数据的请求由该Region获取数据 Hbase支持3中检索方式

A)经过单个Rowkey访问,按照某个RowKey键值进行get操做获取惟一一条记录

B)经过RowKey的range进行scan即经过设置startRowkey和endRowKey,能够按指定的条件获取一批记录

C)全表扫描,即直接扫描整张表中全部行的数

设计原则:

·长度原则:不要超过16个字节

缘由:若是rowKey长度过长,会极大影响HFile的存储效率

Memstore将缓冲的部分数据加载到内存,若是rowKey过长,内存的有效利用率会下降,从而下降检索效率

·惟一原则:保证惟一性

·散列原则:项目中的设计,由于咱们的查找数据的时候,是按照时间戳进行查找的,因此时间戳应该是rowkey的一部分,把rowkey的低位放时间字段,

高位是用CRC32算法将eventName+uuid+memberid压缩保证惟一性

 

HBase和Hive的整合

整合的原理:

Hive和hbase的整合的实现是利用二者自己对外的API接口互相进行通讯,主要是依靠hive/lib下的hive-hbase-handler-0.9.0.jar 他负责通讯

整合的好处:

Hive方便的提供了Hql类sql语句接口来简化mapreduce的使用,而Hbase提供了低延迟的数据库访问。二者相结合就能够用mapreduce来对hbase中的数据进行离线的计算和分析

缺点:性能的损失

1.建立一个指向Hbase的hive表

create external table event_logs(

row string,

pl string,

en string,

s_time string,

p_url string,

u_ud string,

u_sd string)

row format serde 'org.apache.hadoop.hive.hbase.HBaseSerDe'

 stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'

 With serdeproperties('hbase.columns.mapping'=':key,info:pl,info:en,info:s_time,info:p_url,

info:u_ud,info:u_sd')

tblproperties('hbase.table.name'='event_logs');

**** 为了数据的安全,将表建立成外部表,防止删除表的时候将hbase表中的数据删除

2.添加数据的时候只能用insert....select....

3.两端的数据是同步的

4.Hive多列和hbase的多列出了行键和hive第一个字段不对应外,一一对应

5.Hive就是读取hbase的数据

 

HBase的过滤器

  

相关文章
相关标签/搜索