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

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
大数据功能调优之HBase的RowKey设计 rowkey是一个二进制码流,可以是任意字符串,最大长度?64kb?,实际应用中一般为10-100bytes,以?byte[]?方式保存,一般设计成定长。 建议越短越好,不要超过16个字节,缘由如下: 数据的长久化文件HFile中是依据KeyValue存储的,假如rowkey过长,比如超过100字节,1000w行数据,光rowkey就要占用100*1000w=10亿个字节,将近1G数据,这样会极大影响HFile的存储效率; MemStore将缓存部分数据到内存,假如rowkey字段过长,内存的有效利用率就会降低,系统不能缓存更多的数据,这样会降低检索效率。 目前操作系统都是64位系统,内存8字节对齐,把握在16个字节,8字节的整数倍利用了操作系统的最佳特性 rowkey散列准绳 假如rowkey依据时间戳的方式递增,不要将时间放在二进制码的前面,建议将rowkey的高位作为散列字段,由程序随机生成,低位放时间字段,这样将提高数据均衡分布在每个RegionServer,以实现负载均衡的几率。假如没有散列字段,首字段直接是时间信息,全部的数据都会集中在一个RegionServer上,这样在数据检索的时候负载会集中在个别的RegionServer上,形成热点问题,会降低查询效率。 rowkey独一准绳 必需在设计上保证其独一性,rowkey是依据字典挨次排序存储的,因而,设计rowkey的时候,要充分利用这个排序的特点,将经常读取的数据存储到一块,将最近可能会被访问的数据放到一块。 什么是热点 HBase中的行是依据rowkey的字典挨次排序的,这种设计优化了scan操作,可以将相关的行以及会被一起读取的行存取在接近位置,便于scan。然而蹩脚的rowkey设计是热点的源头。 热点发生在大量的client直接访问集群的一个或极少数个节点(访问可能是读,写或者其他操作)。大量访问会使热点region所在的单个机器超出本身承受力量,引起功能下降甚至region不行用,这也会影响同一个RegionServer上的其他region,由于主机无法服务其他region的恳求。 设计良好的数据访问模式以使集群被充分,均衡的利用。 为了避开写热点,设计rowkey使得不同行在同一个region,但是在更多数据情况下,数据应当被写入集群的多个region,而不是一个。 下面是一些常见的避开热点的方法以及它们的优缺点: 加盐 这里所说的加盐不是密码学中的加盐,而是在rowkey的前面添加随机数,具体就是给rowkey安排一个随机前缀以使得它和之前的rowkey的开头不同。安排的前缀品种数量应当和你想使用数据分散到不同的region的数量全都。加盐之后的rowkey就会依据随机生成的前缀分散到各个region上,以避开热点。 哈希 哈希会使同一行永久用一个前缀加盐。哈希也可以使负载分散到整个集群,但是读却是可以猜测的。使用确定的哈希可以让客户端重构完整的rowkey,可以使用get操作精确?????猎取某一个行数据 反转 第三种防止热点的方法时反转固定长度或者数字格式的rowkey。这样可以使得rowkey中经常转变的部分(最没有意义的部分)放在前面。这样可以有效的随机rowkey,但是牺牲了rowkey的有序性。 反转rowkey的例子以手机号为rowkey,可以将手机号反转后的字符串作为rowkey,这样的就避开了以手机号那样比较固定开头导致热点问题 时间戳反转 一个常见的数据处理问题是快速猎取数据的最近版本,使用反转的时间戳作为rowkey的一部分对这个问题格外有用,可以用?Long.Max_Value - timestamp?追加到key的末尾,例如?[key][reverse_timestamp]?,?[key]?的最新值可以通过scan [key]获得[key]的第一条记录,由于HBase中rowkey是有序的,第一条记录是最终录入的数据。 比如需要保存一个用户的操作记录,依据操作时间倒序排序,在设计rowkey的时候,可以这样设计 [userId反转][Long.Max_Value - timestamp],在查询用户的全部操作记录数据的时候,直接指定反转后的userId,startRow是[userId反转][000000000000],stopRow是[userId反转][Long.Max_Value - timestamp] 假如需要查询某段时间的操作记录,startRow是[user反转][Long.Max_Value - 起始时间],stopRow是[userId反转][Long.Max_Value - 结束时间](达到热点分散,查询又可以支持多样性) 其他一些建议 尽量削减行和列的大

文档评论(0)

liuxiyuliuxingyu + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档