HBase学习笔记——避免热点Region的一些技巧

HBase row key设计得不好、频度各异的查询类型,会导致热门数据集中坐落在某几个Region上,造成Region热点,集群负载不均衡。

能采取哪些解决方案,首先要明确访问模式,然后针对性优化:

  • 牺牲有序性,散列化row key。

如果不需要数据的有序性:

在row key首部增加原始row key的hash code,使数据均匀散列。

或者,将原始row key的MD5作为实际的row key。

对整个row key散列牺牲了有序性和根据前缀匹配进行范围扫描的能力。

为此,我们也可以对row key的各个部分,分别求取MD5,再拼接起来,作为新的row key。这样虽然仍不支持有序查询,但是支持根据前缀匹配进行范围扫描——根据row key前缀的MD5,范围扫描匹配的行,返回的是无序的数据。

  • 不同访问模式的数据,不要混杂在一张表里。

一个店铺有哪些商品(row key是store id + product id) 和 一种商品有哪些店铺在出售(row key是product id + store id),这两种行,不要放在一张表里。

因为业务应用的以上两种查询,其执行频率会有很大差别。如果这两种行,在一张表里,其中一种更频繁的查询,自然会导致整张表中的一类row key成为热点数据。

所以,要拆成两张表,让HBase有自由度独立管理两张表的region,独立进行region的拆分,保持负载均衡。

  • 二级索引的热点

我们根据查询条件有哪些字段,构建出二级索引,二级索引的值就是数据表的row key。那么对于经常执行的查询条件,会集中访问二级索引的一部分行,就造成了二级索引的热点区域。

举个例子,以时间戳作为二级索引的key,支持时间范围查找,那么写入最新的数据、查询最新的数据,很容易导致最后一个region成为热点。

为此,我们要影响二级索引的分片策略。我学习到了两种方案:

  • 方案一:salting

在以时间戳作为二级索引的例子中,计算:

···
salt = timestamp.hashCode() % region server个数
···

将以上salt作为时间戳二级索引的前缀。这样打乱了原先的二级索引分片策略,使得负载均衡。

salt的取值范围是[0, region server个数)。 因此,查询时,我们的应用逻辑,需要对每一个salt的取值,发起一次查询请求,以salt值作为scan的row key的前缀。然后,将这些查询的结果合并返回。

salt技术有一个问题——当region server数量变化时,row key前缀中的salt没有相应更新。

  • 方案二 by 360

360公司(赵建博)提出的二级索引方案:http://blog.csdn.net/dhtx_wzgl/article/details/49069081

其核心思想是,索引和数据保证在同一张表的同一个region里。这是通过将region的start row key作为索引row key的首部前缀实现的。索引和数据,在同一行的不同column family中。当region分裂以平衡负载时,索引和数据共同分裂。二级索引的访问负载会和被索引的数据一样均衡。因为数据和它的二级索引总是在同一个region里的。

这种方案能处理region分裂、region server个数发生变化的情形。

时间: 2024-10-26 06:34:34

HBase学习笔记——避免热点Region的一些技巧的相关文章

JavaScript学习笔记之DOM基础 2.4_javascript技巧

DOM的发展,与WEB标准化的大趋势相关甚密.只有基于正确的语义逻辑,DOM才能正确地发挥其功用.如今,正确的语义结构.表现与内容分离等要求,都已经成为网页设计中的基本要求.因此,在网页前端开发中,DOM的存在,无疑是为表现层.行为层甚至内容层面的连接提供了一个绝佳的API,成为热门的Ajax应用中不可或缺的组成部分. 一.平稳退化 1.概念 早期,在未使用JavaScript之前,网页中的内容可以正常显示出来,用户可以通过外设(如鼠标)操控浏览到相关内容,这种浏览体验对用户而言可能并不理想.

JavaScript高级程序设计(第三版)学习笔记6、7章_javascript技巧

第6章面向对象的程序设计 对象 1.数据属性 configurable表示能否通过delete删除属性从而重新定义属性能否修改属性的特性或能否把属性修改为访问器属性默认为true enumerbale表示能否通过for-in访问属性默认true writable表示能否修改属性值默认true value数据存储位置默认undefined 修改默认属性特性Object.defineProperty()接收三个参数属性所在对象属性名描述符对象描述符对象属性必须是configurable.enumer

JavaScript学习笔记之数组随机排序_javascript技巧

推荐阅读:JavaScript学习笔记之数组求和方法 JavaScript学习笔记之数组的增.删.改.查 JavaScript中提供了sort()和reverse()方法对数组项重新排序.但很多时候这两个方法无法满足我们实际业务的需求,比如说扑克牌游戏中的随机洗牌. 在这篇文章一起来学习如何完成上面这个示例的效果,以及一些有关于数组随机排序的相关知识. 在网上查了一下有关于数组随机排序的相关资料,都看到了Math.random()的身影.打开浏览器控制器,输入: Math.random() 从图

JavaScript学习笔记之ES6数组方法_javascript技巧

ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代号harmony(和谐之意,显然没有跟上我国的步伐,我们已经进入中国梦版本了).上一次标准的制订还是2009年出台的ES5.目前ES6的标准化工作正在进行中,预计会在14年12月份放出正式敲定的版本.但大部分标准已经就绪,且各浏览器对ES6的支持也正在实现中. ES6给数组添加了一些新特性,而这些新特性到目前为止完全可以运用到自己的业务层.在这一节中将总结有关于ES6给数组提供一些新特性的使用方法. ES6提供

JavaScript学习笔记之数组求和方法_javascript技巧

推荐阅读:JavaScript学习笔记之数组的增.删.改.查 通过最近学习,越来越感觉JavaScript的强大与魅力之处,仅数组一个知识点就让我这样的初学者折腾了很久.折腾是折腾,但还是很有效果的,这几天的学习到的一些基本知识,就在自己的业务就用到了.顿感自信心爆棚,我也有一天能学会JavaScript. 别的不多说了,咱们今天一起来玩数组的求和,看看有哪些方法可以实现数组的求和. 数组方法 JavaScript中数组有很多种方法,下图能更好的向你阐述JavaScript有多少种方法,作用是啥

HBase学习笔记——高表与宽表的选择

hbase中的宽表是指很多列较少行,即列多行少的表,一行中的数据量较大,行数少:高表是指很多行较少列,即行多列少,一行中的数据量较少,行数大. hbase的row key是分布式的索引,也是分片的依据. hbase的row key + column family + column qualifier + timestamp + value 是HFile中数据排列依据.HFile据此,对数据的索引到data block级别,而不是行级别.所以这种key是HFile内部的粗粒度(data block

HBase学习笔记——基于HBase的日志系统的性能优化

我之前参与过一个日志系统的开发,存储用HBase.我简单罗列下用到的HBase优化,备忘.以后把它整理成更友好的介绍性文章. 系统简介 有一张大的日志数据表,保存所有日志.row key是 hash + app id + log-severity + timestamp + host等,cell保存日志正文数据. 可以看到row key的hash保证日志散列在各个region中,写入.查询的负载均衡.但是无法通过它进行范围查询,所以为不同查询模式,建立了多张索引表. 为不同的日志级别(DEBUG

Bootstrap学习笔记之css组件(3)_javascript技巧

今天我们来看看css组件效果以及其中比较重要的类,这些类都不难,关键要熟练掌握,搭配使用,灵活运用.关于前两篇中,css样式和布局的文章,大家可以在之前的文章中阅读.  一.导航组件        自己做了个导航,目前只有一级菜单,下一篇文章中,将给出二级菜单,涉及到js的插件,所以这里不在描述. <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"

Bootstrap基本组件学习笔记之下拉菜单(7)_javascript技巧

对于一些较为常用的功能模块,Bootstrap也进行了封装.包括下拉菜单.按钮组.导航.分页.缩略图.进度条等. 下面先总结下下拉菜单的使用. 直接看下面的例子: <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-w