和哈希表类比,HBase中的行键类似于哈希表中的键.要构造一个良好的HBase模式,关键之一就是选择一个合适的行键.

1 记录检索

行键是HBase中检索记录所使用的键.HBase记录含有的列在数量上没有限制,但是只能有一个行键.这一点同关系型数据库有所不同,后者的主键可以有多个列组合.既然要为一个记录创建唯一的行键,那么单一的行键就需要包含多种信息.例如,如果一行标识一个订单,那么customer_id,order_id,timestamp可以作为该行的行键.在关系型数据库中,customer_id,order_id,timestamp是三个分开的列,而HBase中三者需要组合形成一个独特的标识符.

在选择行键时需要记住的另外一个点是,但已记录中的get操作是HBase中最快的操作.因此,在设计HBase模式时,用get操作解决大多数常见的数据使用问题,这样会提高处理性能.这可能意味着将大量数据放到单一记录中,比关系型数据库中存放的数据多.这样的设计被称作反向规范化,不同于关系型数据库中常见的规范化设计.比如,关系型数据库可能会将消费者存在一个表中,将其联系方式存在另外一张表中,又将订单存在第三个表中,而订单详情则在另外一个表中.HBase则会设计非常宽的表,即每一个订单记录都包含该订单的所有信息,也包含消费者及其联系方式.单一的get操作就可以检索所有的数据.

2 分布

对于一个给定的表,记录在HBase集群多个Region中的分布方式是由行键决定的.HBase中所有的行键都进行了排序,经过排序的行键按照范围存储在不同的Region中.每个Tegion都固定在一个Region服务器(即集群中的一个节点)上.

行键有一个著名的反模式设计 ,那就是时间戳的使用.在行键中使用时间戳可以将大多数的put和get请求几种在单一的Region上,进而集中在单一的Region服务器上.于是,在某种程度上,HBase不再是一个分布式系统.一般来说,选择行键的最合理标准是让集群的负载分布均匀

3 数据块缓存

数据块缓存是一种最近最少使用的(Lease Recently Used, LRU)缓存,能将数据块缓存到内存中.默认情况下,按照64KB的块大小从磁盘中读取记录,每一个这样的数据块都是一个HBase数据块(HBase Block). 从磁盘中读取的时候,HBase数据块会防止在数据块缓存中.但是,你也可以不讲HBase数据块放到数据块缓存中.之所以要进行缓存,是因为最近访问的数据(以及与这些数据同在一个HBase数据块中的数据)很有可能在不久之后再次被请求访问.但是由于数据块缓存的大小有限制,所以应当谨慎明智的使用它

4 支持扫描

选择合适的行键能够使相关的记录位于同一个Region.这有助于进行范围扫描,因为HBase只需扫描一定数目的Region就可以获取结果.另外,如果行键选择不合适,范围扫描在获取数据时可能需要扫描多个Region服务器,随后还要过滤掉不相关的记录.这样一来,同样的请求就增加了额外的I/O.另外,要记得HBase的扫描速度大约是HDFS的八分之一,减低I/O要求能显著提高性能.与HDFS上的数据存储相比.HBase在这一点上更为明显

5 行键大小

行键的大小将决定工作负载的性能,通常来说.行键越短越好,因为这样可以降低存储消耗,提高读写性能.但是,行键较长时,get和scan的性能更好.因此 在选择时,需要权衡行键的长短.行键越长,压缩编解码在存储行键时需要处理的I/O就越多.同理,列名称越长,需要处理的I/O也越多.所以一般来说,保持列的名称短一些比较好

Tips:可以使用Snappy配置HBase,压缩行键.因为行键按照排序进行存储,所以行键之间的排列比较紧密时.压缩效果较好,这就是不宜将某个属性的哈希作为行键的另一个原因,因为行键的排序是任意的

6 可读性

从开始就接触可读性比较好的行键,如果你不习惯HBase,哪就更应该去这样做.这能让你更为轻松发现和调试问题,也更容易使用HBase操作台.

7 唯一性

因为行键等同于哈希表类比中的键,所以确保行键的唯一性非常重要.如果你选择了一个基于非独特属性的行键,那么应用应该处理这种情况,而且只能通过唯一的行键把数据存入HBase中.

Hadoop-No.7之行键的更多相关文章

  1. Hadoop HBase概念学习系列之优秀行键设计(十六)

    我们通过行键访问HBase.尽管使用扫描过滤器可以一次性指明大量的键,但是HBase仅仅能够根据行键识别出一行. 优秀的行键设计可以保证良好的HBase性能. 1.行键存在于HBase中的每一个单元格 ...

  2. Hadoop HBase概念学习系列之行、行键(十一)

    行是由列簇中的列组成.行根据行键依照字典顺序排序. HBase的行使用行键标识,可以使用行键查询整行的数据. 对同一个行键的访问都会落在同样的物理节点上.如果表包含2个列簇,属于两个列簇的文件还是保存 ...

  3. HBase应用开发回顾与总结系列之三:RowKey行键生成器工具

      所谓RowKey行键生成器,是指通过软件工具制定行键生成策略,并可将策略信息保存成本地策略文件,待需要时再将本地策略文件序列化成行键生成策略对象,传入数据行信息后可自动生成RowKey行键. 那么 ...

  4. HBase应用开发回顾与总结系列之二:RowKey行键设计规范

    2. RowKey行键设计规范 2.1. RowKey四大特性 2.1.1 字符串类型 虽然行键在HBase中是以byte[]字节数组的形式存储的,但是建议在系统开发过程中将其数据类型设置为Strin ...

  5. RowKey设计之单调递增行键/时序数据

    ​在一个集群中,一个导入数据的进程锁住不动,所有的client都在等待一个region (因而也就是一个单个节点),过了一会后,变成了下一个region…​如果使用了单调递增 或者时序的key便会造成 ...

  6. 记一次Hbase的行键过滤器事故问题

    数据总数:746条数据 因为后面需要进行算法合成,而且spark目前对这种算法支持并不好,因此采用代码编写,所以在查询hbase的过程中采用的是java直接查询, 但是为了加快查询速度,我尽可能的使用 ...

  7. HBase行键的设计

    rowkey是行的主键,而且hbase只能用rowkey范围即scan来查找数据.rowkey是以字典排序的.可以巧妙设计行键,比如想通过电影的评价进行排序,可以把评分rate和电影id组合起来,ra ...

  8. HBase按照行键范围删除数据

    #!/bin/bash #TOOL_PATH=$(cd "$(dirname "$0")"; pwd) #TOOL_PATH_TMP=$(cd "$( ...

  9. 架构师必备:HBase行键设计与应用

    首先要回答一个问题,为何要使用HBase? 随着业务不断发展.数据量不断增大,MySQL数据库存在这些问题: MySQL支持的数据量为TB级,不能一直保留历史数据.而HBase支持的数据量为PB级,适 ...

随机推荐

  1. [转帖]Xenix — 微软与UNIX的短暂爱恋

    Xenix — 微软与UNIX的短暂爱恋 https://www.linuxdashen.com/xenix-微软与unix的短暂爱恋 原来微软曾经 干过那么牛B的 unix系统. 微软向外宣布Mic ...

  2. Android笔记01--手机振动

    一.android任务栈  不懂? 栈:先进后出 队列:先进先出 任务栈Task中:打开一个Activity叫进栈 关闭一个activit出栈 任务栈是用来维护Activity的.是用来维护用户的操作 ...

  3. kettle转换设置变量,校验输出新变量

    背景:有很多小的转换需要串联起来,如果前一个执行成功,后面继续接着执行,如果执行等待中,就让程序等一会再次获取数据分析,如果失败就中止,成功就进行下一个转换,以此类推.... 需求:通过job把参数传 ...

  4. lnmp1.5部署laravel项目

    毕竟laravel是十分有魅力的框架,忍不住想要深入的了解她,费话不多说,直入正题吧 1.composer切换国内镜像源:composer config -g repo.packagist compo ...

  5. 交替方向乘子法(ADMM)的原理和流程的白话总结

    交替方向乘子法(ADMM)的原理和流程的白话总结 2018年08月27日 14:26:42 qauchangqingwei 阅读数 19925更多 分类专栏: 图像处理   作者:大大大的v链接:ht ...

  6. 怎样将当前节点从DOM树中移除

    1. 获取到当前节点. 2. 获取到当前节点的父节点. 3. 使用 Node.prototype.removeChild() 移除当前节点. <!DOCTYPE html> <htm ...

  7. Maven maven-compiler-plugin 编译问题

    问题:每次右键项目名-maven->update project 时候,项目jdk版本变了,变回1.5版本或者其他版本 解决方案一:修改maven的配置(解压目录的conf\setting.xm ...

  8. windows安装npm教程

    1.在使用之前,先类掌握3个东西,明白它们是用来干什么的: npm:  nodejs 下的包管理器. webpack: 它主要用途是通过CommonJS 的语法把所有浏览器端需要发布的静态资源作相应的 ...

  9. 绑定css样式,点击高亮

    <div class="flex-lay" style="color:#999"> <div bindtap="changeType ...

  10. java技术面试之面试题大全

    转载自:http://blog.csdn.net/lijizhi19950123/article/details/77679489 Java 面试知识点总结 本篇文章会对面试中常遇到的Java技术点进 ...