文档章节

关于近期HBase系统设计开发和性能调优的一些小结

猪刚烈
 猪刚烈
发布于 2014/10/12 11:40
字数 1729
阅读 54
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

本文原文连接: http://blog.csdn.net/bluishglc/article/details/18811129,转载请注明出处!

1. 全局查询策略

 
应该一边倒地依赖索引进行查询,保证绝大多数的查询是秒级返回。尽量避免动用全表扫描,让全表扫描仅服务于非常有限的“生僻”查询!实现这种格局需要尽可能地保证索引轻量短小(尽量缩短字节),然后创建多倍于主数据的索引数据(我们基于配置创建索引的机制保证了增加一条索引的工作量是可以忽略不计的),让索引能覆盖绝大多数的查询。之所以这样做可行且高效是基于这样两点:一、在基于rowkey检索时HBase的性能是非常高的,完全不受数据条数的影响,我们基于索引的查询本质上是基于rowkey的查询,因此无论创建多少倍于主数据的索引数据都不会对性能产生明显影响。二、保持索引轻量短小是为了节约存储空间,降低全部数据的体量,同时也利于建立更多的索引。

2. 关于排序和结果集上限

类似于淘宝上的商品检索,可供排序的字段(人气,销量,信用,价格)和结果集上限(100页)是严格控制的,我们对排序和结果集上限也是有严格要求的,从实质上讲这些是所有分布式系统在进行全集计算时都会面临的问题(还有一个常见的问题就是join,join也是基于数据全集进行的计算)。对于我们系统的排序:由于一种索引只能指定一个排序字段,因此,可以查询的排序字段应该严格控制,尽量贴近实际需要选择最少的字段。体现到上层应用的UI上,就应像淘宝一样,将支持的排序字段以单选框方式列出供用户选择。对于结果集上限,过大的结果集在返回客户端后会导致OOME,为此我们提供了一个可配置的参数core.query.maxResultLimit,任何查询要求的上限如果超出了该值在执行前会抛出异常终止查询。

3. 数据体量和BlockCache

通过前一段时间的性能测试,关于BlockCache有如下结论:
当数据体量<BlockCache时,全部数据被加载到内存中,cache的命中率是100%,任何查询都将达到性能最优!
当数据体量>>(远大于)BlockCache时,在进行全表扫描时(默认情况下,scan时,scan到的数据会被加载到cache!),所有的数据都将遍历一边,它们依次被加载到cache里,然后在cache满时被后面加入的新数据替换出去,由于是全表扫描,超过cache数倍的数据会加载到内存然后再被替换出去,整个查询过程中cache在持续地颠簸,性能非常差,远远超过了关闭BlockCache时的全表扫描。为此我们提供了一个重要的配置参数:server.search.enableBlockCacheForSearch,部署时,若数据体量<BlockCache,设为true,若数据体量>>(远大于)BlockCache时,设为false

4. 为什么不在索引数据上冗余多余的列?


在索引数据上冗余其他列的初衷大概有这么两个方面:一是寄希望于冗余出的列支持更多条件的查询,二是过去添加索引需要建立一张单独的索引表,建立索引的成本(工作量)是很高的,为了能充分利用这张索引表都会冗余一些字段,基于这样一种惯性思维,也希望在新的索引机制下冗余字段。但实际上在新的索引机制下是完全不需要也应该再冗余多余列的,这是因为:首先,建立索引已经变得非常简单,索引的建立成本(工作量)是非常低的,所以不再需要在水平方向上“拉伸”索引,而是应该在垂直方向上“扩展”所引,也就是建立更多包含不同字段的索引。第二点,重复第一点的理由,通过冗余的列所支持到的查询不但可以完全使用新的索引来支持,且速度只会比这种方式更快,因为该方式在定位了索引之后还需要取出各个qualifier进行比对,性能比更长包含更多字段的索引而言差距是显而易见的。第三点:在使用索引检索时是先通过scan索引找到目标数据的rowkey然后发起一个二次的Get(HRegion不支持批量put)请求得到目标数据。如果寄希望通过多冗余几个字段,只scan索引数据而不去二次get主数据是不现实的,因为绝大部分的查询需要的是整条记录而不是一条记录中的某几个字段,除非索引冗余了全部列。

5.对多rowkey的批判


一旦在索引上打开冗余其他列的口子,为了支持更多的查询特别是迎合整条记录的返回,势必将冗余越来越多的列,最后的情形就是冗余了所有的列,一条索引数据变成了目标数据的全备份,不同之外只是换了另外一种形式的rowkey,这就是我给定义的“多rowkey"设计。“多rowkey"设计是一种笨重的,成本很高的索引方案,一个系统能不计代价地承受多少倍的冗余呢?“多rowkey"方案可以预见的结果是:翻了好几倍的存储空间,只能支持有限的几个查询, 利用率非低,成本太高。


6.若干技巧


1. 在取保可读性的前提下使得尽可能短的column family和qulifier名,以及字节较少的数据类型存储数据,(如:可以使用byte的就不要使用int!)以此来减少数据存储空间和传输速率,对系统整体性能的提升是有帮助的


2.如果节点数量为N,N是一个比较小的数值,而单个节点可以冗余N倍的数据话,就将hdf.replication设为N,这是保证本地化读取的最简单方法,可以有效地提升系统的性能。远期目标应该实现一个基于block进行本地化分配的LoadBalancer,特别是在region re-online的时候,这貌似是一个很基础的需求,不知hbase何会加入?

猪刚烈

猪刚烈

粉丝 22
博文 708
码字总数 110
作品 1
海淀
程序员
私信 提问
加载中
请先登录后再评论。
访问安全控制解决方案

本文是《轻量级 Java Web 框架架构设计》的系列博文。 今天想和大家简单的分享一下,在 Smart 中是如何做到访问安全控制的。也就是说,当没有登录或 Session 过期时所做的操作,会自动退回到...

黄勇
2013/11/03
3.4K
6
SQLServer实现split分割字符串到列

网上已有人实现sqlserver的split函数可将字符串分割成行,但是我们习惯了split返回数组或者列表,因此这里对其做一些改动,最终实现也许不尽如意,但是也能解决一些问题。 先贴上某大牛写的s...

cwalet
2014/05/21
9.6K
0
我的架构演化笔记 功能1: 基本的用户注册

“咚咚”,一阵急促的敲门声, 我从睡梦中惊醒,我靠,这才几点,谁这么早, 开门一看,原来我的小表弟放暑假了,来南京玩,顺便说跟我后面学习一个网站是怎么做出来的。 于是有了下面的一段...

强子哥哥
2014/05/31
976
3
beego API开发以及自动化文档

beego API开发以及自动化文档 beego1.3版本已经在上个星期发布了,但是还是有很多人不了解如何来进行开发,也是在一步一步的测试中开发,期间QQ群里面很多人都问我如何开发,我的业余时间实在...

astaxie
2014/06/25
2.7W
22
Nutch学习笔记4-Nutch 1.7 的 索引篇 ElasticSearch

上一篇讲解了爬取和分析的流程,很重要的收获就是: 解析过程中,会根据页面的ContentType获得一系列的注册解析器, 依次调用每个解析器,当其中一个解析成功后就返回,否则继续执行下一个解...

强子哥哥
2014/06/26
712
0

没有更多内容

加载失败,请刷新页面

加载更多

Vim清除最后一个搜索突出显示 - Vim clear last search highlighting

问题: Want to improve this post? 想要改善这篇文章吗? Provide detailed answers to this question, including citations and an explanation of why your answer is correct. 提供此问题......

技术盛宴
24分钟前
13
0
原子属性和非原子属性有什么区别? - What's the difference between the atomic and nonatomic attributes?

问题: What do atomic and nonatomic mean in property declarations? 属性声明中atomic和nonatomic是什么意思? @property(nonatomic, retain) UITextField *userName;@property(atomic, ......

fyin1314
54分钟前
7
0
马化腾每天刷 Leetcode?代码你打算写到几岁?

本文作者:o****0 前几天,一张未证真伪的截图流传,图中显示马化腾几乎每天都会在 Leetcode 上提交代码。 截图还贴出一个 Leetcode 账户地址。该地址的头像已从马化腾的照片换成腾讯 logo,...

百度开发者中心
前天
13
0
滴滴 3000+ Kylin Cube 背后的实践经验揭秘

本次分享主要有三个部分:Kylin 在滴滴的整体应用、架构的实践经验、滴滴全局字典最新版本的实现以及 Kylin 最新实时 OLAP 探索经验分享。 Kylin 在滴滴的应用&架构 Kylin 在滴滴的三类应用场...

浪尖聊大数据
昨天
9
0
ssh“权限太开放”错误 - ssh “permissions are too open” error

问题: I had a problem with my mac where I couldn't save any kind of file on the disk anymore. 我的Mac出现问题,无法再在磁盘上保存任何类型的文件。 I had to reboot OSX lion and r......

javail
今天
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部