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个数发生变化的情形。

相关实践学习
云数据库HBase版使用教程
  相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情: https://cn.aliyun.com/product/hbase   ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
存储 SQL 自然语言处理
基于 HBase 的海量数据查询与检索解析|学习笔记
快速学习基于 HBase 的海量数据查询与检索解析
841 0
基于 HBase 的海量数据查询与检索解析|学习笔记
|
4月前
|
SQL 分布式计算 Hadoop
Hadoop学习笔记(HDP)-Part.16 安装HBase
01 关于HDP 02 核心组件原理 03 资源规划 04 基础环境配置 05 Yum源配置 06 安装OracleJDK 07 安装MySQL 08 部署Ambari集群 09 安装OpenLDAP 10 创建集群 11 安装Kerberos 12 安装HDFS 13 安装Ranger 14 安装YARN+MR 15 安装HIVE 16 安装HBase 17 安装Spark2 18 安装Flink 19 安装Kafka 20 安装Flume
82 1
Hadoop学习笔记(HDP)-Part.16 安装HBase
|
9月前
|
存储 分布式计算 监控
分布式数据库HBase的基本概念和架构之基本架构的Region Server
分布式数据库HBase是一个开源的分布式数据库系统,是Apache Hadoop生态系统的重要组成部分。
352 0
|
存储 前端开发 Cloud Native
基于 HBase 快速构架海量订单存储系统|学习笔记
快速学习基于 HBase 快速构架海量订单存储系统
346 0
基于 HBase 快速构架海量订单存储系统|学习笔记
|
SQL 存储 边缘计算
HBase&Hive 2(三)|学习笔记
快速学习 HBase&Hive 2(三)
107 0
HBase&Hive 2(三)|学习笔记
|
SQL 存储 分布式计算
HBase&Hive 2(二)|学习笔记
快速学习 HBase&Hive 2(二)
77 0
HBase&Hive 2(二)|学习笔记
|
存储 SQL 分布式计算
HBase&Hive 2(一)|学习笔记
快速学习 HBase&Hive 2(一)
96 0
HBase&Hive 2(一)|学习笔记
|
存储 SQL 缓存
HBase&HIve 1|学习笔记
快速学习 HBase&HIve 1
143 0
HBase&HIve 1|学习笔记
|
SQL 消息中间件 存储
基于 HBase 的大数据在线分析|学习笔记
快速学习基于 HBase 的大数据在线分析
337 0
基于 HBase 的大数据在线分析|学习笔记
|
存储 搜索推荐 Java
如何基于 HBase 构建图片、视频数据的统一存储检索方案|学习笔记
快速学习如何基于 HBase 构建图片、视频数据的统一存储检索方案
746 0
如何基于 HBase 构建图片、视频数据的统一存储检索方案|学习笔记