RowKey的设计需要遵守以下三个原则:
1.Rowkey的唯一原则
必须在设计上保证其唯一性。由于在HBase中数据存储是Key-Value形式,若HBase中同一表插入相同Rowkey,则原先的数据会被覆盖掉(如果表的version设置为1的话),所以务必保证Rowkey的唯一性

  1. Rowkey的排序原则
    HBase的Rowkey是按照ASCII有序设计的,我们在设计Rowkey时要充分利用这点。比如视频网站上对影片《泰坦尼克号》的弹幕信息,这个弹幕是按照时间倒排序展示视频里,这个时候我们设计的Rowkey要和时间顺序相关。可以使用"Long.MAX_VALUE - 弹幕发表时间"的 long 值作为 Rowkey 的前缀
  2. Rowkey的散列原则
    我们设计的Rowkey应均匀的分布在各个HBase节点上。拿常见的时间戳举例,假如Rowkey是按系统时间戳的方式递增,Rowkey的第一部分如果是时间戳信息的话将造成所有新数据都在一个RegionServer上堆积的热点现象,也就是通常说的Region热点问题, 热点发生在大量的client直接访问集中在个别RegionServer上(访问可能是读,写或者其他操作),导致单个RegionServer机器自身负载过高,引起性能下降甚至Region不可用,常见的是发生jvm full gc或者显示region too busy异常情况,当然这也会影响同一个RegionServer上的其他Region

案列1
表中存储的是文件信息,每个文件有5个属性:文件id(long,全局唯一)、创建时间(long)、文件名(String)、分类名(String)、所有者(User)

Row操作 spark row-key_时间戳

查询条件:文件创建时间区间(比如从20120901到20120914期间创建的文件),文件名(“中国好声音”),分类(“综艺”),所有者(“浙江卫视”)。

UserID:1代表 浙江卫视; 2代表 好声音剧组; 3代表 XX微博; 4代表 赞助商。

因此rowKey的设计:userId+createTime+fileId 每个row的长度都需要对应,fileId的作用避免当UserID与CreateTime相同时的两个不同文件记录相互覆盖

搜索范围则是:setStartRow(00000120120901),setEndRow(00000120120914)。

避免数据热点的方法(即避免数据倾斜的方式)

Row操作 spark row-key_hbase_02


Row操作 spark row-key_数据倾斜_03


Row操作 spark row-key_文件名_04