和哈希表类比,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. nginx多线程高并发

    直接上图 Master-Worker模式 1.Nginx 在启动后,会有一个 master 进程和多个相互独立的 worker 进程. 2.接收来自外界的信号,向各worker进程发送信号,每个进程都 ...

  2. [CF544E]Remembering Strings_状压dp

    E. Remembering Strings 题目大意: You have multiset of n strings of the same length, consisting of lowerc ...

  3. Atomic long 和long的区别

    Atomic long 和long: 前者是一个对象,包含对象头(object header)以用来保存hashcode.lock等信息,32位系统占用8个字节,64位系统占16个字节,所以在64位系 ...

  4. VUE-挂载点-实例成员-数据-过滤器-文本指令-事件指令-属性指令-表单指令-01

    目录 路飞项目 vue vue 导读 vue 的优势 渐进式框架 引入 vue 实例成员 - 挂载点 el js 对象(字典)补充 实例成员 - 数据 data 实例成员 - 过滤器 filters ...

  5. LeetCode 203——移除链表(JAVA)

    删除链表中等于给定值 val 的所有节点. 示例: 输入: 1->2->6->3->4->5->6, val = 6 输出: 1->2->3->4 ...

  6. 树莓派3b 串口乱码的一个解决思路

    首先确认波特率设置正确,为115200 向microSD卡中烧录树莓派官方的镜像后,先不要急着把它插入树莓派中. 在电脑上打开microSD卡,按如下方式修改config.txt和cmdline.tx ...

  7. Python的IDE之Jupyter的使用

    Python的IDE之Jupyter的使用 今天给大家分享的是Jupyter安装和基本使用教程,同时在我安装的过程中遇到了一些问题,解决方法,一并和大家分享 一.Jupyter介绍 Jupyter N ...

  8. 手动导入jar到本地mvn仓库

    <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId ...

  9. 项目实践 hrm项目的设计过程

    人事管理系统的设计过程 一.数据库表和持久化类 1.1   进行需求分析,根据功能模块设计数据库表 1.2   设计持久化实体 面向对象分析,即根据系统需求提取出应用中的对象,将这些对象抽象成类,再抽 ...

  10. ACM算法练习-——ZJU1164-Software CRC

    具体的题目描述点此链接                http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1164 这道题,说实话 ...