Hbase
前言:说到Hbase个人理解就是一个新类型的数据库,和传统数据库有很大的区别,但是也离不开传统数据库的存储模式。处理数据量很大,
实时性,hbase可以说只有两个字段,rowkey和column family(列族),当然这是简单的说法。下面的图片是hbase的架构图可以说明在hadoop
中充当的角色。
以下总结一下hbase的内容
Hbase
hbase是数据库
特点
高可靠性
高性能
面向列
可伸缩
实时读写
数据量
十亿级别的行
百万级别的列
速度快的原因
充分利用内存
使用了LSM树
缓存机制
文件是顺序读
数据模型
rowkey
相当于MySQL中的主键,唯一标识一行记录
rowkeys是字典序
rowkey的长度最长是64k,但是一般推荐10-100字节
column family
一组列的集合
列族必须作为表的schema定义给出
列族是权限,存储的最小单元
qulifier
列
可以动态的,随机的插入
表定义之后没有限制列,随着值的插入也把列插入
列必须归属于某一个列族
timestamp
时间戳,64为整数,精度是毫秒
起版本号的作用,一个Cell中可以存在多版本的数据
时间戳可以自己定义,但是一般不推荐
cell
存储数据的最小单元(逻辑概念)
存储的是KV格式的数据
K: rowkey+column family+qulifier+timestamp
V:value
hbase的cell存储数据的时候没有类型的区分,存放的都是字节数组
架构
hbase是主从架构
角色
client
操作hbase的接口,并维护客户端缓存
zookeeper
保证任何时刻集群中有且仅有一台avtive的master
存储所有region的寻址入口
所有region元数据存储在哪一台regionserver
监控regionserver的上线和下线信息,并实时通知master
存储相关的表的schema数据
master
分配region
保证整个集群中的所有regionserver的负载均衡
当发现某一台regionserver宕机之后,重新分配上面的region
当region变大进行裂变的时候,master去分配region到哪一台regionserver
regionserver
负责接受客户端的读写请求,处理对于region的IO
当某一个region变大之后,负责等分为两个region
region
相当于表的概念,一张表至少对应一个region
当表的数据过大的时候,region会发生裂变
store
相当于列族
角色
memstore
位于内存
每一个store有一个memstore
storefile
磁盘存储空间,将数据持久化的存储位置
每一个region有一个或者多个storefile
storefile可以进行合并操作
存储结构:使用了LSM的数据模型
读写流程
读流程
1、客户端向zk中发送请求
2、从zk中拿到metadata的存储节点
3、去存储metadata的节点获取对应region的所在位置
4、访问对应的region获取数据
5、先去memstore中查询数据,如果有结果,直接返回
6、如果没有查询到结果,去blockcache查找数据,如果找到,直接返回
7、如果没有找到,去storefile中查找数据,并将查询到的结果缓存会blockcache中,方便下一次查询
8、将结果返回给客户端
注意:blockcache是缓存,有大小限制,会有淘汰机制,默认将最早的数据淘汰
写流程
1、client向zk发送请求
2、从zk中拿到metadata的存储节点
3、去存储matadata的节点获取对应region所在的位置
4、访问对应的region写数据
5、首先会向wal中写数据,写成功之后才会存储到memstore
6、当memstore中的数据量达到阈值之后,进行溢写,溢写成storefile
7、store file是一个个的小文件,会进行合并(minor,major)
8、store file是对hfile的封装,hfile是实际存储再hdfs上的数据文件
WAL
write ahead log
放置数据丢失
先写内存,再向hdfs上溢写,但是是异步的方式
JAVAAPI
HBaseAdmin
管理表
createtable
disabletable
deletetable
HTable
管理数据
put
get
scan
delete
最后说一下hbase和hive的区别,因为经常有人问
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。HBase是Hadoop的数据库,一个分布式、可扩展、大数据的存储。单个的从字面意思上或许很难看出二者的区别,别急,下面我们就对二者做个详细的介绍。
两者的特点
Hive帮助熟悉SQL的人运行MapReduce任务。因为它是JDBC兼容的,同时,它也能够和现存的SQL工具整合在一起。运行Hive查询会花费很长时间,因为它会默认遍历表中所有的数据。虽然有这样的缺点,一次遍历的数据量可以通过Hive的分区机制来控制。分区允许在数据集上运行过滤查询,这些数据集存储在不同的文件夹内,查询的时候只遍历指定文件夹(分区)中的数据。这种机制可以用来,例如,只处理在某一个时间范围内的文件,只要这些文件名中包括了时间格式。
HBase通过存储key/value来工作。它支持四种主要的操作:增加或者更新行,查看一个范围内的cell,获取指定的行,删除指定的行、列或者是列的版本。版本信息用来获取历史数据(每一行的历史数据可以被删除,然后通过Hbase compactions就可以释放出空间)。虽然HBase包括表格,但是schema仅仅被表格和列簇所要求,列不需要schema。Hbase的表格包括增加/计数功能。
限制
Hive目前不支持更新操作。另外,由于hive在hadoop上运行批量操作,它需要花费很长的时间,通常是几分钟到几个小时才可以获取到查询的结果。Hive必须提供预先定义好的schema将文件和目录映射到列,并且Hive与ACID不兼容。
HBase查询是通过特定的语言来编写的,这种语言需要重新学习。类SQL的功能可以通过Apache Phonenix实现,但这是以必须提供schema为代价的。另外,Hbase也并不是兼容所有的ACID特性,虽然它支持某些特性。最后但不是最重要的–为了运行Hbase,Zookeeper是必须的,zookeeper是一个用来进行分布式协调的服务,这些服务包括配置服务,维护元信息和命名空间服务。
应用场景
Hive适合用来对一段时间内的数据进行分析查询,例如,用来计算趋势或者网站的日志。Hive不应该用来进行实时的查询。因为它需要很长时间才可以返回结果。
Hbase非常适合用来进行大数据的实时查询。Facebook用Hbase进行消息和实时的分析。它也可以用来统计Facebook的连接数。
总结
Hive和Hbase是两种基于Hadoop的不同技术–Hive是一种类SQL的引擎,并且运行MapReduce任务,Hbase是一种在Hadoop之上的NoSQL 的Key/vale数据库。当然,这两种工具是可以同时使用的。就像用Google来搜索,用FaceBook进行社交一样,Hive可以用来进行统计查询,HBase可以用来进行实时查询,数据也可以从Hive写到Hbase,设置再从Hbase写回Hive。
HBaseDAOImp这是Hbase的实现类,可以看一下,理解代码,不用自己写。
附:HbaseDaoImp HBASE 增删改查