- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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 - 结束时间](达到热点分散,查询又可以支持多样性)
其他一些建议
尽量削减行和列的大
您可能关注的文档
最近下载
- CYX-QEHP-39新改扩建项目环境影响控制程序B0(工厂体系文件模板).doc VIP
- 03~04_项目融资模式之BOT项目.ppt VIP
- 团章考试题及答案.doc VIP
- 2025年中考真题作文解读:此刻,你不一样(威海)(写作指导+例文展示+名师点评).docx
- 小学一年级学习计划..doc VIP
- 包头市户外广告和牌匾设置技术标准标准DB 1502T006—2020.pdf
- 网络直播带货主播能力模型构建研究.docx VIP
- 淮阴工学院班主任工作手册.doc VIP
- 2024年新改版教科版一年级上册科学全册教案教学设计(新教材专用).docx
- 2025道德与法治二年级上册全册核心素养教案教学设计.docx
文档评论(0)