概述
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的概念和应用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复