Hbase
概述
基于HDFS的面向列存储的非关系型数据库,可满足大数据存储以及快速查询更新需求。
数据持久化存储的体现形式是Hfile,存放于DataNode中,被ResionServer以region的形式进行管理。
构成
架构
数据按照列族存储在一起,一个列族数据存储在一个Store中。(存储形式 = 内存 + 硬盘)
多个Store构成HRegion存储表格部分数据。 HRegion = n * Store
Store = Mem Store(内存) + Store File(硬盘) + HFile(实际存储格式)
写数据时,先写到内存MemStore中,超过阈值以后,将数据刷到硬盘行成StoreFile.
StoreFile底层以Hfile的形式进行保存。
HregionServer:管理Hregions,处理客户端读写请求,与HDFS进行交互(接受请求数据读取)
使用Hlog文件保证稳定性:写文件到MemStore时,备份到Hlog,机器宕机时,保证数据的磁盘刷新。
主要流程:
Client客户端请求Zookeeper获取HregionServer地址。根据地址发送读写请求,获得返回值。
优化管理
数据分布 -- Rowkey 行键
RowKey按照字典序排列,Hbase根据有序的RowKey进行表的横向切分。
读写时根据RowKey以及HRegion的start-key、end-key属性进行定位。
该原则会出现热点数据问题,不同Region数据量分布差异大。需要对Rowkey做优化处理。
1. 指定RowKey分割点
2. 集群来均衡预分区,,设定始末的RowKey,以及根据数据量给定大致的region数
生成RowKey时,尽量进行加盐或者哈希的处理,这样很大程度上可以缓解数据热点问题.
HMaster -- HregionServer管理
处理元数据变更以及RegionServer状态监控。
HRegion的数据量过大时,HMaster会对拆分后的Regin重新分配HregionServer
存储理论
列式存储:
一条行数据转换成若干条列数据以key-value形式进行存储,null数据不占用存储资源。
key = 主键, value = 列族(UserInfo) + 列标识符(name) + 列值 + 时间戳。
列族 -- 列的属性类别, 列族下可以任意添加列不受限制。
时间戳 -- 数据写到HBase的时候都会被记录一个时间戳,更新数据的本质是新增一条带有最新时间戳的数据,读数据的时候按照时间戳读最新记录。
面试问题
Hbase主要特点
1.低成本 -- redis数据读写在内存,成本高昂
2.海量数据存储 -- 基于hdfs分布式文件系统
3.高并发随机写和实时查询 -- 对hdfs的功能补充 [主键有序存储好定位]
PS :
Hbase与HDFS
Hbase基于HDFS,作为分布式文件系统,HDFS可存储海量数据,
Hbase在其基础之上提供了高并发的随机写和支持实时查询功能。
类似组件有哪些,和Hbase对比情况
Mysql -- 单机, 存储数据量取决于服务器硬盘大小(数据量受限)
分布式消息队列Kafka -- 消息处理(解耦异步削峰) 数据到Kafka,Kafka会将数据持久化到硬盘中,并且Kafka是分布式的(很方便的扩展),
理论上Kafka可以存储很大的数据。但是Kafka的数据我们不会「单独」取出来。
持久化了的数据,最常见的用法就是重新设置offset,做「回溯」操作
缓存数据库 Redis -- 缓存数据库,所有的读写都在内存中,速度贼快。
AOF/RDB存储的数据都会加载到内存中,Redis不适合存大量的数据(因为内存太贵了!)
分布式搜索引擎 ES -- 分布式的搜索引擎,分布式特点可存储大量数据,
但如果数据没有经常「检索」的需求,其实不必放到Elasticsearch,数据写入Elasticsearch需要分词,无疑会浪费资源。
分布式文件系统HDFS -- 可存海量数据,但是不支持随机修改,查询效率低,对小文件支持不友好
数据来源:https://zhuanlan.zhihu.com/p/145551967