热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HBase文件格式演变之路

Apache HBase是Hadoop的分布式开源的存储管理工具,很适合随机实时的io操作。我们知道,Hadoop的Sequence File是一个顺序读写,批量处理的系统。可是为

Apache HBaseHadoop的分布式开源的存储管理工具,很适合随机实时的io操作。

我们知道,HadoopSequence File是一个顺序读写,批量处理的系统。可是为什么HBase能做到随机的,实时的io操作呢?

Hadoop底层使用Sequence File文件格式存储,Sequence File同意以追加的方式添加k-vKey-Value数据,依据hdfsappend-only的特性,Sequence File不同意改动或删除一个指定的数据。仅仅有append操作是被同意的,并且你想要查找某个key,你仅仅能遍历文件,知道找到这个key为止。

所以,在这个文件格式至上搭建的HBase系统,是怎样搭建随机读写,低訪问延迟的呢?

HBase 0.20之前-MapFile

上文中提到了MapFile,是一个以Sequence File为基础的文件格式。MapFile实际上是由两个Sequence File组成的,/data存储了数据,/index存储了索引。

MapFile提供了一个按顺序存储的方式,每当NN是可配置的)条记录写入后,会将文件偏移地址写入index文件;这就实现了高速查找,相比直接遍历Sequence File,你能够直接遍历index文件,index文件存储了更少的文件句柄,一旦找到了文件块所在的位置,能够直接跳到该文件块查找;因此查找速度很快。

可是还有另外两个问题:

1. 怎样删除或更新一个k-v记录;

2. 当插入数据不是有序的,怎样使用MapFile

MapFile文件格式例如以下:

HBase文件格式演变之路

HBasekey包含:行键,列族,column qualifier,时间戳,属性。

为了解决删除的问题,使用key中的type标记该记录是否被删除。

解决更新的问题,实际上是获取时间戳更晚的记录,正确的数据总会更接近文件的末尾。为了解决无序数据的问题,hbase将插入的数据暂存在内存中,直到一个阈值到达,hbase会将内存中的数据存储到MapFile中。hbase在内存中使用sorted ConcurrentSkipListMap数据结构存储数据,每次到达阈值(hbase.hregion.memstore.flush.size)或到达内存上限(hbase.regionserver.global.memstore.upperLimit),都会将内存中的数据向一个新的mapFile写入。因为每次flush操作都会写入一个新的MapFile,这就意味着查找时,会横跨多个文件,这也会耗费很多其它的资源和时间。

为了避免在查找getscan扫描时横跨过多的文件,hbase中有一个线程来运行文件合并的相关操作。当线程发现文件数量达到阈值(hbase.hstore.compaction.max)后,会有一个compaction进程来运行文件合并,将小的文件合并到一个大文件里。

hbase中有两种合并模式,minormajorminor会合并两个或多个较小的文件到一个大文件里。另外的major会合并全部的文件到一个文件里,而且运行一些清理,被删除的数据将不会被写入新的文件,而且反复的数据会被清除,仅仅留下最新的有效数据。0.20下面版本号的hbase使用上述的文件存储方式,到0.20以后,HFile V1被引入替代了MapFile

HBase 0.20到0.92之前-HFile V1

从 HBase 0.20開始,HBase引入了HFile V1文件格式。HFile V1的详细格式例如以下:

HBase文件格式演变之路

KeyValue的详细格式例如以下:

HBase文件格式演变之路

上图中,keytype有四种类型,各自是PutDelete、 DeleteColumnDeleteFamilyRowLength2个字节,Row长度不固定,ColumnFamilyLength2个字节,ColumnFamily长度不固定,ColumnQualifier长度不固定,TimeStamp4个字节,KeyType1个字节。之所以不记录ColumnQualifier的长度是由于能够通过其它字段计算得到。

HFile文件的长度可变,唯一固定的是File InfoTrailerTrailer存储指向其它块的指针,它在持久化数据到文件结束时写入的,写入后,该文件就会变成不可变的数据存储文件。数据块(data blocks)中存储key-values,能够看做是一个MapFile。当block关闭操作时,第一个key会被写入index中,index文件在hfile关闭操作时写入。Hfile V1还添加两个额外的元数据类型,MetaFileInfo。这两个数据也是在hfileclose时被写入的。

块大小是由HColumnDescriptor设置的。该配置能够在建表时自己指定。默认是64KB。假设程序主要涉及顺序訪问,则设置较大的块大小更合适。假设程序主要涉及随机訪问,则设置较小的块大小更合适。只是较小的块也导致很多其它的块索引,有可能创建过程变得更慢(必须在每一个块结束的时候刷写压缩流,会导致一个FS I/O刷写)。块大小一般设置在8KB~1MB比較合适。

HBaseRegionserver的存储文件里,使用Meta Block存储了BloomFilter,使用FileInfo存储了最大的SequenceIdMajor compaction key和时间跨度信息。这些信息在旧文件或很新的文件里推断key是否存在很实用。

BloomFilter是一种空间效率非常高的随机数据结构,它利用位数组非常简洁地表示一个集合,并能推断一个元素是否属于这个集合。

HBase 0.92到0.98之前-HFile V2

hbase 0.92版本号中,为了改进在大数据存储下的效率,HFile做了改变。HFile V1的主要问题是,你须要载入(load)全部的单片索引和BloomFilter到内存中。为了解决问题,v2引入了多级索引和分块BloomFilterHFile v2改进了速度,内存和缓存利用率。

HFile V2的详细格式例如以下:

HBase文件格式演变之路

上图中,主要包含四个部分:Scanned Block(数据block)、Non-Scanned block(元数据block)、Load-on-open(在hbase执行时,HFile须要载入到内存中的索引、bloom filter元数据和文件信息)以及trailer(文件尾)。

V1的时候,在数据块索引非常大时,非常难所有load到内存。如果每一个数据块使用默认大小64KB,每一个索引项64Byte,这样如果每台及其上存放了60TB的数据,那索引数据就得有60G,所以内存的占用还是非常高的。然而,将这些索引以树状结构进行组织,仅仅让顶层索引常驻内存,其它索引按需读取并通过LRU cache进行缓存,这样就不用所有载入到内存了。

v2的最主要特性是内联块。主要思想是拆分了索引和BloomFilter到每一个数据块中,来解决整个文件的索引和BloomFilterload到内存中的问题

由于索引被拆分到每一个数据块中,这就意味着每一个数据块都有自己的索引(leaf-index。每一个数据块中的最后一个key被当做节点组建了类似b+树的多级索引结构

HBase文件格式演变之路

数据块的头信息中的Block MagicBlock Type替换,Block Type包括描写叙述Block数据的一些信息,包括叶子索引,Bloom,元数据,根索引等。

详细实现来看,在写入HFile时,在内存中会存放当前的inline block index,当inline block index大小达到一定阈值(比方128KB)时就直接flush到磁盘,而不再是最后做一次flush,这样就不须要在内存中一直保持全部的索引数据。当全部的inline block index生成之后,HFile writer会生成更上一级的block index,它里面的内容就是这些inline block indexoffset,依次递归,逐步生成更上层的block index,上层的包括的就是下层的offset,直到最顶层大小小于阈值时为止。所以整个过程就是自底向上的通过下层index block逐步构建出上层index block

其它三个字段(compressed/uncompressed size and offset prev block)也被加入用于前后的高速查找

HFile V2中依据key查找数据的步骤例如以下:

1)先在内存中对HFileroot索引进行二分查找,假设支持多级索引,则定位到leaf index,假设是单级索引,则定位到数据块;

2)假设支持多级索引,则会从cache/hdfs中读取leaf index,然后再进行二分查找,找到相应的数据块;

3)从cache/hdfs中读取数据块;

4)在数据块中遍历查找相应的数据。

HBase 0.98到眼下-HFile V3

HBase 0.98開始添加了对cell tags的支持,所以其HFile结构也发生了改变。HFile V3的格式仅仅是在V2格式后添加了标签部分。其它保持不变,所以对V2保持了兼容性。用户能够从V2直接切换到V3。


转载请注明出处:http://blog.csdn.net/iAm333


推荐阅读
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 在PHP中如何正确调用JavaScript变量及定义PHP变量的方法详解 ... [详细]
  • V8不仅是一款著名的八缸发动机,广泛应用于道奇Charger、宾利Continental GT和BossHoss摩托车中。自2008年以来,作为Chromium项目的一部分,V8 JavaScript引擎在性能优化和技术创新方面取得了显著进展。该引擎通过先进的编译技术和高效的垃圾回收机制,显著提升了JavaScript的执行效率,为现代Web应用提供了强大的支持。持续的优化和创新使得V8在处理复杂计算和大规模数据时表现更加出色,成为众多开发者和企业的首选。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 第二章:Kafka基础入门与核心概念解析
    本章节主要介绍了Kafka的基本概念及其核心特性。Kafka是一种分布式消息发布和订阅系统,以其卓越的性能和高吞吐量而著称。最初,Kafka被设计用于LinkedIn的活动流和运营数据处理,旨在高效地管理和传输大规模的数据流。这些数据主要包括用户活动记录、系统日志和其他实时信息。通过深入解析Kafka的设计原理和应用场景,读者将能够更好地理解其在现代大数据架构中的重要地位。 ... [详细]
  • 【漫画解析】数据已删,存储空间为何未减?揭秘背后真相
    在数据迁移过程中,即使删除了原有数据,存储空间却未必会相应减少。本文通过漫画形式解析了这一现象背后的真相。具体来说,使用 `mysqldump` 命令进行数据导出时,该工具作为 MySQL 的逻辑备份工具,通过连接数据库并查询所需数据,将其转换为 SQL 语句。然而,这种操作并不会立即释放存储空间,因为数据库系统可能保留了已删除数据的碎片信息。文章进一步探讨了如何优化存储管理,以确保数据删除后能够有效回收存储空间。 ... [详细]
  • Zookeeper作为Apache Hadoop生态系统中的一个重要组件,主要致力于解决分布式应用中的常见数据管理难题。它提供了统一的命名服务、状态同步服务以及集群管理功能,有效提升了分布式系统的可靠性和可维护性。此外,Zookeeper还支持配置管理和临时节点管理,进一步增强了其在复杂分布式环境中的应用价值。 ... [详细]
  • 在搭建Hadoop集群以处理大规模数据存储和频繁读取需求的过程中,经常会遇到各种配置难题。本文总结了作者在实际部署中遇到的典型问题,并提供了详细的解决方案,帮助读者避免常见的配置陷阱。通过这些经验分享,希望读者能够更加顺利地完成Hadoop集群的搭建和配置。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有