最具影响力的数字化技术在线社区

168大数据

 找回密码
 立即注册

QQ登录

只需一步,快速开始

1 2 3 4 5
打印 上一主题 下一主题
开启左侧

谈笑间学会-Hbase Rowkey设计

[复制链接]
跳转到指定楼层
楼主
发表于 2021-10-29 20:28:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多数据大咖,获取更多知识干货,轻松玩转大数据

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
1、为什么Rowkey这么重要1.1、Rowkey是什么
  • 类似于MySQL、Oracle中的主键,用于标示唯一的行
  • 完全是由用户指定的一串不重复的字符串;
  • Hbase中的数据永远数据根据Rowkey的字典排序来排序的。

1.2、Rowkey的作用
  • 读写数据通过Rowkey找到对应的Region;
  • MemStore中的数据按RowKry字典顺序排序;
  • HFile中的数据按Rowkey字典顺序排序
1.3、Rowkey对查询的影响举个栗子—Rowkey : uid+phone+name
  • 很好支持的数据的检索
    • uid = 001 AND phone=12345678901 AND name = zhang
    • uid = 001 AND phone=123?
    • uid = 001
  • 不太好支持的数据的检索
    • phone=12345678901 AND name = zhang
    • phone=12345678901
    • name = zhang

1.4、Rowkey对Region划分的影响
Hbase表的数据是按照Rowkey来分散到不同的Region,不合理的Rowkey设计会导致热点问题的产生。
热点问题是大量的Client直接访问集群的一个或极少数节点,而集群中其他节点处于相对空闲状态。
2、Rowkey设计技巧2.1、Rowkey的设计-Salting
  • Salting的原理是将固定长度的随机数放在行键起始处
  • 优缺点
    • 由于前缀随机生成,因而如果想要按照字典顺序找到这些行,则需要做更多的工作。从这个角度上看,salting增加了写操作的吞吐量,却也增大了读操作的开销。

2.2、Rowkey的设计 - Hashing
  • Hashing 的原理是计算Rowkey的hash值,然后取hash的部分字符串和原来的Rowkey进行拼接
  • 优缺点
    • 可以一定程度打散整个数据集,但是不利于scan操作;
      • 比如使用md5算法来计算Rowkey的md5值,然后截取前几位字符串,如下:
      • substring(MD5(设备ID),0,x)+ 设备ID,其中x一般取5或6


2.3、Rowkey的设计 - Reversing
  • Reversing的原理是反转一段固定长度或者全部的键
  • 优缺点
    • 有效打乱了行键,却牺牲了行排序的属性

2.4、Rowkey的长度
  • Rowkey可以是任意的字符串,最大长度是64KB。建议越短越好,原因如下
    • 数据的持久化文件HFile是按照KeyValue存储的,如果rowkey过长,比如超过100字节,1000w行数据,rowkey就要占用100*1000w = 10亿个字节,将近1G数据,这样会极大影响HFile的存储效率;
    • MemStore将缓存部分数据到内存,如果rowkey字段过长,内存的有效利用率就会降低,系统不能缓存更多的数据,这样会降低检索效率;
    • 目前操作系统都是64位系统,系统8字节对齐,控制在16个字节,8字节的整数倍利用了操作系统的最佳特性。

3、Rowkey设计案例剖析3.1、交易类表Rowkey设计-1
  • 查询某个卖家某段时间内的交易记录
    • sellerId + timestamp + orderId
  • 查询某个买家某段时间内的交易记录
    • buyId + timestamp + orderId
  • 根据订单号查询
    • orderNo

3.2、交易类表Rowkey设计-1
  • 如果某个商家卖了很多商品,怎么设计Rowkey实现快速搜索?
    • salt + sellerId + timestamp 其中,slat是随机数。
  • 可与支持的场景:
    • 全表Scan
    • 按照sellerId查询
    • 按照sellerId + timestamp 查询

3.3、金融风控Rowkey设计
  • 查询某个用户的用户画像数据
    • prefix + uid
    • prefix + idcard
    • prefix +tele

其中prefix = substr(md5(uid),0,x)
3.4、车联网Rowkey设计
  • 查询某辆车在某个时间范围的交易记录
    • carId + timestamp
  • 某批次的车太多,造成热点
    • prefix + carId + timestamp

其中prefix = substr(md5(uid),0,x)
3.5、倒序时间戳
  • 查询用户最新的操作记录或者查询用户某段时间的操作记录
    • uid + Long.Max_Value - timestamp
  • 查询用户最新的操作记录
    • Scan 【uid】 startRow 【uid】【000000000000】stopRow 【uid】【Long.Max_Value - timestamp】
  • 查询用户某段时间的操作记录
    • Scan 【uid】 startRow 【uid】【Long.Max_Value - startTime】stopRow 【uid】【Long.Max_Value - endTime】

3.6、OpenTSDB的Rowkey设计-1
  • OpenTSDB定义每个时间序列数据需要包含以下属性
    • 指标名称
    • 时间戳(毫秒或者秒精度)
    • 一组标签

hm
3.6、OpenTSDB的Rowkey设计-2
  • OpenTSDB提供查询功能
    • 指定指标名称和时间范围,给定一个或多个标签名称和标签的值作为条件,查询所有的数据。
  • a. proc.loadavg.1m (host=, pool=)(1436331600 <= timestamp < 1436335200):
    • 查询13点到14点之间,所有机器所有pool上的虚拟文件系统负载;
  • b. proc.loadavg.1m (host=host1, pool=*)(1436331600 <= timestamp < 1436335200):
    • 查询13点到14点之间,host1机器所有pool上的虚拟文件系统负载;
  • c. proc.loadavg.1m (host=host1, pool=0)(1436331600 <= timestamp < 1436335200):
    • 查询13点到14点之间, host1机器pool=0的虚拟文件系统负载。

3.6、OpenTSDB的Rowkey设计-3
  • OpenTSDB的Rowkey:slat + metric_uid + timetamp + tagk1 + tagv1 + [tankN + tagvN]
3.7、Hbase二级索引
  • 为什么需要二级索引?
  • 需求:如何查询phone = 1311111111 的用户呢?
    • 创建二级索引呗?何为二级索引呢?其实就是根据自己的数据过滤条件,创建中间表,索引值为主表Rowkey即可。

  • SQL + OLTP + 二级索引 => Phoenix
  • 全文检索 + 二级索引 => Solr / Es






版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/MrZhangBaby/article/details/107811386



楼主热帖
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 赞 踩

168大数据 - 论坛版权1.本主题所有言论和图片纯属网友个人见解,与本站立场无关
2.本站所有主题由网友自行投稿发布。若为首发或独家,该帖子作者与168大数据享有帖子相关版权。
3.其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和168大数据的同意,并添加本文出处。
4.本站所收集的部分公开资料来源于网络,转载目的在于传递价值及用于交流学习,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。
5.任何通过此网页连接而得到的资讯、产品及服务,本站概不负责,亦不负任何法律责任。
6.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源,若标注有误或遗漏而侵犯到任何版权问题,请尽快告知,本站将及时删除。
7.168大数据管理员和版主有权不事先通知发贴者而删除本文。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

关于我们|小黑屋|Archiver|168大数据 ( 京ICP备14035423号|申请友情链接

GMT+8, 2024-5-2 14:46

Powered by BI168大数据社区

© 2012-2014 168大数据

快速回复 返回顶部 返回列表