头歌实践教学平台:大数据存储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十四上答案》有任何问题都可以随时关注私信

相关新闻

最新新闻

STM32F030上LwIP TCP服务崩溃?结构体对齐是元凶

STM32F030上LwIP TCP服务崩溃?结构体对齐是元凶

先说个结论:如果只是 TCP Echo Server 跑通一次收发,你大概率遇不到这篇文章要聊的问题;真正让人头疼的是程序稳定运行几分钟后突然崩溃,或者把报文长度一加大就必然崩,而抓包工具里的报文看起来完全正常。我这次就是被…

2026/8/31 22:41:03
跨境电商批量图片翻译工具推荐:一键搞定商品图与字幕

跨境电商批量图片翻译工具推荐:一键搞定商品图与字幕

跨境电商批量图片翻译工具推荐:一键搞定商品图与字幕问题引入:跨境卖家的图片困境作为亚马逊、eBay或独立站卖家,上架新品时是否遇到过这样的场景:仓库里堆着200款新产品,每款都需要将英文商品图翻译成德语、法语、日语…

2026/8/31 22:41:03
LPL骑士之路排名博弈:Python模拟赛果如何影响IG争一?

LPL骑士之路排名博弈:Python模拟赛果如何影响IG争一?

当 NIP 以 2-1 战胜 WBG 之后,LPL 赛评圈最热门的话题不是某局比赛的某个操作,而是朱开的一句锐评:他希望 WBG 能赢,因为骑士之路第一绝对比第二好,IG 要力争第一,一定是希望 WBG 赢 NIP,粉丝应…

2026/8/31 22:41:03
OpenClaw部署与实战:模型配置、Skill开发及Agent多平台接入

OpenClaw部署与实战:模型配置、Skill开发及Agent多平台接入

OpenClaw 最近在 AI Agent 圈的讨论里出现频率不低。它不是单一的大模型,也不是普通的聊天前端,而是一套覆盖模型接入、Agent 编排、多平台消息交互和技能扩展的构建框架。团队对外聊得最多的,不是某个算法多强,而是“构建”两个字…

2026/8/31 22:41:03
基于OpenCV的答题卡图像识别与检测系统:从预处理到评分实战解析

基于OpenCV的答题卡图像识别与检测系统:从预处理到评分实战解析

简介:本资源是一套面向计算机专业本科生的毕业设计/课程设计级答题卡图像识别与检测系统实现方案,聚焦教育场景下的自动化阅卷需求,解决传统人工判卷效率低、易出错等实际问题。压缩包共17个文件,含14张答题卡实拍样本图&#xff…

2026/8/31 22:41:03
基于OV7670和FIFO的TFT实时预览:嵌入式显示调试实战

基于OV7670和FIFO的TFT实时预览:嵌入式显示调试实战

最近在调一个Camera demo project for testing TFT preview,说白了,就是让摄像头把画面实时送到TFT彩屏上显示。这个项目听起来不像什么大工程,但真做起来,从摄像头输出格式、FIFO缓冲、SPI传输到屏幕刷新,每一环都能让…

2026/8/31 22:36:03