如何理解HBase中HFile的合并过程,针对这个问题,本文详细介绍了相应的分析和解答,希望能帮助更多想要解决这个问题的小伙伴找到更简单更容易的方法。
HBase根据整合的规模将比较分为两类:小规模整合和大规模整合。
Minor Compaction指的是选择一些小的和相邻的存储文件,并将它们合并成一个更大的存储文件。在此过程中,将不会处理“已删除”或“过期”单元格。小压缩的结果是存储文件越来越少。
Major Compaction指的是将所有的存储文件合并成一个存储文件。这个过程还会清理三种无意义的数据:删除数据、TTL过期数据、版本号超过设定版本号的数据。另外,一般来说,重大压实时间会持续很长时间,整个过程会消耗大量的系统资源,对上层业务影响很大。因此,所有在线业务都将关闭自动触发重大压缩的功能,而不是在业务高峰期手动触发。
00-1010数据加载到memstore中,数据不断增加,直到memstore满了,然后写入硬盘storefile。每次写入单个storefile,当store file数量达到一定量时,小store file就会合并成大store file,因为Hadoop不擅长处理小文件,文件越大性能越好。
00-1010可以通过三种方式触发压缩:Memstore刷盘、后台线程周期检查和手动触发。
1.Memstore Flush:
应该说,比较操作的来源来自于刷新操作。memstore flush会生成HFile文件,越来越多的文件需要压缩。因此,每次刷新操作后,将判断当前存储中的文件数量。一旦文件数量大于配置,就会触发压缩。需要注意的是,比较是在门店进行的,在Flush触发条件下,整个大区的所有门店都会执行compact,所以会在短时间内进行几次比较。
2.后台线程周期性检查:
后台线程定期触发以检查是否需要执行压缩,并且检查周期是可配置的。线程首先检查文件的数量是否大于配置,一旦大于,就会触发压缩。如果不是,则检查是否满足主要比较的条件。简单来说,如果当前存储中hfile的最早更新时间早于某个值mcTime,就会触发Major Comparison(默认7天触发一次,可以配置手动触发),HBase期望通过这个机制定期删除过期数据。
3.手动触发:
一般来说,手动触发比较通常是为了执行主要压缩。一般来说,有些情况需要手动触发组合。
是因为很多商家担心自动重大压缩会影响读写性能,所以会在低峰期选择手动触发。
也有可能用户希望在执行alter操作后立即生效,并手动触发主压缩;
是HBase管理员在硬盘容量不足时手动触发大压缩删除大量过期数据;
00-1010因为内存中的memstore是在数据插入的过程中进行排序的,也就是数据插入的时候是按顺序插入的,所以memstore中的数据是有序的。memstore的数据写入磁盘时,生成的storefile中的数据也是有序的,这样每个storefile中的数据分别是有序的。合并时,需要将有序存储文件合并成一个大的有序存储文件。
首先,要合并的storefile被封装到StoreFileScanners中,最后形成一个List并加载到内存中,然后封装到StoreFileScanners对象中。初始化此对象时,所有storefilescanner将被排序并放入内部队列,排序将根据每个storefilescanner的最小rowkey进行。然后,通过StoreScanner的next()方法,我们可以得到每个StoreScanner的最小行键中对应最小行键的KV对。然后,提取的KV对被另外写入合并的存储文件。因为每次都提取每个storefile中最小的数据,所以添加到合并storefile中的数据是从小到大排序的有序数据。
合并storefile的原因
合并过程中,删除logo的行和版本太旧的行将被丢弃。
(1)版本数可以预定义,超过此值将被丢弃。
(2)也可以预定义版本的长度,这次之后丢弃,合并后形成更大的故事文件。当达到该数量后再次合并,直到故事文件的容量超过一定阈值,将当前Region分成两部分,由Hmaster(hbase数据库的hbase节点)分配给不同的HRegionServer服务器,实现负载均衡。
如果在合并过程中碰巧有一个与storefile相关的查询,我们首先将小storefile加载到内存中进行合并。此时,如果有用户的访问,我们可以从内存中检索相关数据并返回给用户。我们可以想象,在内存中进行独立的镜像备份来提供查询的需求,另一个实体在另一个内存空间中合并。合并完成后,备份的内存空间将被释放并返回到原始状态。
关于如何理解HBase中的HFile合并过程的问题的答案在此分享。希望
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/113487.html