上海网站域名备案处,pos机网站建设方案,登陆页面模板,东莞市手机网站建设多少钱1 ColumnFamily 设计
追求的原则是#xff1a;在合理的范围内能尽量少的减少列簇就尽量减少列簇。
最优设计是#xff1a;将所有相关性很强的 Key-Value 都放在同一个列簇下#xff0c;这样既能做到查询效率最高#xff0c;也能保持尽可能少的访问不同的磁盘文件。
以用…1 ColumnFamily 设计
追求的原则是在合理的范围内能尽量少的减少列簇就尽量减少列簇。
最优设计是将所有相关性很强的 Key-Value 都放在同一个列簇下这样既能做到查询效率最高也能保持尽可能少的访问不同的磁盘文件。
以用户信息为例可以将必须的基本信息存放在一个列簇而一些附加的额外信息可以放在另一个列簇。 2 RowKey 设计
HBase 中表会被划分为 1...n 个 Region被托管在 RegionServer 中。Region 两个重要的属性StartKey 与 EndKey 表示这个 Region 维护的 RowKey 范围当我们要读/写数据时如果 RowKey 落在某个 Start-end Key 范围内那么就会定位到目标 Region 并且读/写到相关的数据。
那怎么快速精准的定位到想要操作的数据就在于 RowKey 的设计。 3. RowKey 设计三原则
3.1 RowKey 长度原则
RowKey 是一个二进制码流RowKey 的长度被很多开发者建议说设计在 10-100 个字节建议是越短越好不要超过 16 个字节。原因如下
数据的持久化文件 HFile 中是按照 KeyValue 存储的如果 RowKey 过长比如 100 个字节如果有 1000 万行数据光 RowKey 就要占用 100 * 1000 万 10 亿字节将近 1G 数据这会极大的影响 HFile 的存储效率。MemStore 将缓存部分数据到内存当中如果 RowKey 字段过长内存的有效利用率就会降低系统将无法缓存更多的数据从而降低数据检索效率。因此 RowKey 的字节长度越短越好。目前操作系统都是 64 位系统内存 8 字节对齐。控制在 16 个字节是 8 字节的整数倍利用操作系统的最佳特性。3.2 RowKey 散列原则
如果 RowKey 是按时间戳的方式递增不要将时间放在二进制码的前面建议将 RowKey 的高位作为散列字段由程序循环生成低位放时间字段这样将提高数据均衡分布在每个 RegionServer 实现负载均衡的几率。如果没有散列字段首字段直接是时间信息将产生所有新数据都在一个 RegionServer 上堆积的热点现象这样在做数据检索的时候负载会集中到个别的 RegionServer降低查询效率。 3.3 RowKey 唯一原则
必须在设计上保证其具有唯一性。RowKey 是按照字典顺序进行排序存储的因此设计 RowKey 的时候要充分利用这个排序特点将经常读取的数据存储到一个 Region 中将最近可能会被访问的数据放到一起。 数据热点
HBase 中的行是按照 RowKey 的字典顺序进行排序的这种设计优化了 scan 操作可以将相关的行以及会被一起读取的行存储在临近的位置便于 scan 操作。然而糟糕的 RowKey 设计是热点的源头。大量访问会使热点 Region 所在的单个节点超出自身承受能力引起性能下降甚至 Region 不可用由于主机无法提供其它 Region 的请求这也会影响同一个 RegionServer 上的其它的 Region 的访问。设计良好的数据访问模式以使集群被充分和均衡的利用。为了避免写热点设计 RowKey 使得不同行在同一个 Region但是在更多数据情况下数据应该被写入集群的多个 Region而不是一个 Region。 防止数据热点的有效措施
1. 加盐
这里所说的加盐不是密码学中的加盐而是在 RowKey 的前面都加随机数就是给 RowKey 分配一个随机前缀以使得它和之前的 RowKey 的开头不同。分配的前缀各类数量应该和要使数据分散到的 Region 的数量一致。加盐之后的 RowKey 就会根据随机生成的前缀分散到各个 Region 上以避免数据热点的现象产生。
2. 哈希
哈希会使同一行永远用一个前缀加盐。哈希也可以使负载分散到整个集群但是读却是可以预测的。使用确定的哈希可以让客户端重构完整的 RowKey可以使用 get 操作准确获取某一行的数据。
3. 反转
第三种防止热点的方法是反转固定升序或者数字格式的 Rowkey。这样就可以使得 RowKey 中经常改变的部分最没有意义的部分放在前面。这样可以有效的产生随机的 Rowkey但是牺牲了 RowKey 的有序性。
反转 RowKey 的例子以手机号为 RowKey可以将手机号反转看到啦字符串作为 RowKey这样就避免了以手机号那样比较固定的开头导致热点的问题。
4. 时间戳反转
一个常见的数据处理问题是快速获取数据的最近版本使用反转的时间戳作为 RowKey 的一部分对这个问题十分有用可以用 Long.Max_Value-timestamp 追加到 Key 的末尾例如 [key][reverse_timestamp][key] 的最新值可以通过 scan [key] 获得 [key] 的第一条记录因为 HBase 中 RowKey 是有序的第一条记录是最后录入的数据。比如需要保存一个用户的操作记录按照操作时间倒序排序在设计 RowKey 的时候可以这样设计 [userId 反转][Long.Max_Value-timestamp]在查询用户的所有操作记录数据的时候直接指定反转后的 userIDstartRow 是 [userID 反转][000000000000]stopRow 是 [userID 反转][Long.Max_Value-timestamp]。如果需要查询某段时间的操作记录startRow 是 [user 反转][Long.Max_Value - 起始时间]stopRow 是[userID 反转][Long.Max_Value - 结束时间]