一:为什么出现hbase?
- 在大数据的领域,一直摸索的有俩个方向,一个是存储,另外一个是计算。人们在这俩个领域不段的进行研究。按照之前的阶段来讲,存储使用hdfs,计算使用hive(map-reduce)。
- 但是有个问题,使用hdfs存储数据,查询会非常慢,所以,我们在hdfs的基础上,创建了hbase,数据底层依旧是hdfs,我们在hdfs之上对于数据做一个类似的索引,将这些信息存放在一个物理表中。后期我们查询某个信息,直接查询物理表即可。这就是hbase的原因。
二:hbase是什么?
1. hbase是分布式,高可用的列式存储工具。
2. hbase基础框架![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/90b64263ae8a20eca894cd0448f4c795.png)
高可用
- Zookpeeper
zk在大数据中的更多的作用是进行高可用的解决方案。
在hbase中可以有多个HMaster,但是只会有一个起作用,当一个失效以后。zk会选举一个新HMaster的进行工作
另外zk还HRegionServer,HRegion的注册。
分布式
- HMaster
为HRegionSever分配HRegion
监控HRegionSever进行负载均衡。
发现有失效的HRegionSever重新分配。
总结:管控资源。 - HRegionSever
进行分布式操作。我们的数据最终存储在HRegion,分布式,说明有多个HRegion,所以需要一个管理者,即为HRegionSever。- 进行和客户段的io。
- 监控HRegion。为了保持查询效率,当HRegion存储的数据多时,查询效率会降低,所以当超过一个阈值(256M)的时候,会分割成为俩个HRegion。
列式存储
- 逻辑列式存储
包含列族,列,rowkey,值。
列族:目的是为了将相关联的列放在一起,经可能放在同一个服务器上,在查询的时候,可以减少时间。
row_key:每一条数据的唯一值,可以通过rowkey来获取到一条完整的数据。 - 实际列式存储
在实际的列式存储中,我们是key-vaule的方式进行存储的。
key: rowkey+列族+列+时间戳
Value: 值
为什么会出现时间戳?因为hdfs不允许修改,所以我们只能通过拿最新的时间来获取最新的数据,将老的数据覆盖掉,既为删除掉。
我们每个表中的数据,在进入hbase中,都会存储成以上的格式。最后会存储在对应的每个列族下面(Store) - HRegion
table在行上被切分成多条信息,之后将这些信息存储在HRegion中。
HRegion就是hdfs上的一个存储。 - Store
Store是HRegion的组成单位,一个列族就是一个Store。有多少个列族就有多少个Store。每一个Store会包含至少0个MenStore和多个HFile。 - MemStore
MemStore是存放在内存中的,对数据的修改都会存放在这个里面,当到达一个阈值(默认64M)的时候,就会被Flush成一个文件 。 - StoreFile
MenStore最后写成的文件就是StoreFile。 - HFile
最后在hdfs上的二进制的存储文件就是HFile。
Data Block段用来保存表中的数据,这部分可以被压缩。 Meta Block段(可选的)用来保存用户自定义的kv段,可以被压缩。 FileInfo段用来保存HFile的元信息,不能被压缩,用户也可以在这一部分添加自己的元信息。 Data Block Index段(可选的)用来保存Meta Blcok的索引。 Trailer这一段是定长的。保存了每一段的偏移量,读取一个HFile时,会首先读取Trailer,Trailer保存了每个段的起始位置(段的Magic Number用来做安全check),然后,DataBlock Index会被读取到内存中,这样,当检索某个key时,不需要扫描整个HFile,而只需从内存中找到key所在的block,通过一次磁盘io将整个 block读取到内存中,再找到需要的key。DataBlock Index采用LRU机制淘汰。 HFile的Data Block,Meta Block通常采用压缩方式存储,压缩之后可以大大减少网络IO和磁盘IO,随之而来的开销当然是需要花费cpu进行压缩和解压缩。(备注: DataBlock Index的缺陷。 a) 占用过多内存 b) 启动加载时间缓慢) - Hlog
里面记录所有的数据记录的变更,用户进行数据恢复。
3.读写流程
写流程
-
Client向zk发出写数据的请求。zk分配指定的HRegion。
-
之后向HRegion写数据,数据被写到指定的MenStore中。
-
等到底阈值,会形成一个StoreFile。
-
随着StoreFile文件的不断增多,当其数量增长到一定阈值后,触发Compact合并操作,将多个StoreFile合并成一个StoreFile,同时进行版本合并和数据删除。
-
StoreFiles通过不断的Compact合并操作,逐步形成越来越大的StoreFile。
-
单个StoreFile大小超过一定阈值后,触发Split操作,把当前Region Split成2个新的Region。父Region会下线,新Split出的2个子Region会被HMaster分配到相应的RegionServer上,使得原先1个Region的压力得以分流到2个Region上。
读流程
了解HRegion定位
HRegion被分配给哪个HRegionServer是完全动态的,所以需要机制来定位HRegion具体在哪个HRegionServer,Hbase使用三层结构来定位HRegion:
1、通过zk里的文件/Hbase/rs得到-ROOT-表的位置。-ROOT-表只有一个region。
2、通过-ROOT-表查找.META.表的第一个表中相应的HRegion位置。其实-ROOT-表是.META.表的第一个region;.META.表中的每一个Region在-ROOT-表中都是一行记录。
3、通过.META.表找到所要的用户表HRegion的位置。用户表的每个HRegion在.META.表中都是一行记录。-ROOT-表永远不会被分隔为多个HRegion,保证了最多需要三次跳转,就能定位到任意的region。Client会将查询的位置信息保存缓存起来,缓存不会主动失效,因此如果Client上的缓存全部失效,则需要进行6次网络来回,才能定位到正确的HRegion,其中三次用来发现缓存失效,另外三次用来获取位置信息。
读的过程
-
Client访问Zookeeper,查找-ROOT-表,获取.META.表信息。
-
从.META.表查找,获取存放目标数据的Region信息,从而找到对应的RegionServer。
-
通过RegionServer获取需要查找的数据。
-
Regionserver的内存分为MemStore和BlockCache两部分,MemStore主要用于写数据,BlockCache主要用于读数据。读请求先到MemStore中查数据,查不到就到BlockCache中查,再查不到就会到StoreFile上读,并把读的结果放入BlockCache。
寻址过程:client–>Zookeeper–>-ROOT-表–>.META.表–>RegionServer–>Region–>client
三:怎么使用HBase?
1. 安装
2. 操作流程。
1.创建表。
create 'dk_ods:dk_ods_nukp_dkb_vehiclemodel_partnum','cf'
create 'dk_ods:dk_ods_nukp_dkb_data_dict','cf'
2. 查看表
list
3. 查看表信息
scan "dk_ods:dk_ods_nukp_dkb_data_dict"