hbase 所谓的三维有序存储的三维是指:rowkey(行主键),column key(columnFamily+qualifier),timestamp(工夫戳)三局部组成的三维有序存储。
rowkey 是行的主键,而且 hbase 只能用个 rowkey,或者一个 rowkey 范畴即 scan 来查找数据。所以 rowkey 的设计是至关重要的,关系到你应用层的查问效率。
rowkey 是以字典程序排序的,存储的是字节码。
Rowkey 设计准则
1.Rowkey 的惟一准则
必须在设计上保障其唯一性。因为在 HBase 中数据存储是 Key-Value 模式,若 HBase 中同一表插入雷同 Rowkey,则原先的数据会被笼罩掉(如果表的 version 设置为 1 的话),所以务必保障 Rowkey 的唯一性.
2.Rowkey 的排序准则
HBase 的 Rowkey 是依照 ASCII 有序设计的,咱们在设计 Rowkey 时要充分利用这点。比方视频网站上对影片《泰坦尼克号》的弹幕信息,这个弹幕是依照工夫倒排序展现视频里,这个时候咱们设计的 Rowkey 要和工夫程序相干。能够应用 ”Long.MAX_VALUE – 弹幕发表工夫 ” 的 long 值作为 Rowkey 的前缀。
3.Rowkey 的散列准则
咱们设计的 Rowkey 应平均的散布在各个 HBase 节点上。拿常见的工夫戳举例,如果 Rowkey 是按零碎工夫戳的形式递增,Rowkey 的第一局部如果是工夫戳信息的话将造成所有新数据都在一个 RegionServer 上沉积的热点景象,也就是通常说的 Region 热点问题,热点产生在大量的 client 间接拜访集中在个别 RegionServer 上(拜访可能是读,写或者其余操作),导致单个 RegionServer 机器本身负载过高,引起性能降落甚至 Region 不可用,常见的是产生 jvm full gc 或者显示 region too busy 异样情 况,当然这也会影响同一个 RegionServer 上的其余 Region。
Region 热点问题
1、Reverse 反转 针对固定长度的 Rowkey 反转后存储,这样能够使 Rowkey 中常常扭转的局部放在最后面,能够无效的随机 Rowkey。
反转 Rowkey 的例子通常以手机举例,能够将手机号反转后的字符串作为 Rowkey,这样的就防止了以手机号那样比拟固定结尾 (137x、15x 等) 导致热点问题,这样做的毛病是就义了 Rowkey 的有序性。
2、Salt 加盐 Salt 是将每一个 Rowkey 加一个前缀,前缀应用一些随机字符,使得数据扩散在多个不同的 Region,达到 Region 负载平衡的指标。
比方在一个有 4 个 Region(注:以 [ ,a)、[a,b)、[b,c)、[c,)为 Region 起至)的 HBase 表中,加 Salt 前的 Rowkey:abc001、abc002、abc003 咱们别离加上 a、b、c 前缀,加 Salt 后 Rowkey 为:a-abc001、b-abc002、c-abc003
能够看到,加盐前的 Rowkey 默认会在第 2 个 region 中,加盐后的 Rowkey 数据会散布在 3 个 region 中,实践上解决后的吞吐量应是之前的 3 倍。因为前缀是随机的,读这些数据时须要消耗更多的工夫,所以 Salt 减少了写操作的吞吐量,不过毛病是同时减少了读操作的开销。
3、Hash 散列或者 Mod 用 Hash 散列来代替随机 Salt 前缀的益处是能让一个给定的行有雷同的前缀,这在扩散了 Region 负载的同时,使读操作也可能推断。确定性 Hash(比方 md5 后取前 4 位做前缀)能让客户端重建残缺 RowKey,能够应用 get 操作间接 get 想要的行。
4.Rowkey 的长度准则
复制代码 Rowkey 长度设计准则:Rowkey 是一个二进制,Rowkey 的长度被很多开发者倡议说设计在 10~100 个字节,倡议是越短越好。
起因有两点:其一是 HBase 的长久化文件 HFile 是依照 KeyValue 存储的,如果 Rowkey 过长比方 500 个字节,1000 万列数据光 Rowkey 就要占用 500*1000 万 =50 亿个字节,将近 1G 数据,这会极大影响 HFile 的存储效率;
其二是 MemStore 缓存局部数据到内存,如果 Rowkey 字段过长内存的无效利用率会升高,零碎无奈缓存更多的数据,这会升高检索效率;
须要指出的是不仅 Rowkey 的长度是越短越好,而且列族名、列名等尽量应用短名字,因为 HBase 属于列式数据库,这些名字都是会写入到 HBase 的长久化文件 HFile 中去,过长的 Rowkey、列族、列名都会导致整体的存储量成倍增加。
关键词:大数据培训