天天看点

Hbase的概念和应用

hbase的基本简介:hbase依赖于hdfs,hbase是一个nosql数据库,是一个非关系型的数据库。支持读写查询操作等等

hbase当中所有的数据都是byte[]

HBase中的表一般有这样的特点:

² 大:一个表可以有上十亿行,上百万列

² 面向列:面向列(族)的存储和权限控制,列(族)独立检索。

² 稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。

hdfs对随机读写不是支持的太良好,

hbase是一个数据库,支持随机读写。

hbase是基于hdfs的,hbase的数据都是存储在hdfs上面的。hbase支持随机读写,hbase的数据存储在hdfs上面的,hbase是如何基于hdfs的数据做到随机读写的??

hbase的简要特征

1**)海量存储**

Hbase适合存储PB级别的海量数据,在PB级别的数据以及采用廉价PC存储的情况下,能在几十到百毫秒内返回数据。这与Hbase的极易扩展性息息相关。正式因为Hbase良好的扩展性,才为海量数据的存储提供了便利。

2**)列式存储**

这里的列式存储其实说的是列族存储,Hbase是根据列族来存储数据的。列族下面可以有非常多的列,列族在创建表的时候就必须指定。

3**)极易扩展**

Hbase的扩展性主要体现在两个方面,一个是基于上层处理能力(RegionServer)的扩展,一个是基于存储的扩展(HDFS)。

通过横向添加RegionSever的机器,进行水平扩展,提升Hbase上层的处理能力,提升Hbsae服务更多Region的能力。

备注:RegionServer的作用是管理region、承接业务的访问,这个后面会详细的介绍通过横向添加Datanode的机器,进行存储层扩容,提升Hbase的数据存储能力和提升后端存储的读写能力。

4**)高并发**

由于目前大部分使用Hbase的架构,都是采用的廉价PC,因此单个IO的延迟其实并不小,一般在几十到上百ms之间。这里说的高并发,主要是在并发的情况下,Hbase的单个IO延迟下降并不多。能获得高并发、低延迟的服务。

5**)稀疏**

稀疏主要是针对Hbase列的灵活性,在列族中,你可以指定任意多的列,在列数据为空的情况下,是不会占用存储空间的。

HBase的数据存储架构:

主节点:HMaster

监控regionServer的健康状态

处理regionServer的故障转移

处理元数据变更

处理region的分配或者移除

空闲时间做数据的负载均衡
           

从节点:HRegionServer

负责存储HBase的实际数据

处理分配给他的region

刷新缓存的数据到HDFS上面去

维护HLog

执行数据的压缩

负责处理region的分片
           

一个HRegionServer = 1个HLog + 很多个region

1个region = 很多个store模块

1个store模块 = 1个memoryStore + 很多个storeFile

HLog:hbase当中预写日志模块,write ahead log

HBase的表模型

rowKey:行键,每一条数据都是使用行键来进行唯一标识的

columnFamily:列族。列族下面可以有很多列

column:列的概念。每一个列都必须归属于某一个列族

timestamp:时间戳,每条数据都会有时间戳的概念

versionNum:版本号,每条数据都会有版本号,每次数据变化,版本号都会进行更新

创建一张HBase表最少需要两个条件:表名 + 列族名

注意:rowkey是我们在插入数据的时候自己指定的,列名 也是在我们插入数据的时候动态指定的,时间戳是插入数据的时候,系统自动帮我们生成的,versionNum是系统自动维护的

hbase当中数据的查询:

第一种查询方式: get rowkey 直接获取某一条数据

第二种查询方式 : scan startRow stopRow 范围值扫描

第三种查询方式:scan tableName 全表扫描

总结:HBase是一个nosql数据库,支持增删改查的操作,重点是查询操作。更新与添加操作是一样的

元数据信息
ROW                             COLUMN+CELL                                                                              
 hbase:namespace                column=table:state, timestamp=1558938984497, value=\x08\x00                              
 hbase:namespace,,1558938982489 column=info:regioninfo, timestamp=1559005133554, value={ENCODED => d042e71dc1c25676200cbe
 .d042e71dc1c25676200cbec8fb762 c8fb762263, NAME => 'hbase:namespace,,1558938982489.d042e71dc1c25676200cbec8fb762263.', S
 263.                           TARTKEY => '', ENDKEY => ''}                                                             
 hbase:namespace,,1558938982489 column=info:seqnumDuringOpen, timestamp=1559005133554, value=\x00\x00\x00\x00\x00\x00\x00
 .d042e71dc1c25676200cbec8fb762 \x07                                                                                     
 263.                                                                                                                    
 hbase:namespace,,1558938982489 column=info:server, timestamp=1559005133554, value=node03:16020                          
 .d042e71dc1c25676200cbec8fb762                                                                                          
 263.                                                                                                                    
 hbase:namespace,,1558938982489 column=info:serverstartcode, timestamp=1559005133554, value=1559005110816                
 .d042e71dc1c25676200cbec8fb762                                                                                          
 263.                                                                                                                    
 hbase:namespace,,1558938982489 column=info:sn, timestamp=1559005132098, value=node03,16020,1559005110816                
 .d042e71dc1c25676200cbec8fb762                                                                                          
 263.                                                                                                                    
 hbase:namespace,,1558938982489 column=info:state, timestamp=1559005133554, value=OPEN                                   
 .d042e71dc1c25676200cbec8fb762                                                                                          
 263.                                                                                                                    
 myuser                         column=table:state, timestamp=1558954806615, value=\x08\x00                              
 myuser,,1558954806023.bece64ca column=info:regioninfo, timestamp=1559005133924, value={ENCODED => bece64ca523746f8ab334e
 523746f8ab334ee9f0b8c0af.      e9f0b8c0af, NAME => 'myuser,,1558954806023.bece64ca523746f8ab334ee9f0b8c0af.', STARTKEY =
                                > '', ENDKEY => ''}                                                                      
 myuser,,1558954806023.bece64ca column=info:seqnumDuringOpen, timestamp=1559005133924, value=\x00\x00\x00\x00\x00\x00\x00
 523746f8ab334ee9f0b8c0af.      \x07                                                                                     
 myuser,,1558954806023.bece64ca column=info:server, timestamp=1559005133924, value=node02:16020                          
 523746f8ab334ee9f0b8c0af.                                                                                               
 myuser,,1558954806023.bece64ca column=info:serverstartcode, timestamp=1559005133924, value=1559005111092                
 523746f8ab334ee9f0b8c0af.                                                                                               
 myuser,,1558954806023.bece64ca column=info:sn, timestamp=1559005133018, value=node02,16020,1559005111092                
 523746f8ab334ee9f0b8c0af.                                                                                               
 myuser,,1558954806023.bece64ca column=info:state, timestamp=1559005133924, value=OPEN                                   
 523746f8ab334ee9f0b8c0af.                                                                                               
 user                           column=table:state, timestamp=1558949032333, value=\x08\x00                              
 user,,1558946603100.7d0f1aebaa column=info:regioninfo, timestamp=1559005133566, value={ENCODED => 7d0f1aebaa8569c0a4532e
 8569c0a4532e6f1926b1d3.        6f1926b1d3, NAME => 'user,,1558946603100.7d0f1aebaa8569c0a4532e6f1926b1d3.', STARTKEY => 
                                '', ENDKEY => ''}                                                                        
 user,,1558946603100.7d0f1aebaa column=info:seqnumDuringOpen, timestamp=1559005133566, value=\x00\x00\x00\x00\x00\x00\x00
 8569c0a4532e6f1926b1d3.        \x1A                                                                                     
 user,,1558946603100.7d0f1aebaa column=info:server, timestamp=1559005133566, value=node03:16020                          
 8569c0a4532e6f1926b1d3.                                                                                                 
 user,,1558946603100.7d0f1aebaa column=info:serverstartcode, timestamp=1559005133566, value=1559005110816                
 8569c0a4532e6f1926b1d3.                                                                                                 
 user,,1558946603100.7d0f1aebaa column=info:sn, timestamp=1559005133015, value=node03,16020,1559005110816                
 8569c0a4532e6f1926b1d3.                                                                                                 
 user,,1558946603100.7d0f1aebaa column=info:state, timestamp=1559005133566, value=OPEN                                   
 8569c0a4532e6f1926b1d3.                                                                                                 
6 row(s)
           

HMaster记录了有哪些可用的region可以被分配,还记录了region分配给了哪些region server

HBase与mr的整合

mr的程序里面,使用了hbase的jar包,我们可以使用打包插件,将hbase的jar包都打包到mr的程序里面去

添加hbase的jar包到Hadoop的classpath路径下面去

export HADOOP_HOME=/export/servers/hadoop-2.7.5/
export HBASE_HOME=/export/servers/hbase-2.0.0/
export HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase mapredcp`
yarn jar original-hbaseStudy-1.0-SNAPSHOT.jar  cn.itcast.hbasemr.HbaseMR
           

总结:如果读取hbase里面的数据 mapper类需要继承TableMapper

如果需要读取hdfs上面的文本文件数据,mapper类需要继承Mapper

如果要将reduce程序处理完的数据,保存到hbase里面去,reduce类,一定要继承TableReducer

hive与hbase总结

hive:擅长做数据分析工作

hbase:擅长做数据实时查询的工作

需求一:将hive分析结果数据,保存到hbase里面去

insert overwrite table user2 select * from user ;

create table course.hbase_score(id int,cname string,score int)  
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'    -- 指定数据存储到哪里去
with serdeproperties("hbase.columns.mapping" = "cf:name,cf:score")  --指定数据的映射字段
tblproperties("hbase.table.name" = "hbase_score");  -- 配置hbase表名
           

score表字段

score.id        score.cname     score.score
           

需求二:hbase当中已经存在了一张表,并且有了一些数据,对hbase当中存在的数据进行分析,使用hive映射hbase当中表数据,然后对hbase表数据进行分析

CREATE external TABLE course.hbase2hive(id int, name string, score int) 
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' 
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf:name,cf:score") TBLPROPERTIES("hbase.table.name" ="hbase_hive_score");
           

HBase的预分区:

可以在创建表的时候提前定义分区的规则,然后将对应的数据,落到对应的region里面去,实现数据的均匀负载。

hbase的rowkey设计技巧

1:rowkey不宜过长

2:rowkey均匀的散列。将数据均匀的落到不同的region里面去,避免所有的数据都落第到一个region里面去了,造成数据热点问题。在rowkey高几位,随机生成一些数字,实现均匀的负载

避免rowkey的热点问题:

加盐:在rowkey高几位随机生成一些字符串

hash取值:对rowkey进行取hashcode

反转:对rowkey进行反转 三大运营商查询流量,以及话费

时间戳反转:

查询条件:手机号码 业务类型 查询时间

13391508372

rowkey:手机号反转27380519331:业务类型:时间戳

HBase的协处理器

hbase当中不支持 sql语法

总结:协处理器分为两大类,

observer:可以对数据进行前置或者后置拦截

endpoint:可以用来求最大值,最小值,平均值

HBase的二级索引

一级索引:按照rowkey进行查询

get

scan startRow stopRow

scan 全表

复杂的查询条件:

select name ,count(1) from user where age >30 group by name

二级索引:使用空间换取时间的概念

hue的概念

通过一个框架,hue与其他的框架进行整合,然后我们就可以通过hue来操作所有其他的框架

hue的架构:

UI:操作管理界面

hueServer:服务端,为UI提供各种服务

hueDB:数据库,可以保存各种任务

一句话总结:Hue是一个友好的界面集成框架,可以集成我们各种学习过的以及将要学习的框架,一个界面就可以做到查看以及执行所有的框架

继续阅读