HBase里的优秀行键设计

  我们通过行键访问HBase。尽管使用扫描过滤器可以一次性指明大量的键,但是HBase仅仅能够根据行键识别出一行。

优秀的行键设计可以保证良好的HBase性能。

  1、行键存在于HBase中的每一个单元格中。如果行键越长,用于存储单元格的I/O开销就会越大。通常我们采用MD5加密的定长键来代替行键。

  2、对于组合式行键,每个组件的排序顺序取决于访问模式

    如果是一个以主机名和事件类型存储的日志数据库,可能的键值选取方法有以下几种:

    [主机名][事件类型][时间戳] :适用于访问模式使用主机名和事件类型查询日志的方式。

    [事件类型][时间戳][主机名] : 适用于访问模式使用事件类型和时间戳查询日志的方式。

    [事件类型][反转时间戳][主机名] : 反转时间戳的值是Long.MAX_VALUE减去时间戳,这样可以确保最近发生的时间排在前面。适用于按照事件发生顺序进行处理的场合。

  

  1.  单调递增的行键/时序数据

    在一个集群中,一个导入数据的进程一动不动,所有的client都在等待一个region(就是一个节点),过了一会后,变成了下一个region...如果使用了单调递增或者时序的key就会造成这样的问题。使用了顺序的key会将本没有顺序的数据变得有顺序,把负载压在一台机器上。所以要尽量避免时间戳或者(e.g. 1, 2, 3)这样的key。

  2. 尽量最小化行名和列名的字段大小

    在HBase中,值是作为一个单元(Cell)保存在系统的中的,要定位一个单元,需要行,列名和时间戳。通常情况下,如果你的行和列的名字要是太大(甚至比value的大小还要大)的话,你可能会遇到一些有趣的情况。在HBase的存储文件中,有一个索引用来方便值的随机访问,但是访问一个单元的坐标要是太大的话,会占用很大的内存,这个索引会被用尽。所以要想解决,可以设置一个更大的块大小,当然也可以使用更小的列名。压缩也能得到更大指数。大部分时候,小的低效不会影响很大。不幸的是,这里会是个问题。无论是列族,属性和行键都会在数据中重复上亿次。所以我们设计habse时候尽量遵循以下几点:

    一. 尽量使列族名小,最好一个字符

    二. 虽然详细属性名易读,最好还是用短属性名 (e.g., "via") 保存到HBase.不建议使用详细属性名

    三. 让行键短到可读即可,这样对获取数据有用(e.g., Get vs. Scan)。 短键对访问数据无用,并不比长键对get/scan更好。设计行键需要权衡。

    四. long 类型有 8 字节. 8字节内可以保存无符号数字到18,446,744,073,709,551,615. 如果用字符串保存--假设一个字节一个字符--,需要将近3倍的字节数。

  3. 倒序时间戳

    一个数据库处理的通常问题是找到最近版本的值。采用倒序时间戳作为键的一部分可以对此特定情况有很大帮助。也在Tom White的Hadoop书籍的HBase 章节能找到: The Definitive Guide (O‘Reilly), 该技术包含追加(Long.MAX_VALUE - timestamp) 到key的后面,如 [key][reverse_timestamp].表内[key]的最近的值可以用[key]进行 Scan 找到并获取第一个记录。由于 HBase 行键是排序的,该键排在任何比它老的行键的前面,所以必然是第一个。

  4. 行键永远不变

    行键不能改变。唯一可以“改变”的方式是删除然后再插入。这是一个网上常问问题,所以要注意开始就要让行键正确

时间: 2024-10-14 02:43:13

HBase里的优秀行键设计的相关文章

HBase数据管理/寻址机制以及行键设计

1.hbase对数据的管理机制 1.1.hbase中的表很大---bigtable,都是分布式存储在集群的各个regionserver上    1.2.分布式存储时,需要对表进行切分,首先是按行切分成若干个hregion    1.3.表的每一个hregion都会被一个regionserver所管理    1.4.每一个hregion随着插入数据的增多,一旦达到一个阈值,会被regionserver分裂成两个    1.5.在一个hregion内部还会被按照列族切分成若干个store单元    

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

2. RowKey行键设计规范 2.1. RowKey四大特性 2.1.1 字符串类型 虽然行键在HBase中是以byte[]字节数组的形式存储的,但是建议在系统开发过程中将其数据类型设置为String类型,保证通用性:如果在开发过程中将RowKey规定为其他类型,譬如Long型,那么数据的长度将可能受限于编译环境等所规定的数据长度. 常用的行键字符串有以下几种: 纯数字字符串,譬如9559820140512: 数字+特殊分隔符,譬如95598-20140512; 数字+英文字母,譬如city2

MySQL主键设计

原文:MySQL主键设计 [TOC] 在项目过程中遇到一个看似极为基础的问题,但是在深入思考后还是引出了不少问题,觉得有必要把这一学习过程进行记录. MySQL主键设计原则 MySQL主键应当是对用户没有意义的. MySQL主键应该是单列的,以便提高连接和筛选操作的效率 永远也不要更新MySQL主键 MySQL主键不应包含动态变化的数据,如时间戳.创建时间列.修改时间列等 MySQL主键应当有计算机自动生成. 主键设计的常用方案 自增ID 优点: 1.数据库自动编号,速度快,而且是增量增长,聚集

数据库主键设计之思考(转)

在我们的数据库设计中,不可逃避的就是数据库表的主键,可能有很多朋友没有深入思考过,主键的设计对整个数据库的设计影响很大,因此我们不得不要重视起来. 主键的必要性: 有些朋友可能不提倡数据库表必须要主键,但在我的思考中,觉得每个表都应该具有主键,不管是单主键还是双主键,主键的存在就代表着表结构的完整性, 表的记录必须得有唯一区分的字段,主键主要是用于其他表的外键关联,本记录的修改与删除,当我们没有主键时,这些操作会变的非常麻烦. 主键的无意义性: 我强调主键不应该具有实际的意义,这可能对于一些朋友

基于HBASE的并行计算架构之rowkey设计篇

1.大数据在HBASE存储.计算以及查询的应用场景 海量数据都是事务数据,事务数据都是在时间的基础上产生的.数据的业务时间可能会顺序产生,也可能不会顺序产生,比如某些事务发生在早上10点,但是在下午5点才结束闭并生成出来,这样的数据就会造成存储加载时的时间连续性.另外海量数据的挖掘后产生的是统计数据,统计数据也有时间属性,统计数据如果进行保存必须保证在统计计算之后数据尽量不再变化,如果统计发生后又有新的事务数据产生,那么将重新触发统计计算然后重新保存覆盖原有已经存储的数据.其它数据则主要是以配置

【乱码】运行java -jar xx.jar存到hbase里的数据乱码

程序在Eclipse里运行没有问题,但是打成jar包之后写入hbase里的数据会有乱码,ES里正常 经过测试,运行命令里加上-Dfile.encoding=utf-8 就可以正常写入,但是cmd命令里还是会显示乱码,有待解决 java -Dfile.encoding=utf-8 -jar xx.jar 分析: -Dfile.encoding 解释:在命令行中输入 Java,在给出的提示中会出现 -D 的说明:-D= # set a system property-D 后面需要跟一个键值对,作用是

HBase里的HRegion

首先,要区分,HRegion服务器包含两大部分:HLog部分和HRegion部分 HBase里的HRegion服务器  HBase里的HRegion 当表的大小超过设置值的时候,HBase会自动将表划分为不同的区域,每个区域包含所有行的一个子集.对用户来说,每个表是一堆数据的集合,每个表靠主键来区分.从物理上来说,一张表是被拆分成了多块,每一块就是一个HRegion. (注意,用户通过一系列HRegion服务器获取这些数据.一台机器上一般只运行一个HRegion服务器,而且每一分区段的HRegi

MySQL主键设计盘点

目录 主键定义 主键设计和应用原则 主键生成策略 自增ID UUID 自建的id生成器 Twitter的snowflake算法 @ 最近在项目中用了UUID的方式生成主键,一开始只是想把这种UUID的方式生成主键记录下来,在查阅资料的过程中,又有了一些新的认识和思考. 主键定义 唯一标识表中每行的一个列(或一组列)称为主键.主键用来表示一个特定的行. 主键设计和应用原则 除了满足MySQL强制实施的规则(主键不可重复:一行中主键不可为空)之外,主键的设计和应用应当还遵守以下公认的原则: 不更新主

需求:过滤下面这个网页里共723行 校对中里 行数为两位数的 行 并设置sz和rz在Windows和Linux之间发送和接收文件不用搭FTP

需求:过滤下面这个网页里共723行 校对中里 行数为两位数的 行 因为翻译当然要选择行数少的来翻译,翻译PG文档 https://github.com/postgres-cn/pgdoc-cn/wiki/check9.3grep  -E  "共[0-9]{2}行"  check9.3 [[email protected] ~]# grep  -E  "共[0-9]{2}行"  check9.3 |wc -l32 打开SecureCRT软件 -> Options