因为一直在做hbase的应用层面的开发,所以体会的比较深的一点是hbase的表结构设计会对系统的性能以及开销上造成很大的区别,本篇文章先按照hbase表中的rowkey、columnfamily、column、timestamp几个方面进行一些分析。最后结合分析如何设计一种适合应用的高效表结构。
1、表的属性
(1)最大版本数:通常是3,如果对于更新比较频繁的应用完全可以设置为1,能够快速的淘汰无用数据,对于节省存储空间和提高查询速度有效果。不过这类需求在海量数据领域比较小众。
(2)压缩算法:可以尝试一下最新出炉的snappy算法,相对lzo来说,压缩率接近,压缩效率稍高,解压效率高很多。
(3)inmemory:表在内存中存放,一直会被忽略的属性。如果完全将数据存放在内存中,那么hbase和现在流行的内存数据库memorycached和redis性能差距有多少,尚待实测。
(4)bloomfilter:根据应用来定,看需要精确到rowkey还是column。不过这里需要理解一下原理,bloomfilter的作用是对一个region下查找记录所在的hfile有用。即如果一个region下的hfile数量很多,bloomfilter的作用越明显。适合那种compaction赶不上flush速度的应用。
2、rowkey
rowkey是hbase的key-value存储中的key,通常使用用户要查询的字段作为rowkey,查询结果作为value。可以通过设计满足几种不同的查询需求。
(1)数字rowkey的从大到小排序:原生hbase只支持从小到大的排序,这样就对于排行榜一类的查询需求很尴尬。那么采用rowkey = Integer.MAX_VALUE-rowkey的方式将rowkey进行转换,最大的变最小,最小的变最大。在应用层再转回来即可完成排序需求。
(2)rowkey的散列原则:如果rowkey是类似时间戳的方式递增的生成,建议不要使用正序直接写入rowkey,而是采用reverse的方式反转rowkey,使得rowkey大致均衡分布,这样设计有个好处是能将regionserver的负载均衡,否则容易产生所有新数据都在一个regionserver上堆积的现象,这一点还可以结合table的预切分一起设计。
3、columnfamily
columnfamily尽量少,原因是过多的columnfamily之间会互相影响。
4、column
对于column需要扩展的应用,column可以按普通的方式设计,但是对于列相对固定的应用,最好采用将一行记录封装到一个column中的方式,这样能够节省存储空间。封装的方式推荐protocolbuffer。
以下会分场景介绍一些特殊的表结构设计方法,只是一些摸索,欢迎讨论:
value数目过多场景下的表结构设计:
目前我碰到了一种key-value的数据结构,某一个key下面包含的column很多,以致于客户端查询的时候oom,bulkload写入的时候oom,regionsplit的时候失败这三种后果。通常来讲,hbase的column数目不要超过百万这个数量级。在官方的说明和我实际的测试中都验证了这一点。
有两种思路可以参考,第一种是单独处理这些特殊的rowkey,第二种如下:
可以考虑将column设计到rowkey的方法解决。例如原来的rowkey是uid1,,column是uid2,uid3...。重新设计之后rowkey为<uid1>~<uid2>,<uid1>~<uid3>...当然大家会有疑问,这种方式如何查询,如果要查询uid1下面的所有uid怎么办。这里说明一下hbase并不是只有get一种随机读取的方法。而是含有scan(startkey,endkey)的扫描方法,而这种方法和get的效率相当。需要取得uid1下的记录只需要new Scan("uid1~","uid1~~")即可。
这里的设计灵感来自于hadoop world大会上的一篇文章,这篇文章本身也很棒,推荐大家看一下http://www.cloudera.com/resource/hadoop-world-2011-presentation-slides-advanced-hbase-schema-design/
相关推荐
4. **架构设计**:深入讨论如何根据业务需求设计合理的Hbase表结构,包括数据模型的选择、索引优化、时间戳处理,以及如何处理稀疏数据。 5. **性能优化**:分享在项目实践中遇到的问题及解决方案,如Region大小...
首先,创建或检查HBase表是否存在,然后根据设计的HBase表结构,将Mysql数据转化为HBase的Put对象,并提交到表中。 4. **单元测试**:提供的单元测试文件用于验证数据转换的正确性。通常会模拟一些基本操作,如插入...
通过以上案例的学习,我们可以看出,在设计 HBase 表结构时,需要充分考虑到查询的需求以及数据的特点。合理的 RowKey 设计和数据组织方式能够极大地提高查询效率。同时,利用 HBase 特有的特性,如版本控制和支持...
- **第4章:HBase表设计**:讲解如何有效地设计HBase表结构以满足特定的应用需求,包括如何选择合适的列族、如何优化数据模型以提高查询性能等。 - **第5章:通过Coprocessors扩展HBase**:Coprocessors是HBase中...
HBase的数据模型是基于键值对的,不需要固定表结构,可以根据需要增加一些自己的键值对。这使得HBase可以存储任何结构的数据,不局限于固定的结构。HBase的数据模型可以减少一些时间和空间的开销,使得系统执行速度...
HBase采用的是列族式存储模型,每个表由一个或多个列族组成,表中的数据都是以行的形式存储的。列族下面可以存储多个列。Cells是HBase数据存储的基本单位,它包含了数据的值、时间戳和行键等信息。 ### HBase与...
- 讲解了在MapReduce作业中如何访问其他HBase表,以及关于推测执行的相关内容。 8. HBase安全部分: - 阐述了HBase的安全机制,包括如何安全地访问HBase,以及HBase的访问控制机制。 - 提到了如何进行安全批量...
在HBase与模式设计(Schema Design)方面,指南会介绍如何创建模式,包括表结构设计的基本原则,如列族和行键(Rowkey)的设计。同时,还会讨论版本数的选取、支持的数据类型、时间期限(TTL)和保留已删除的单元格...
- **HBase表的设计**,包括行键设计、列族数量、数据版本、支持的数据类型等。 - **HBase的ACID特性**,在NoSQL领域中,HBase通过一系列机制支持事务的原子性、一致性、隔离性和持久性。 ### 2. HBase的安装和配置 ...
对于Twitbase,可能还需要额外的配置步骤,例如创建特定的表结构来模拟Twitter的数据模型。 2. **数据模型**:理解HBase的数据模型至关重要,这包括如何定义列族、如何选择合适的行键,以及如何组织列限定符。在...
- **Schema 创建**:指导如何在 HBase 中创建合理的表结构。 - **column families 的数量**:分析 column families 数量对性能的影响。 - **Rowkey 设计**:强调 Rowkey 设计的重要性,并给出最佳实践。 - **版本...
4. **HBase表设计**: - **Column Family**:列族是列的集合,每个列族内部可以有任意多的列,列名动态添加。 - **Row Key**:行键是表中每一行的唯一标识,设计合理的Row Key对于查询性能至关重要。 - **...
文中指出HBase的局限性在于数据访问方式有限,即通过RowKey定位和全表扫描,因此引入了索引表的概念,采用了MySQL与HBase相结合的双索引体系结构。这种结构能够显著提高对复杂数据的查找效率,加强了数据中心在数据...
2. **创建HBase表**:在HBase中创建对应的表结构,定义行键(Row Key)、列族(Column Family)以及列限定符(Qualifier)。行键是HBase的主键,决定数据的存储位置;列族是一组列的集合,列限定符则用于区分同一列...
HBase是Apache软件基金会开发的一个开源、分布式、版本化、基于列族的NoSQL数据库,它构建在Hadoop文件系统(HDFS)之上,专为处理海量数据而设计。源码包“hbase-0.98.1-src.tar.gz”提供了HBase 0.98.1版本的完整...
- 表结构设计的最佳实践:在创建表时应遵循的规则。 - Region Server的尺寸规则:如何根据数据量来调整Region Server的大小。 - 列族的数量:对数据存储和访问性能的影响。 - 行键设计:行键的设计对查询性能有重要...
海量日志系统的存储方法包括配置项的整体规划、使用REDIS进行配置管理以及HBASE的表结构设计。在配置管理中,将通用配置项划分为表名(TABLENAME)、列族(FAMILY)和对象类型(Object-Type)。这些配置项与日志系统...