我是靠谱客的博主 受伤太阳,最近开发中收集的这篇文章主要介绍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=x08x00
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=x00x00x00x00x00x00x00
.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=x08x00
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=x00x00x00x00x00x00x00
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=x08x00
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=x00x00x00x00x00x00x00
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是一个友好的界面集成框架,可以集成我们各种学习过的以及将要学习的框架,一个界面就可以做到查看以及执行所有的框架

最后

以上就是受伤太阳为你收集整理的Hbase的概念和应用的全部内容,希望文章能够帮你解决Hbase的概念和应用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部