rowkey设计的重要性

rowkeys是HBase表设计中唯一重要的一点。

rowkey设计要求

  • 唯一性

存储特性

  • 按照字典顺序排序存储

查询特性

由于其存储特性导致查询特性:

  • 查询单个记录;
  • 查定一定范围的记录。

可能存在的问题

  • 热点问题
什么是热点和数据倾斜
热点发生在大量的client直接访问集群的一个或极少数个节点(访问可能是读,写或者其他操作)。大量访问会使热点region所在的单个机器超出自身承受能力,引起性能下降甚至region不可用,这也会影响同一个RegionServer上的其他region,由于主机无法服务其他region的请求,造成资源浪费。设计良好的数据访问模式以使集群被充分,均衡的利用。
数据倾斜:Hbase可以被划分为多个Region,但是默认创建时只有一个Region分布在集群的一个节点上,数据一开始时都集中在这个Region,也就是集中在这一个节点上,就算region存储达到临界值时被划分,数据也是存储在少数节点上。这就是数据倾斜。

热点问题如何解决

通过多个分区来分散读写压力。

另外一次读写大量数据,也会导致机器性能问题,个人认为也可以通过分区来分散读写压力。

分区的本质

hbase相当对于一个表做水平拆分,比如范围[1,N]的数据在region1, 范围[N+1,2N]的数据在region2,依次类推,将数据分散到N个分区。

rowkey设计的几个设计技巧

  1. 加盐
  2. 前缀hash
  3. 反转(ID,如手机号)
  4. 反转时间撮Reverse Timestamps(时间撮): (Long.MAX_VALUE - timestamp) to the end of any key, e.g. [key][reverse_timestamp].

这几个设计技巧,本质就是让数据分散,避免热点问题。

分区算法

分区算法就是制定数据分散的规则,划分每个分区的边界,Determining Split Points。

HBase 1* 自带的分区算法:

  1. HexStringSplit(默认分区算法)。 左填充。RegionSplitter.HexStringSplit to partition their table and set it as default。row key是十六进制的字符串(hexadecimal ASCII)作为前缀的时候

  2. UniformSplit(hash):随机均匀分布,节省空间。如果是整形转bytes,肯定节省空间;如果是string转bytes,其实是不节省空间。右填充

    某个hbase的表查询只是以随机查询为主,可以用UniformSplit的方式进行,按照原始byte值(从0x00~0xFF)右边以00填充。以这种方式分区的表在插入的时候需要对rowkey进行一个技巧性的改造, 比如原来的rowkey为rawStr,则需要对其取hashCode,然后进行按照比特位反转后放在最初rowkey串的前面

此外还可以自定义分区算法:预分区:随机生成key,指定region的startkey、endkey。

Relationship Between RowKeys and Region Splits

Lesson #1: Pre-splitting tables is generally a best practice, but you need to pre-split them in such a way that all the regions are accessible in the keyspace. While this example demonstrated the problem with a hex-key keyspace, the same problem can happen with any keyspace. Know your data.
预分区是最佳实践,但是需要对于所有region的访问都在key空间中。 Lesson #2: While generally not advisable, using hex-keys (and more generally, displayable data) can still work with pre-split tables as long as all the created regions are accessible in the keyspace.
当通常的方案(预分区)做不到,可以采用十六进制key。

最好先将int 转成 byte[]。 byte[] b = String.format("%016x", key).getBytes();

如何根据实际场景来设计rowkey

此处可参考《滴滴HBASE使用经验》

其他

如果将时序数据存入HBase,可以研究OpenTSDB方案。

参考文献

hbase实践之rowkey设计的更多相关文章

  1. hbase实践之Rowkey设计之道

    笔者从一开始接触hbase就在思考rowkey设计,希望rowkey设计得好,能够支持查询的需求.使用hbase一段时间后,再去总结一些hbase的设计方法,无外乎以下几种: reverse salt ...

  2. Hbase 表的Rowkey设计避免数据热点

    一.案例分析 常见避免数据热点问题的处理方式有:加盐.哈希.反转等方法结合预分区使用. 由于目前原数据第一字段为时间戳形式,第二字段为电话号码,直接存储容易引起热点问题,通过加随机列.组合时间戳.字段 ...

  3. Hadoop HBase概念学习系列之RowKey设计(二十九)

    HBase里的RowKey设计,分为随机查询的RowKey设计和连续查询的RowKey设计.

  4. Hbase Rowkey设计

    转自:http://www.bcmeng.com/hbase-rowkey/ 建立Schema Hbase 模式建立或更新可以通过 Hbase shell 工具或者使用Hbase Java API 中 ...

  5. HBase的RowKey设计原则

    HBase是三维有序存储的,通过rowkey(行键),column key(column family和qualifier)和TimeStamp(时间戳)这个三个维度可以对HBase中的数据进行快速定 ...

  6. 大数据性能调优之HBase的RowKey设计

    1 概述 HBase是一个分布式的.面向列的数据库,它和一般关系型数据库的最大区别是:HBase很适合于存储非结构化的数据,还有就是它基于列的而不是基于行的模式. 既然HBase是采用KeyValue ...

  7. HBase Rowkey 设计指南

    为什么Rowkey这么重要 RowKey 到底是什么 我们常说看一张 HBase 表设计的好不好,就看它的 RowKey 设计的好不好.可见 RowKey 在 HBase 中的地位.那么 RowKey ...

  8. Hbase rowkey设计+布隆过滤器+STORE FILE & HFILE结构

    Rowkey设计 Rowkey设计原则 Rowkey设计应遵循以下原则: 1.Rowkey的唯一原则 必须在设计上保证其唯一性.由于在HBase中数据存储是Key-Value形式,若HBase中同一表 ...

  9. HBase之六:HBase的RowKey设计

    数据模型 我们可以将一个表想象成一个大的映射关系,通过行健.行健+时间戳或行键+列(列族:列修饰符),就可以定位特定数据,Hbase是稀疏存储数据的,因此某些列可以是空白的, Row Key Time ...

随机推荐

  1. Js 集合运用

    1.给定一个单词good  要求输入 g1 o2 d1 (字母+加字母个数) 方法一: <script type="text/javascript"> var arrO ...

  2. eNSP——Hybrid接口的应用

    原理: Hybrid接口既可以连接普通终端的接入链路又可以连接交换机间的干道链路,它允许多个VLAN的帧通过,并可以在出接口方向将某些VLAN帧的标签剥掉. Hybrid接口处理VLAN帧的过程如下: ...

  3. LeetCode 第 165 场周赛

    LeetCode 第 165 场周赛 5275. 找出井字棋的获胜者 5276. 不浪费原料的汉堡制作方案 5277. 统计全为 1 的正方形子矩阵 5278. 分割回文串 III C 暴力做的,只能 ...

  4. 为什么要使用 SPL中的 SplQueue实现队列

    今天看php的SPL标准库部分里面涉及到数据结构其中有 SplQueue 来实现队列效果,但是我刚接触php的时候学习到的是 使用array的 array_push 和 array_pop 就可以实现 ...

  5. 【Python基础】08_Python中的列表

    1.列表的定义 List(列表)是Python中使用的 最频繁 的数据类型,其他语言通常叫数组 专门用于存储 一串信息 列表用 [] 定义,数据 之间用 , 分割 列表的 索引(位置) 从 0 开始 ...

  6. kubernetes kubeadm安装v1.14

    1.我们这里准备两台Centos7的主机用于安装,后续节点可以根究需要添加即可:master node01两台都得改:cat /etc/hosts192.168.71.134 master192.16 ...

  7. hdu 2610 2611 dfs的判重技巧

    对于全排列枚举的数列的判重技巧 1:如果查找的是第一个元素 那么 从0开始到当前的位置看有没有出现过这个元素 出现过就pass 2: 如果查找的不是第一个元素 那么 从查找的子序列当前位置的前一个元素 ...

  8. SQL将多行数据合并成一行【转】

    转:https://blog.csdn.net/AntherFantacy/article/details/83824182 今天同事问了一个需求,就是将多行数据合并成一行进行显示,查询了一些资料,照 ...

  9. wepy2.0中使用vant-weapp组件

    npm i vant-weapp -S --production 在项目下的package.json下看是否有了vant字段 最最最重要的,在引入的时候通过module映入 <config> ...

  10. 安卓开发之ListView入门

    <!--这个地方最好用match_parent 这样效率高--> <ListView android:layout_width="match_parent" an ...