HBase的RowKey设计原则含案例(全)

HBase RowKey设计原理与代码实例讲解 HBase RowKey设计原理与代码实例讲解 作者:禅与计算机程序设计艺术 / Zen and the Art of Computer Programming 1. 背景介绍 1.1 问题的由来 HBase是一个分 阅读详情

前言

HBase的RowKey的行由行键按字典顺序排序,这样的设计优化了扫描,允许存储相关的行或者那些将被一起读的邻近的行。然而,设计不好的行键是导致 hotspotting 的常见原因。当大量的客户端流量( traffic )被定向在集群上的一个或几个节点时,就会发生 hotspotting。这些流量可能代表着读、写或其他操作。流量超过了承载该地域的单个机器所能负荷的量,这就会导致性能下降并有可能造成地域的不可用。在同一 RegionServer 上的其他地域也可能会受到其不良影响,因为主机无法提供服务所请求的负载。设计使集群能被充分均匀地使用的数据访问模式是至关重要的。

为了防止在写操作时出现hotspotting,设计行键时应该使得数据尽量同时往多个RegionServer 上写,而避免只向一个RegionServer 写,除非那些行真的有必要写在一个RegionServer 里。HBase的排序问题按字典序rowkey排序,从小到大,如果任务为了获得最新的时间数据可用用时间戳反转,或者用long.maxvalue - timestamp

设计原则

按照  散列 唯一  长度 顺序

散列

散列和预分区可以放在一起 比如预先分10个region  减少热点问题

可以将id %10 做开头 但是如果id规律性强的话 可以用(id+年月日)%10

唯一

必须在设计上保证其唯一性,rowkey是按照字典顺序排序存储的,

因此,设计rowkey的时候,要充分利用这个排序的特点,可以将经常读取的数据存储到一块,将最近可能会被访问的数据放到一块。

可以用时间戳放在其中 hbase是按字典序排序 要考虑一直单分区写情况

长度

rowkey作为二进制码流最大为64kb 最好不要超过16个字节 设计过长会占memstore空间

顺序 

HBase的rowkey安装字典序顺序排列 从小到大,所以需要最新数据时需要翻转时间戳或者自增id    

可枚举属性值较少的属性放在rowkey前面

rowkey是由多个字段组合而成,这多个字段的先后次序和访问的效率有直接的关系。一个普遍的规则是:数量较少,可控的字段放在rowkey靠前位置(如eengine_type,provinc等);反之放在后面(如vin,timestamp等)。这样做的原因是可控属性放在前面,对各种不同查询需求的平衡性强一些,反之平衡性较差。

案例1:

YCK09360-60-1638290481900-9011D6L00124    434.7

YCK09360-60-1638290482900-9011D6L00124    76.1

YCK09360-60-1638290483900-9011D6L00124    18.6

YCK09360-60-1638290484900-9011D6L00124    150.1

YCK09360-60-1638290485900-9011D6L00124    96.1

YCK09360-60-1638290586900-9011D6L00124    35.7

ENGINE_TYPE 可枚举,并且数量较少,放在前面;而vin确很多,因此放在后面。这样的设计能够适应如下两种需求,复杂度都比较小:

1) 查询,某段时间内 YCK09360-60的所有数据。这种需求设置scan的startrow=‘YCK09360-60_时间戳’,endrow=‘YCK09360-60_时间戳’,即可。

2) 查询某段时间内的所有9011D6L00124 的数据。这种需求下,根据scan rowkey连续的原则,这种需求设置scan的startrow=‘YCK09360-60_时间戳_9011D6L00124 ’,endrow=‘YCK09360-60_时间戳_9011D6L00124 ’,即可。

但是,如果将vin放在前面,如下所示,适应性就差一些,如下所示案例2:

9011D6L00124-YCK09360-60-1638290481900    434.7

9011D6L00124-YCK09360-60-1638290482900    76.1

9011D6L00124-YCK09360-60-1638290483900    18.6

9011D6L00124-YCK09360-60-1638290484900    150.1

9011D6L00124-YCK09360-60-1638290485900    96.1

9011D6L00124-YCK09360-60-1638290586900    35.7

1)查询某段时间内的所有9011D6L00124 的数据。这种需求下,设置scan的startrow=‘9011D6L00124-YCK09360-60-时间戳,endrow=‘9011D6L00124-YCK09360-60-时间戳’,即可。

2) 查询某段时间内 YCK09360-60的所有数据。这种需求设置scan是要取的YCK09360-60小所有的vin号并放在rowkey的最前段,启动多个scan 去扫描多组数据

HBase的rowkey安装字典序顺序排列 从小到大,所以需要最新数据时需要翻转时间戳或者自增id  ,所以在使用时间戳字段是最好是使用long.maxvalue-timestamp/1000 ,这样保证最新的数据总是在较新的位置,方便读取

预分区的设置也是由必要的,防止数据热点问题.,可以使用hash取余的方式去关键分区字段,保证了分区均匀性

所以最后设计的方案

分区字段-标识字段-标识字段-long.maxvalue-timestamp

其他我觉得有意义的点

减少列族及减少数据存储的开销,必要时减少限定符 ,直接将数据写成单独一条,其余处理代码中进行分割. 

在HBase中,value永远和它的key一起传输的。当具体的值在系统间传输时,它的rowkey,列名,时间戳也会一起传输。如果你的rowkey和列名很大,HBase storefiles中的索引(有助于随机访问)会占据HBase分配的大量内存,因为具体的值和它的key很大。可以增加block大小使得storefiles索引再更大的时间间隔增加,或者修改表的模式以减小rowkey和列名的大小。压缩也有助于更大的索引。

控制rowkey在16个字节以下 并维持在8的整数倍,符合64位系统的8字节对齐 ,最大不要超过64位

业务访问中权重高的key放在前面

例如URLRecords表的主要用途是用来计算当天的URL访问排名。根据业务需求,需要访问某天的所有URL,因此date是主键,权重更高,放在前面,而URL则放在后面。

构造冗余数据

例如,percontent的数据包含了URL Records的数据,URL Records的数据是冗余存储的,区别在于percontent的URL放在date前面,而URL Records表的URL放在date后面。这就是由于URL在满足不同需求的时候,权重不同,由于URL Records需要的数据量不大,因此采用冗余的机制解决该矛盾。权衡需求的重要性和系统忍受度选择一种方案当两种需求有矛盾,但其中一方属于次要需求,并且在系统忍受度范围之内的话,可以舍弃一种方案。优先满足需求更强的一方

Rowkey的时间属性问题

循环key使用(1)存在问题如果rowkey中有时间属性,并且随着时间的增加,rowkey会不断的增大下去的话,会造成region数量不断地增加。如果使用TTL来控制数据的生命周期,一些老的数据就会过期,进而导致老的region数据量会逐渐减少甚至成为空的region。这样一方面region总数在不断增加,另外一方面老的region在不断的成为空的region,而空的region不会自动合并,进而造成过多空的region占用负载和内存消耗的情况。(2)解决办法这种情况下,可以使用循环key的方法来解决。思路是根据数据的生命周期设定rowkey的循环周期,当一个周期过去以后,通过时间映射的方法,继续使用老的过期数据的rowkey。例如,key的格式如下:YY-MM-DD-URL。如果数据的生命周期是一年,则可以使用MM-DD-URL的格式。这样当前一年过去以后,数据已经老化,后一年的数据可以继续写入前一年的位置,使用前一年数据的rowkey。这样可以避免空的region占用资源的情况。

根据hbase的原理,key的周期需要至少比TTL大2* hbase.hregion.majorcompaction(默认24小时)的时间,才能够保证过期的数据能够在key循环回来之前得到完全清理。按照时间周期进行建表的方式也可以解决空region的问题,和循环key方法相比较,循环key的优点如下:

操作简单,不需要重复建表,系统自动处理

同样,循环key具有如下劣势:

需要使用TTL来老化数据,可能会增加compact负担

需要保证查询操作不会查询到过期数据,否则会影响系统性能。

如果在系统压力不是特别大,需要长期运行,能够控制查询不会查询到过期数据的场景下,建议使用TTL+循环key的方式,否则建议使用按照时间周期进行建表的方式。

通过rowkey设计来控制并发度

在相同业务模式下,不同的rowkey设计系统的并发度不一样。和按天建表的思路类似,通过rowkey控制并发度的原则是激活的region总数适中,每个regionserver的激活Region数大于1,小于(写操作内存/flushsize)为宜。

为了实现这一点,可以将可枚举、数量有限的属性放在rowkey的前面,时间放在后面的方式来提高并发度;通过将大粒度的时间属性(如天、小时等)放在rowkey前面,数量很大的可枚举属性(如电话号码、URL等)放在后面的方法来控制激活的region数。

 电信手机行业案例

案例一

xx_yy_zz_时间戳

xx为分区字段 必须散列

yy 和zz为标识查询字段  若可枚举按照字段枚举个数从小到大 方便查询

时间戳为最好查询字段标识

若表的用途是为了统计当天数据 可以将年月日放入rowkey 并排在yy之前

场景题

使用场景:

电信案例:查询某个人(手机号)某年[某月某日](时间)的通话详情。

1) 预分区

(1) 评估未来半年到一年的数据增长,不让其自动分区(10G)

    (2) 确定分区键

    00| 01| 02| ...

    000| 001| ...

2) 设计RowKey

(1) 确定分区号   (散列性)

    00_ 01_ 02_...

​

手机号%分区数            不够散列

(手机号+年月日)%分区数   按照月份、年进行查询  不方便

    (手机号+年月)%分区数

(2) 拼接字段     (唯一性、长度)

    XX_手机号_时间戳

    XX_手机号_年月日 时分秒

    XX_时间戳_手机号

    XX_年月日 时分秒_手机号

(3) 校验

    13412341234 2021-09-07

    XX_手机号_年月日 时分秒

    startRow:05_13412341234_2021-09-07

    stopRow :05_13412341234_2021-09-08

            05_13412341234_2021-09-07|

    XX_年月日 时分秒_手机号

    startRow:05_2021-09-07 00:00:00_13412341234

    stopRow :05_2021-09-08 00:00:00_13412341234

​

13412341234 2021-09  2021-11

XX_手机号_年月日 时分秒

    startRow:05_13412341234_2021-09

    stopRow :05_13412341234_2021-09|

            05_13412341234_2021-10

​

    startRow:03_13412341234_2021-10

    stopRow :03_13412341234_2021-11

​

    startRow:04_13412341234_2021-11

    stopRow :04_13412341234_2021-12      

hbase的Rowkey设计方案.pdf hbase的Rowkey设计⽅案 1.1 hbase的概述 的概述 HBase由于其存储和读写的⾼性能,在OLAP即时分析中越来越发挥重要的作⽤。作为Nosql数据库的⼀员,HBase查询只能通过其 Rowkey来查询(Rowkey⽤来表⽰唯⼀⼀⾏记录),Rowkey设计的优劣直接影响读写性能。 由于HBase是通过Rowkey查询的,⼀般Rowkey上都会存⼀些⽐较关键的检索信息,我们需要提前想好数据具体需要如何查询,根据查询 ⽅式进⾏数据存储格式的设计,要避免做全表扫描,因为效率特别低。 此外易观⽅⾈也使⽤HBase做⽤户画像的标签存储⽅案,存储每个app的⽤户的⼈⼝学属性和商业属性等标签信息。 HBase中设计有MemStore和BlockCache,分别对应列族/Store级别的写⼊缓存,和RegionServer级别的读取缓存。如果RowKey过 长,缓存中存储数据的密度就会降低,影响数据落地或查询效率。 1.2 hbase的设计原则以及解决⽅法 的设计原则以及解决⽅法 1.3 预分区 预分区 1.3.1 什么是预分区 什么是预分区 HBase表在刚刚被创建时,只有1个分区( 立即下载

相关推荐

rowkey设计案例.zip

Spark存储数据到HBase实现RowKey完全散列-多进程多线程间Random完全随机,完美解决热点问题

hbase rowkey设计案例

介绍 hbase中的rowkey可以唯一定位一条数据。rowkey设计的合不合理,很大程度上可以解决数据倾斜的问题。 和rowkey密切相关的是分区键,我们可以用命令行或者代码方式创建分区键: 比如staff这个表就有4个分区键: aaaa bbbb cccc dddd 由此切割成5个分区。 rowkey带着一条数据来了之后就要和这些分区键去比较,决定自己进入哪一个分区。比较的规则是字典排序。 我们想要的是,第一,一条数据来了之后,立马能够知道他进入哪个分区,而不用一位一位的比较。 能够达成这个想法的做

weixin_43810802的博客 1371

工业级24V电源保护电路深度解析:五重防护机制详解

自恢复保险丝(PPTC,Positive Temperature Coefficient)是一种过流保护元件✅可恢复:过流后自动恢复,无需更换⚡响应快:电流超标立即动作🔄多次使用:在额定范围内可反复使用第1层(F1):阻挡过流 → 物理熔断第2层(D3):吸收浪涌 → 能量泄放第3层(Q1):防止反接 → 逻辑阻断第4层(Q2/Q3):抵御过压 → 主动切断第5层(CR):平滑启动 → 时序控制设计哲学:"让每一级保护专注做好一件事"通过这篇文章,我们深入理解了:✅自恢复保险丝。

qq_58068673的博客 3559

HBase之Rowkey设计总结及易观方舟实战篇

一、引言 HBase由于其存储和读写的高性能,在OLAP即时分析中越来越发挥重要的作用,在易观精细化运营产品--易观方舟也有广泛的应用。作为Nosql数据库的一员,HBase查询只能通过其Rowkey来查询(Rowkey用来表示唯一一行记录),Rowkey设计的优劣直接影响读写性能。HBase中的数据是按照Rowkey的ASCII字典顺序进行全局排序的,有伙伴可能对ASCII字典序印象不够深刻,...

数据之路 6992

IO多路转接 ——— select、poll、epoll

select是系统提供的一个多路转接接口。select函数的函数原型如下: 参数说明:参数timeout的取值:返回值说明:select调用失败时,错误码可能被设置为:fd_set结构与sigset_t结构类似,fd_set本质也是一个位图,用位图中对应的位来表示要监视的文件描述符。 调用select函数之前就需要用fd_set结构定义出对应的文件描述符集,然后将需要监视的文件描述符添加到文件描述符集当中,这个添加的过程本质就是在进行位操作,但是这个位操作不需要用户自己进行,系统提供了一组专门的接口,用

2021dragon的博客 7972

机器学习入门指南:Jupyter Notebook实战

对于机器学习工程师而言,他们更擅长的是算法、模型、数据探索的工作,而对于工程化的能力则并不是其擅长的工作。Jupyter Notebook生成PMML文件1​​​​​​​。Jupyter Notebook生成PMML文件2​​​​​​​。PySpark Notebook建模 -折线图​​​​​​​。TensorFlowNotebook建模​​​​​​​。R Notebook建模 - 散点图​​​​​​​。PySpark Notebook建模​​​​​​​。R Notebook获取训练数据集​​​​​​​。

datacreating的博客 1973

HBase的RowKey详解、RowKey设计原则和RowKey优化方法

HBase的RowKey详解、RowKey设计原则和RowKey优化方法

xdx_dili的博客 7610

ROS2实战:构建模块化启动文件(launch file)以驱动复杂机器人系统

本文详细介绍了ROS2中构建模块化启动文件(launch file)的最佳实践,帮助开发者高效管理复杂机器人系统的节点启动。通过功能分解、参数化设计和嵌套启动等技术,实现批量管理、依赖控制和配置统一,显著提升系统稳定性和调试效率。文章包含实战代码示例和工程化建议,特别适合自动驾驶、物流机器人等场景应用。

weixin_28744613的博客 214

HBase RowKey的设计原则

HBase是三维有序存储的,三维指的是:RowKey(行健)、column key(columnFamily和qualifier)、TimeStamp(时间戳),通过这三个维度我们可以对HBase中的数据进行快速定位。下面我们主要来讨论RowKey的设计原则: HBase中RowKey可以唯一标识一条记录,在HBase查询的时候,我们有两种方式,第一种是通过get()方法指定RowKey条件后获

lavimer 2万+

ADS 使用教程(一)Workspace, Library and Cell

简要介绍ADS的基本内容

Dirge19的博客 6609

论文笔记:Group Equivariant Convolutional Networks

Group Equivariant Convolutional Networks 1、四个问题 要解决什么问题? 对卷积神经网络进行扩展,并提出一个在特定的变换(旋转、平移等,也可表示为一个特殊的群)下具有等变性的网络。 用了什么方法解决? 提出了一种新的卷积神经网络结构——群等变卷积神经网络(Group equivariant Convolutional Neural Network)...

hongbin_xu的博客 1万+

Hbase之Rowkey设计原则

一、rowkey设计原则 二、不同模式下rowkey设计 1.写优化 hashing散列 salting加盐 Reverse反转 2.读优化 三、rowkey设计案例 1 设计订单状态表 2 登录、下单等等统称事件(event)的临时存储

南风知我意 3819

关于红队方面的学习资料

关于红队方面的学习资料

Sumarua的博客 1079

HBase的 rowkey 设计原则

hbase所谓的三维有序存储的三维是指:rowkey(行主键),column key(columnFamily+qualifier),timestamp(时间戳)三部分组成的三维有序存储。 rowkey是行的主键,而且hbase只能用个rowkey,或者一个rowkey范围即scan来查找数据。所以 rowkey的设计是至关重要的,关系到你应用层的查询效率。 rowkey是以字典顺序排序的,存储的是字节码。 Rowkey设计原则 1.Rowkey的唯一原则 必须在设计上保证其唯一性。由于在HBas

zjjcchina的博客 3375

YOLOv12模型详解及代码复现

YOLOV12算法详解及Python代码复现

hasakie的博客 6487

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Hbase系列之一:Rowkey的设计原则及案例

一、引言 HBase由于其存储和读写的高性能,在OLAP即时分析中越来越发挥重要的作用,在易观精细化运营产品--易观方舟也有广泛的应用。作为Nosql数据库的一员,HBase查询只能通过其Rowkey来查询(Rowkey用来表示唯一一行记录),Rowkey设计的优劣直接影响读写性能。HBase中的数据是按照Rowkey的ASCII字典顺序进行全局排序的,有伙伴可能对ASCII字典序印象不够深刻,...

z_xiaozhuT的博客 1106

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

HBase Rowkey设计原则

在做Rowkey设计时,请先考虑业务是读比写多、还是读比写少,HBase本身是为写优化的,即便是这样,也可能会出现热点问题,而如 果我们读比较多的话,除了考虑以上Rowkey设计原则外,还可以考虑HBase的Coprocessor甚至elastic search结合的方法,无论哪种方 式,都建议做实际业务场景下数据的压力测试以得到最优结果。

m0_66882197的博客 1148

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Hbase_rowKey的设计原则

RowKey的设计原则 1. 设计原则 1.1 唯一原则 保证rowKey的唯一性。由于在HBase中数据存储是Key-Value形式,若HBase中同一表插入相同RowKey,则原先的数据会被覆盖掉(如果表的version设置为1的话)。 1.2 散列原则 设计的RowKey应保证同一时间段内的数据能够被均匀的分配给不同的HBase节点。 举一个反面的例子: 针对实时产生的事件连续的数据, 如果RowKey是按系统时间戳的方式递增,即RowKey的第一部分(类似寻址位的高位)是时间戳,将造成所有新数据都在

weixin_43374749的博客 2498

HBase之rowkey设计原则和方法

什么是rowkey? rowkey是HBase实现分布式的基础,HBase通过rowkey范围划分不同的region,分布式系统的基本要求就是在任何时候,系统的访问都不要出现明显的热点现象,所以rowkey的设计至关重要,一般我们建议rowkey的开始部分以hash或者MD5进行散列,尽量做到rowkey的头部是均匀分布的。禁止采用时间、用户id等明显有分段现象的标志直接当作rowkey来使用。...

zhangvalue的博客 3219

HBase的RowKey设计原则

HBase的RowKey设计原则 Rowkey长度原则 rowkey是一个二进制码流,可以为任意字符串,最大长度为64kb,实际应用中一般为10-100bytes,它以byte[]形式保存,一般设定成定长。 建议越短越好,不要超过16个字节,原因如下: (1)数据的持久化文件HFile中是按照KeyValue存储的,如果Rowkey过长比如100个字节,1000万列数据光Rowkey就要占用100...

小黑的博客 714

Hbase Rowkey设计原则

Hbase是三维有序存储的,通过rowkey(行键),column key(column family和qualifier)和TimeStamp(时间戳)这三个维度可以对HBase中的数据进行快速定位。 Hbase中Rowkey可以唯一标识一行记录,在Hbase查询的时候,有以下几种方式:   1、通过get方式,指定rowkey获取唯一一条记录   2、通过scan方式,设置Star...

weixin_30521161的博客 1065

Hbase rowkey设计原则,热点问题

唯一性:类似于MySQL、Oracle中的主键,用于标示唯一的行; 随机性:有效解决hbase热点问题,避免大量客户端只访问一个或几个节点; 长度设计:越短越好,8字节的整数倍利用了操作系统的最佳特性。如太长会影响HFile的存储效率;且MemStore将缓存部分数据到内存,内存的有效利用率会降低,检索效率低。

独木不成林,单弦不成音。 2万+

HBase之RowKey设计

HBase RowKey设计HBaseHBase的存储RowKey设计原则热点问题 HBase 工作中一直有使用到HBase,但是却一直没有好好的总结整理过,最近换工作过程中,经常会被问到HBase相关的知识(裸面被鞭打的惨不忍睹啊),在回顾、准备面试的同时,也借此机会记录一下,希望能够在帮助自己记忆理解的同时,可以方便大家! HBase rowkey即是HBase的主键,HBase数据的查询,主要是基于rowkey进行,无论是通过rowkey进行唯一查询还是通过范围匹配查询,都是基于rowkey来实现,因

世界那么大,我想去看看! 1435

Hbase的Rowkey设计原则

一、Hbase介绍 HBase (Hadoop Database)是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式,主要用来存储非结构化和半结构化的松散数据(列存NoSQL数据库) 二、设计原则 2.1Rowkey长度原则 Rowkey是一个二进制码流,Row...

pengjunlee的博客 731

Hbase 的RowKey设计原则

hbase所谓的三维有序存储的三维是指:rowkey(行主键),column key(columnFamily+qualifier),timestamp(时间戳)三部分组成的三维有序存储。 rowkey是行的主键,而且hbase只能用个rowkey,或者一个rowkey范围即scan来查找数据。所以 rowkey的设计是至关重要的,关系到你应用层的查询效率。 rowkey是以字典顺序排序的,存...

阿尔法小师妹 1256
上一篇: CDH版HBase的压测测试 YCSB
下一篇: Flink自定义HBasesink的过程
布尔科技技术团队
博客等级 码龄5年 3粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值