头歌实践教学平台:大数据存储2023(十四上)
十四、HBase 数据库设计之 RowKey第1关金融类 RowKey 设计任务描述本关任务完成金融类RowKey设计与查询某个卖家某段时间内的交易记录需求。相关知识为了完成本关任务你需要掌握如何设计RowKey。为什么要设计 RowKey对于任何系统的数据设计我们都想提高性能达到资源最大化利用那么 HBase也不例外。HBase由于其存储和读写高性能在实时查询中越来越发挥重要的作用但是由于其属于NoSql数据库对于关系型数据并不适用。HBase查询只能通过其 RowKey来查询我们可以认为是HBase中表的唯一索引。所以RowKey的设计在使用HBase的设计中尤为重要另外RowKey设计也关乎到数据库中数据的存放位置若RowKey设计不当在HBase分区中会引发数据热点hotspot问题出现即数据访问集中在某个节点或者Region最终会导致性能降低或者Region由于负载大而宕机。综上所述RowKey的设计关乎Hbase的性能也就是RowKey设计的好能让Hbase快如闪电反之就是蜗步龟移了(ノ▽)。Hbase RowKey 的特性HBase中的数据是按照RowKey的ASCII字典顺序进行全局排序的,有伙伴可能对ASCII字典序印象不够深刻下面举例说明假如有5个RowKey 012、0、123、234、3按ASCII字典排序后的结果为0、012、123、234、3。RowKey排序时会先比对两个RowKey的第一个字节如果相同然后会比对第二个字节依次类推... 对比到第X个字节时已经超出了其中一个 RowKey的长度短的RowKey排在前面。RowKey 设计原则RowKey 唯一原则RowKey必须在设计上保证其唯一性。由于在HBase中数据存储是Key-Value 形式若HBase中同一表插入相同RowKey 则原先的数据会被覆盖掉(如果表的version设置为1的话)所以务必保证RowKey的唯一性RowKey 排序原则HBase的RowKey是按照ASCII有序设计的我们在设计RowKey时要充分利用这点。比如视频网站上对影片《秒速五厘米》的弹幕信息这个弹幕是按照时间倒排序展示视频里这个时候我们设计的RowKey要和时间顺序相关。RowKey 长度原则RowKey长度设计原则RowKey是一个二进制RowKey的长度被很多开发者建议说设计在10~100个字节建议是越短越好。原因有两点其一是HBase的持久化文件HFile是按照KeyValue存储的如果 RowKey 过长比如500个字节1000万列数据光RowKey就要占用500*1000万50亿个字节将近1G数据这会极大影响HFile的存储效率其二是MemStore缓存部分数据到内存如果RowKey字段过长内存的有效利用率会降低系统无法缓存更多的数据这会降低检索效率需要指出的是不仅RowKey的长度是越短越好而且列族名、列名等尽量使用短名字因为RowKey属于列式数据库这些名字都是会写入到RowKey的持久化文件HFile中去过长的RowKey、列族、列名都会导致整体的存储量成倍增加。RowKey 散列原则我们设计的 RowKey 应均匀的分布在各个 HBase 节点上。拿常见的时间戳举例假如 RowKey 是按系统时间戳的方式递增RowKey 的第一部分如果是时间戳信息的话将造成所有新数据都在一个 RegionServer 上堆积的热点现象也就是通常说的 Region 热点问题 热点发生在大量的 client 直接访问集中在个别RegionServer上访问可能是读写或者其他操作导致单个 RegionServer 机器自身负载过高引起性能下降甚至 Region 不可用常见的是发生 JVM full gc 或者显示 Region too busy 异常情况当然这也会影响同一个RegionServer上的其他 Region。怎么去设计 RowKey扯了这么多关于为什么要设计 RowKey 和 RowKey 的设计原则了原则归原则实际还是看业务需求。接下来就举个“栗子”吧大家都上过淘宝购过物吧假如你需要查询你某段时间购买过的商品你会这么设计 RowKey需求查询你某段时间购买过的商品接下来我们分析下怎么设计吧从需求中提取下条件条件有用户ID你某段时间时间范围然后要得到购买的商品信息。这样乍一看用户ID跟时间要作为 RowKey然后商品信息也就是某个列中的值。总结下也就是说 RowKey 用户ID 时间戳。RowKey 设计好了代入几条数据看下效果假如用户ID是 1 到 10000那么 RowKey 就为 1 时间戳目前的时间戳都是10位数字例如 2019/8/22 17:2:34 1566464554那么 RowKey 就为 11566464554用户ID为2RowKey 就是 21566464554....用户ID为10000RowKey 就是 100001566464554这样乍一看这样设计 RowKey 的话以后查询就不好查了为什么呢 11566464554 与 100001566464554 这样一对比你知道用户ID是多少用户ID与时间戳不好区分了咋解决呢加一个分割符好办法 (o゜▽゜)o☆好主意 那么我们 RowKey 就这样设计用户ID 分隔符 时间戳1-1566464554。编程要求根据提示在右侧编辑器补充代码完成以下需求设计 RowKey完成查询某个卖家某段时间内的交易记录测试说明测试数据如下用户编号 时间戳 订单编号1 1515064954 112001 1515678778 132671 1515363367 173181 1520539421 157811 1517702149 113291 1520820749 160591 1516206693 197141 1522136442 139831 1518093870 183321 1521308196 194871 1520023763 189681 1521697722 151091 1519094744 123481 1518413486 165461 1516571214 167231 1516417717 134431 1519948703 165901 1515314924 189971 1516195465 146721 1518967628 154661 1515472993 194811 1517324315 147851 1517302088 105181 1520327833 153801 1515656084 159541 1522162277 192931 1518303404 196121 1517556496 133291 1520704805 192721 1517646487 129101 1515969882 197751 1515512748 151081 1518795707 118851 1522102275 147201 1519866837 100851 1522066556 126331 1514897937 135891 1522032410 190691 1518127959 128371 1517188604 177171 1519375040 113961 1519860294 182641 1520543919 155871 1520621655 181121 1521203438 168691 1521718590 183971 1518541784 142021 1518088216 177331 1519232115 140901 1516906294 11077功能测试查询用户ID为 1 在 1515064954 到 1515363367 时间范围的交易记录预期输出key:1-1515314924-18997 value:79981-4294135151-1key:1-1515363367-17318 value:81371-7633635151-1key:1-1515064954-11200 value:00211-4594605151-1开始你的任务吧祝你成功答案见《头歌实践教学平台大数据存储2023十四上答案》有任何问题都可以随时关注私信

相关新闻

所有的“自指统一场论“,去掉那个塞进去的数,都是同一个东西

所有的“自指统一场论“,去掉那个塞进去的数,都是同一个东西

林小黑(中国的林小黑)| 2026.08.13 这两年冒出很多"自指统一场论"。黄金比例的、拓扑的、分形的——名字一个比一个响,热闹得很。今天说一句让它们全都安静下来的话:它们都是同一个东西长出来的。那个东西,叫…

2026/11/7 14:05:23 阅读更多 →
没有SSE4.2的老CPU怎么跑微信?wine兼容方案与排错指南

没有SSE4.2的老CPU怎么跑微信?wine兼容方案与排错指南

在 Linux 上折腾微信的人,早晚会遇到一个意想不到的拦路虎:电脑太老,CPU 不支持 SSE4.2 指令集。这里的“不支持”不是性能差一点的问题,而是微信的 wine 版本一启动就崩溃,甚至 wine 本身都可能报非法指令。很多人以为…

2026/10/26 10:41:13 阅读更多 →
PrivaZer深度扫描与覆写擦除:彻底清理C盘和隐私残留

PrivaZer深度扫描与覆写擦除:彻底清理C盘和隐私残留

PrivaZer 这类工具,最值得关注的其实不是“又一款清理软件”这个身份,而是它能同时解决两件很多用户误以为是同一件事的问题:把已经删除但还能被恢复的个人数据彻底擦掉,以及把系统运行中累积出来的临时文件和缓存清掉释放 C 盘空…

2026/11/6 17:17:19 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/6 15:21:35 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/7 12:08:40 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/6 22:01:11 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/6 22:01:11 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/7 12:08:40 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/6 22:01:09 阅读更多 →

日新闻

周新闻

月新闻