当前位置: 首页 > news >正文

Hbase中Rowkey的设计方法

Hbase中Rowkey的设计方法

过去对于Rowkey设计方法缺乏理解,最近结合多篇博主的文章,进行了学习。有不少心得体会。总结下来供后续学习和回顾。

一、设计Rowkey的三个原则

1.长度原则:长度不能太长,小于100个字节。可以偏端一些,短一些可以方便存储。最好是8的倍数。因而建议16字节为好。

太长的话有两点影响:1.降低HFile的存储效率,需要话更多的空间存储不包含实际数据的Rowkey。2.会使MemStore的缓存效率下降,缓存大小固定,Rowkey越长,能缓存的数据个数越少。

2.唯一原则

一个Rowkey只唯一标识一组数据,若出现两条数据的数据部分一样但Rowkey不一样,那么就不是同一条数据。

3.散列原则

设计的Rowkey应该是分布于各个Hbase节点上的,这样主要是为了防止出现热点,造成单个RegionServer服务器压力过大。

二、写优化与读优化

Rowkey在数据进行读写时及其重要。在写入时,当Rowkey足够分散,能均匀的写入不同的HRegionServer时,写入效率就会提升。在读取时,当Rowkey设计的足够好,就可以避免对所有数据进行扫描。甚至于仅需要扫描某个Region中的一部分数据即可。为了使写入和查询的效率进一步提高,可以对Rowkey进行一些设计。

1.写优化

写优化主要有三种技术层面的操作:hash值,加盐,和反转

  • hash值

优点:一般使用MD5生成的hash值足够散列,能均匀分布。且hash值能讲部分变长字符串转化为定长字符串。

缺点:单纯的使用hash值容易使数据散乱的分布,当查找的时候会进行全表扫描,遍历所有region

  • 加盐

所谓加盐就是指在一部分有实际含义的数据中添加一部分无实际含义的数据。

例如:将Rowkey直接设置为时间戳的话有可能造成大量的数据堆积在同一个region中。此时在时间戳之前添加一个随机的hash值就会使数据均匀分布且查找数据时可以按时间戳进行查找。

有如下三个时间戳timestamp1、timestamp2、timestamp3,若将时间戳作为Rowkey,可能三条数据都被存储在一个Region上。若对其分别进行加盐操作,在时间戳之前加上一个分区号,此时三个时间戳变为字符串 0timestamp1、1timestamp2、2timestamp3。此时首位变成了不同的数,也更容易分散到不同的Region中

优点:确保Rowkey在包含实际意义的情况下也能够均匀分布在Region中。

缺点:读取时依然需要遍历所有region

  • 反转

反转操作一般可以用于时间戳,此时反转后的时间戳作为Rowkey的一部分时,既能使Rowkey分散于各个Region,又方便捕获数据的最新版本。

2.读优化

相比于写优化,读优化是一个复杂的议题。原因在于,写优化通常只需要确保Rowkey不会影响数据在Region中的分布。而读优化则依据场景的不同设计不同的Rowkey去缩小扫表范围。

在上一小节对写优化方法的总结中,反转操作是读优化中常用的,主要是为了方便获取最新数据。

下面举两个应用场景下的读优化:

1.目标:在Hbase中存储用户订单状态

Rowkey:反转订单id+反转时间戳

通过反转订单id能避免所有数据存储在同一个Region中的情况,通过反转时间可以便于获取最新订单。

rowkey可以表示为:reverse(userId) + (Long.MAX_VALUE - timestamp)

注意:此处时间戳反转使用(Long.MAX_VALUE - timestamp)。主要是为了方便查询。如果要查询某段时间的操作记录,则使用如下方法:

startRow是[userId反转] [Long.MAX_VALUE - 结束时间]

stopRow是[userId反转] [Long.MAX_VALUE - 起始时间]

2.目标:存储最近10分钟的热点数据

Rowkey:两位随机数Salt + eventId + Date + kafka的offset

其中两位随机数用于使数据写入时均匀分布在不同的Region中,后两个eventId和Date则由查询语句的查询条件所决定。如果查询之前总是能获取到eventId和某一个数据字段,则将两个字段放入Rowkey中。

kafka的offset则是为了确保获取最新的数据。

相关文章:

Hbase中Rowkey的设计方法

Hbase中Rowkey的设计方法 过去对于Rowkey设计方法缺乏理解,最近结合多篇博主的文章,进行了学习。有不少心得体会。总结下来供后续学习和回顾。 一、设计Rowkey的三个原则 1.长度原则:长度不能太长,小于100个字节。可以偏端一些…...

Python基础总结之functools.wraps介绍与应用

Python基础总结之functools.wraps介绍与应用 在Python编程中,装饰器(decorator)是一种非常强大的工具,它允许开发者在不改变函数本身的情况下,动态地增加函数的功能。使用装饰器时,常常会用到 functools.wr…...

UE5基础1-下载安装

目录 一.下载 二.安装 三.安装引擎 四.其他 简介: UE5(Unreal Engine 5)是一款功能极其强大的游戏引擎。 它具有以下显著特点: 先进的图形技术:能够呈现出令人惊叹的逼真视觉效果,包括高逼真的光影、材…...

前端实现获取后端返回的文件流并下载

前端实现获取后端返回的文件流并下载 方法一:使用Axios实现文件流下载优点缺点 方法二:使用封装的Request工具实现文件流下载优点缺点 方法三:直接通过URL跳转下载优点缺点 结论 在前端开发中,有时需要从后端获取文件流&#xff0…...

Windows下对于Qt中带 / 的路径的处理

在Windows下,如果你想使用操作系统的分隔符显示用户的路径,请使用 toNativeSeparators()。 请看以下代码: void Player::on_playBtn_clicked() {if (this->m_url.isEmpty()) {openMedia();if (this->m_url.isEmpty())return;}qDebug(…...

[leetcode]swap-nodes-in-pairs

. - 力扣(LeetCode) class Solution { public:ListNode* swapPairs(ListNode* head) {ListNode* dummyHead new ListNode(0);dummyHead->next head;ListNode* temp dummyHead;while (temp->next ! nullptr && temp->next->next !…...

国思RDIF.vNext全新低代码快速开发框架平台6.1版本发布(支持vue2、vue3)

1、平台介绍 RDIF.vNext,全新低代码快速开发集成框架平台,给用户和开发者最佳的.Net框架平台方案,为企业快速构建跨平台、企业级的应用提供强大支持。 RDIF.vNext的前身是RDIFramework框架,RDIF(Rapid develop Integrate Framewor…...

中国地市分布图

原文链接https://mp.weixin.qq.com/s?__bizMzUyNzczMTI4Mg&mid2247693904&idx1&snb54884975272eaecb1d0564cafc128d3&chksmfa76a96dcd01207b939b8852a08eea9852eeffa8cc51a3af055dfca5c999e93301237e95901b&token1851596113&langzh_CN#rd...

HCIA11 网络安全之本地 AAA 配置实验

AAA 提供 Authentication(认证)、Authorization(授权)和 Accounting(计费)三种安全功能。 • 认证:验证用户是否可以获得网络访问权。 • 授权:授权用户可以使用哪些服务。 •…...

用Python处理Excel的资源

用Python处理Excel的资源 python-excel 读写Excel文件 openpyxl openpyx文档l 读写Excel2010文件(即xlsx) openpyxl示例: from openpyxl import Workbook wb Workbook()# 获取active worksheet ws wb.active# 给单元格赋值 ws[A1] 4…...

2024年中国移动游戏市场研究报告

来源:点点数据: 近期历史回顾: 面向水泥行业的5G虚拟专网技术要求(2024).pdf 2024年F5G-A绿色万兆全光园区白皮书.pdf 2024年全球废物管理展望报告.pdf 内容管理系统 2024-2025中国羊奶粉市场消费趋势洞察报告.pdf 20…...

JS-12-es6常用知识-async

目录 1. 定义与概述 2. 使用方法 3. 注意事项 4. 应用场景 5. 示例代码 6.总结 async 是 JavaScript(包括 TypeScript)中的一个关键字,用于声明一个函数为异步函数。async其实是一个promise的语法糖,以下是关于 async 的详细…...

使用winscp 通过中转机器(跳板机、堡垒机)密钥远程连接服务器,保姆级别教程

1.winscp下载地址 winscp下载 2.安装自己选择位置 3.连接服务器 到这里,基本就是没有壁垒机的就可直接连接,传递文件 4.配置中转服务器(壁垒机、跳板机) 选择高级选项 配置utf-8的编码格式 配置中转服务器(壁垒机、跳板机) 设置中专机的密码或者私钥 配置私钥...

力扣-1984. 学生分数的最小差值

文章目录 力扣题目工程代码C实现python实现 力扣题目 给你一个 下标从 0 开始 的整数数组 nums ,其中 nums[i] 表示第 i 名学生的分数。另给你一个整数 k 。 从数组中选出任意 k 名学生的分数,使这 k 个分数间 最高分 和 最低分 的 差值 达到 最小化 。…...

激动人心的LayerDiffusion终于可以在ComfyUI中使用了

一、什么是LayerDiffusion 随着Stable Diffusion等散射模型的蓬勃发展,人工智能图形生成进入了一个崭新的阶段。我们可以仅仅通过文字提示,就可以让AI模型为我们生成逼真的图像。但是,目前主流的AI生成模型大多只能生成普通的RGB图像,对生成具有透明通道的图片能力还非常有限。…...

【JVM】finalize() 方法的定义与作用

finalize() 方法的定义与作用 定义 finalize() 方法是 Java 中的一种特殊方法,定义在 java.lang.Object 类中。它在对象被垃圾回收之前由垃圾回收器调用,用于执行清理操作。 方法签名: protected void finalize() throws Throwable作用 …...

这10个前端库,帮我在工作中赢得了不少摸鱼时间!!

文章目录 前言1、dayjs2、 lodash3、 Quill4、 crypto-js5、 viewerjs6、 localforage7、 vconsole8、 uuid9、 copy-text-to-clipboard10、 classnames前言 通过高效的工具提高工作效率,从而有更多的时间来处理其他重要的任务,或者……摸鱼。没错!就是摸鱼。毕竟,提高效率…...

(2024最新)CentOS 7上在线安装MySQL 5.7

在CentOS 7上安装MySQL 5.7并配置允许远程连接,以下是详细步骤: 1. 添加MySQL官方存储库 首先,下载并添加MySQL的官方存储库。默认情况下,添加的存储库可能会包含最新的MySQL版本(如MySQL 8.0)&#xff0c…...

【C++高阶】C++继承学习手册:全面解析继承的各个方面

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C “ 登神长阶 ” 🤡往期回顾🤡:模板进阶 🌹🌹期待您的关注 🌹🌹 继承 📖1. 继承的概念及定义…...

使用GPT-soVITS再4060下2小时训练声音模型以及处理断句带来的声音模糊问题

B站UP主视频 感谢UP主“白菜工厂1145号员工”的“熟肉”,我这篇笔记就不展示整一个训练和推理流程,重点写的4060该注意的一些事项。如何解决断句模糊的问题,在本篇笔记的最末尾。 相关连接: 原项目github UP主的说明文档 1、训…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

Python如何给视频添加音频和字幕

在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...

网站指纹识别

网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...

Go语言多线程问题

打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...