hbase rowkey设计原则 和为什么nosql查询速度快「建议收藏」

hbase rowkey设计原则 和为什么nosql查询速度快「建议收藏」hbase rowkey设计原则 和为什么nosql查询速度快

大家好,又见面了,我是你们的朋友全栈君。

HBase RowKey

概述

HBase是一个分布式的、面向列的数据库,它和一般关系型数据库的最大区别是:HBase很适合于存储非结构化的数据,还有就是它基于列的而不是基于行的模式。

既然HBase是采用KeyValue的列存储,那Rowkey就是KeyValue的Key了,表示唯一一行。Rowkey也是一段二进制码流,最大长度为64KB,内容可以由使用的用户自定义。数据加载时,一般也是根据Rowkey的二进制序由小到大进行的。

HBase是根据Rowkey来进行检索的,系统通过找到某个Rowkey (或者某个 Rowkey 范围)所在的Region,然后将查询数据的请求路由到该Region获取数据。HBase的检索支持3种方式:

  1. 通过单个Rowkey访问,即按照某个Rowkey键值进行get操作,这样获取唯一一条记录;
  2. 通过Rowkey的range进行scan,即通过设置startRowKey和endRowKey,在这个范围内进行扫描。这样可以按指定的条件获取一批记录;
  3. 全表扫描,即直接扫描整张表中所有行记录。

HBASE按单个Rowkey检索的效率是很高的,耗时在1毫秒以下,每秒钟可获取1000~2000条记录,不过非key列的查询很慢。

HBase的RowKey设计

设计原则

Rowkey长度原则

Rowkey是一个二进制码流,Rowkey的长度被很多开发者建议说设计在10~100个字节,不过建议是越短越好,不要超过16个字节。

原因如下:

  1. 数据的持久化文件HFile中是按照KeyValue存储的,如果Rowkey过长比如100个字节,1000万列数据光Rowkey就要占用100*1000万=10亿个字节,将近1G数据,这会极大影响HFile的存储效率;
  2. MemStore将缓存部分数据到内存,如果Rowkey字段过长内存的有效利用率会降低,系统将无法缓存更多的数据,这会降低检索效率。因此Rowkey的字节长度越短越好。
  3. 目前操作系统是都是64位系统,内存8字节对齐。控制在16个字节,8字节的整数倍利用操作系统的最佳特性。

Rowkey散列原则

如果Rowkey是按时间戳的方式递增,不要将时间放在二进制码的前面,建议将Rowkey的高位作为散列字段,由程序循环生成,低位放时间字段,这样将提高数据均衡分布在每个Regionserver实现负载均衡的几率。如果没有散列字段,首字段直接是时间信息将产生所有新数据都在一个RegionServer上堆积的热点现象,这样在做数据检索的时候负载将会集中在个别RegionServer,降低查询效率。(原因:在一天中的某个时间点只会访问某个或某几个RegionServer)

Rowkey唯一原则

必须在设计上保证其唯一性。

场景应用

比如根据userID以及时间、业务ID、业务类型作为一个RowKey。

设计RowKey的时候,将userID放在前面,依次为时间、业务ID、业务类型。

为什么将userID放前面,是因为散列均匀,不会形成数据热点。时间的话,可以用long.maxValue-time,为什么这样,因为这样可以按时间倒序访问,符合我们的习惯。其他的两个字段是唯一性的需要以精准定位(可以有可以没有,只要能唯一定位既可以)。


参考资料: 
网上资源 
备注: 
转载请注明出处:http://blog.csdn.net/wsyw126/article/details/73002497 
作者:WSYW126

 

下面说说为什么hbase等Nosql的查询速度那么快呢?

1,hbase的按列存储的,rowkey是有序排列的,按区划分rowkey的

2,有一部分数据是放在memstore内存中的,读取会快点

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/106059.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 一步一步教你_CT增强技术

    一步一步教你_CT增强技术一篇来自博客园的作者的介绍实现text-detection-ctpn一路的坎坎坷坷作者讲的很详细,一步一个脚印。很适合初次接触CTPN的小白,老鸟也会学到不少新的东西。感谢作者。…

    2025年5月22日
    3
  • 【剑指offer】第一个仅仅出现一次的字符

    【剑指offer】第一个仅仅出现一次的字符

    2021年12月5日
    43
  • Windows程序设计:MFC 、Winform 和 WPF 比较[通俗易懂]

    MFC生成本机代码,自然是很快,可是消息循环减缓了界面显示速度。WinForm封装了win32的api,多次进行P/invoke操作(大部分使用p/invoke操作封装),速度慢。WPF是一种新的模型,不再使用win32模型,自己新建模型,使用dx作为新的显示技术,直接访问驱动程序,加快了运行速度,可是,这种模型,需要支持dx9的显卡,硬件要求高(你还能找到现代机器不支持dx9的吗?)…

    2022年4月15日
    52
  • iframe属性参数「建议收藏」

    iframe属性参数

    当点击一个子页面的链接时,如何将另一个子页面嵌入到当前iframe中
    只要给这个iframe命名就可以了。
    ,然后,网页上的超链接语句应该写为:
     
    将iframe解释成“浏览器中的浏览器”很是

    2022年4月8日
    273
  • 随机数生成 python_python生成多个随机数

    随机数生成 python_python生成多个随机数描述seed() 方法改变随机数生成器的种子,可以在调用其他随机模块函数之前调用此函数。。语法以下是seed()方法的语法:importrandomrandom.seed([x])randomrandom.seed([x])注意:seed(()是不能直接访问的,需要导入random模块,然后通过random静态对象调用该方法。参数x…

    2022年10月4日
    3
  • anaconda tensorflow pycharm_tensorflow搭建

    anaconda tensorflow pycharm_tensorflow搭建目录安装anaconda安装pycharm安装tensorflowpycharm新建有tensorflow模块的Project目前正在学习tensorflow库的深度学习的一些知识,基本的安装和环境配置做个记录。安装anaconda到官网上下载安装,ana2和ana3都可以,我这里都下载了。安装时候注意勾选写入路径。安装到某个盘,以后的环境会在那里生成。安装pycharm到官网上下载安装…

    2022年8月27日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号