1. 定义

TTL(Time to Live) 用于限定数据的超时时间。

2.原理

以Column Family的TTL为例介绍,

hbase(main):001:0> desc 'wxy:test'
Table wxy:test is ENABLED
wxy:test
COLUMN FAMILIES DESCRIPTION
{NAME => 'cf', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', VERSIONS =
> '2', COMPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => 'FOREVER', KEEP_DELETED_CELLS => 'FALSE', BLOC
KSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}
{NAME => 'f1', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', COMPRESSIO
N => 'NONE', VERSIONS => '5', TTL => 'FOREVER', MIN_VERSIONS => '0', KEEP_DELETED_CELLS => 'FALSE', BLOC
KSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}
2 row(s) in 0.9730 seconds

CF默认的TTL值是FOREVER,也就是永不过期。

  • 修改TTL的值,CF的TTL的值以秒为单位:

hbase(main):003:0> disable 'wxy:test'
0 row(s) in 1.3500 seconds

hbase(main):004:0> alter 'wxy:test', {NAME=>'f1', TTL => '100'}
Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 1.1780 seconds

hbase(main):002:0> desc 'wxy:test'
Table wxy:test is DISABLED
wxy:test
COLUMN FAMILIES DESCRIPTION
{NAME => 'cf', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', VERSIONS =
> '2', COMPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => 'FOREVER', KEEP_DELETED_CELLS => 'FALSE', BLOC
KSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}
{NAME => 'f1', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', COMPRESSIO
N => 'NONE', VERSIONS => '5', TTL => '100 SECONDS (1 MINUTE 40 SECOND)', MIN_VERSIONS => '0', KEEP_DELET
ED_CELLS => 'FALSE', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}
2 row(s) in 0.0680 seconds

hbase(main):003:0> enable 'wxy:test'
0 row(s) in 0.2460 seconds

  • scan现有的值:
hbase(main):007:0> scan 'wxy:test'
ROW COLUMN+CELL
r1 column=cf:name, timestamp=1503047499079, value=lisi4
r1 column=cf:sex, timestamp=1502788726648, value=male
r2 column=cf:age, timestamp=1503041691183, value=20
r3 column=cf:age, timestamp=1503041723715, value=23
r4 column=cf:name, timestamp=1503041738224, value=Alex
4 row(s) in 0.1140 seconds
  • 更新表
hbase(main):007:0> put 'wxy:test' ,'r4','f1:address','shandi'
0 row(s) in 0.2590 seconds hbase(main):008:0> scan 'wxy:test'
ROW COLUMN+CELL
r1 column=cf:name, timestamp=1503047499079, value=lisi4
r1 column=cf:sex, timestamp=1502788726648, value=male
r2 column=cf:age, timestamp=1503041691183, value=20
r3 column=cf:age, timestamp=1503041723715, value=23
r4 column=cf:name, timestamp=1503041738224, value=Alex
r4 column=f1:address, timestamp=1505976958276, value=shandi
4 row(s) in 0.0680 seconds
  • 过30秒后扫描表   
hbase(main):012:0> scan 'wxy:test'
ROW COLUMN+CELL
r1 column=cf:name, timestamp=1503047499079, value=lisi4
r1 column=cf:sex, timestamp=1502788726648, value=male
r2 column=cf:age, timestamp=1503041691183, value=20
r3 column=cf:age, timestamp=1503041723715, value=23
r4 column=cf:name, timestamp=1503041738224, value=Alex
r4 column=f1:address, timestamp=1505976958276, value=shandi
4 row(s) in 0.0460 seconds hbase(main):013:0> scan 'wxy:test'
ROW COLUMN+CELL
r1 column=cf:name, timestamp=1503047499079, value=lisi4
r1 column=cf:sex, timestamp=1502788726648, value=male
r2 column=cf:age, timestamp=1503041691183, value=20
r3 column=cf:age, timestamp=1503041723715, value=23
r4 column=cf:name, timestamp=1503041738224, value=Alex
r4 column=f1:address, timestamp=1505976958276, value=shandi
4 row(s) in 0.0390 seconds

如上,连续扫描两次,数据没有变化

  • 过100秒后扫描表
hbase(main):019:0> scan 'wxy:test'
ROW COLUMN+CELL
r1 column=cf:name, timestamp=1503047499079, value=lisi4
r1 column=cf:sex, timestamp=1502788726648, value=male
r2 column=cf:age, timestamp=1503041691183, value=20
r3 column=cf:age, timestamp=1503041723715, value=23
r4 column=cf:name, timestamp=1503041738224, value=Alex
4 row(s) in 0.0280 seconds

 发现r4的f1不见了。这就是TTL的工作原理。

TTL=>的更新超时时间是指:该列最后更新的时间,到超时时间的限制,而不是第一次创建,到超时时间;

     同时我们也注意到100秒后r4被删除,但是只删除掉了r1的f1列,如果r1有其他列,比如cf,则其他列保留,TTL的概念只针对CELL

如果一个Store file仅包括过期的rows, minor comact的时候会将这些文件删掉(可以参见HBase compact)。将hbase.store.delete.expired.storefile 设置成false或者将minimum number of versions 设置成除0意外的值可以将这个feature diable掉。number of versions的默认值是0:

hbase(main):001:0> desc 'wxy:test'
Table wxy:test is ENABLED
wxy:test
COLUMN FAMILIES DESCRIPTION
{NAME => 'cf', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', VERSIONS =
> '2', COMPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => 'FOREVER', KEEP_DELETED_CELLS => 'FALSE', BLOC
KSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}
{NAME => 'f1', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', COMPRESSIO
N => 'NONE', VERSIONS => '5', TTL => 'FOREVER', MIN_VERSIONS => '0', KEEP_DELETED_CELLS => 'FALSE', BLOC
KSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}
2 row(s) in 0.9730 seconds

     注意:修改表结构之前,需要先disable 表,否则表中的记录被清空!HBase不disable直接去alter 表是可以的! 参加如下测试过程:

hbase(main):004:0> scan 'test'
ROW COLUMN+CELL
row1 column=cf:a, timestamp=1500967679327, value=value1
row2 column=cf:b, timestamp=1500967692945, value=value2
row3 column=cf:c, timestamp=1500967715743, value=value3
3 row(s) in 0.2490 seconds hbase(main):005:0> desc 'test'
Table test is ENABLED
test
COLUMN FAMILIES DESCRIPTION
{NAME => 'cf', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', VERSIONS =
> '1', COMPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => 'FOREVER', KEEP_DELETED_CELLS => 'FALSE', BLOC
KSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}
1 row(s) in 0.0880 seconds hbase(main):006:0> alter 'test',{NAME => 'cf',TTL => '100'}
Updating all regions with the new schema...
0/1 regions updated.
1/1 regions updated.
Done.
0 row(s) in 2.2200 seconds hbase(main):007:0> scan 'test'
ROW COLUMN+CELL
0 row(s) in 0.0190 seconds

3. 粒度

早期版本控制粒度是column family; 新版本因为Cell可以支持tag了,所以可以在cell级别设置TTL了。(待考证)

( 参见http://hbase.apache.org/book.html#ttl 及https://issues.apache.org/jira/browse/HBASE-10560)

Cell的TTL与Column family的TTL区别:

  • Column family的TTL以秒为单位,cell的TTL以毫秒为单位
  • 如果有有cell级别的TTL,则cell的TTL override CF的TTL; 但是不能超出CF级别的TTL

以下引自:http://hbase.apache.org/book.html#ttl

  • Cell TTLs are expressed in units of milliseconds instead of seconds.

  • A cell TTLs cannot extend the effective lifetime of a cell beyond a ColumnFamily level TTL setting.

以下引自:https://issues.apache.org/jira/browse/HBASE-10560 作者的comments:

We can keep the existing column level definition and enforcement mechanism and extend it to look for a TTL cell tag during compaction. If one is found, it can override the CF setting. TTL overrides can be passed up to the server in an operation attribute.

参考文献:

http://blog.csdn.net/wulantian/article/details/41010947

http://hbase.apache.org/book.html#ttl

https://issues.apache.org/jira/browse/HBASE-10560

HBase的TTL介绍的更多相关文章

  1. hbase的TTL机制清除opentsdb的超时数据

    我们发现用opentsdb向hbase写数据之后,磁盘占用率飙升得很快,我们存的业务数据只用保存一个月的即可,了解hbase的TTL机制可以清除相关表.相关行的超时数据,之前在数据备份时,我介绍了,o ...

  2. HBase基本知识介绍及典型案例分析

    本次分享的内容主要分为以下五点: HBase基本知识: HBase读写流程: RowKey设计要点: HBase生态介绍: HBase典型案例分析. 首先我们简单介绍一下 HBase 是什么. HBa ...

  3. HBase shell 命令介绍

    HBase shell是HBase的一套命令行工具,类似传统数据中的sql概念,可以使用shell命令来查询HBase中数据的详细情况.安装完HBase之后,如果配置了HBase的环境变量,只要在sh ...

  4. Hbase记录-ZooKeeper介绍

    ZooKeeper是一个分布式协调服务来管理大量的主机.协调和管理在分布式环境的一个服务是一个复杂的过程.ZooKeeper 简单解决了其结构和API这个问题.ZooKeeper允许开发人员能够专注于 ...

  5. pinpoint 修改hbase表TTL值

    操作步骤 查找出数据大的hbase表 root@990fb5560f64:/opt/hbase/hbase-# ls CHANGES.txt LICENSE.txt README.txt conf h ...

  6. HBase Snapshot功能介绍

    HBase在0.94之后提供了Snapshot功能,一个snapshot其实就是一组metadata信息的集合,它可以让管理员将表恢复到以前的一个状态.snapshot并不是一份拷贝,它只是一个文件名 ...

  7. 【转】HBase 超详细介绍

    ---恢复内容开始--- http://blog.csdn.net/frankiewang008/article/details/41965543 1-HBase的安装 HBase是什么? HBase ...

  8. HBase MVCC 机制介绍

    关键词:MVCC HBase 一致性 本文最好结合源码进行阅读 什么是MVCC ? MVCC(MultiVersionConsistencyControl , 多版本控制协议),是一种通过数据的多版本 ...

  9. HBase总结(十一)hbase Java API 介绍及使用示例

    几个相关类与HBase数据模型之间的对应关系 java类 HBase数据模型 HBaseAdmin 数据库(DataBase) HBaseConfiguration HTable 表(Table) H ...

随机推荐

  1. git操作——git pull 撤销误操作,恢复本地代码

    需求 开发的代码还未commit到git本地仓库,就从git远程仓库上pull了代码,导致开发的代码直接被冲掉,需要退回到上一个版本代码. 操作 进入到项目git本地仓库文件夹下 打开cmd窗口,执行 ...

  2. Arthas用法

    简介 Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱. 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 这个类从哪个 jar 包加载的? 为什么会报各种类相关的 ...

  3. C++第一次作业(循环语句的使用)

    一.知识点 循环结构 二.教学目的 掌握while和do...while循环语句在C++中的写法 三.教学内容 1.while语句 (1)执行顺序:先判断表达式(循环控制条件)的值,若表达式的值为tr ...

  4. HTTP Status 500 - java.lang.ClassNotFoundException: org.apache.jsp.register_jsp

    你搜一下你的页面中是不是有<!---->的注释 去掉就好了 改成jsp的注释 1).JSP页面中的HTML注释 JSP页面中的HTML注释使用“<!—”和“-->”创建,它的具 ...

  5. Redis源码解析:10scan类命令的实现

    像keys或者smembers命令,需要遍历数据集合中的所有元素.在一个大的数据库中使用,可能会阻塞服务器较长的一段时间,造成性能问题,因此不适用与生产环境. 在Redis2.8.0中引入了scan类 ...

  6. @NOIP2018 - D1T1@ 铺设道路

    目录 @题目描述@ @考场上的思路@ @比较正常的题解@ @题目描述@ 春春是一名道路工程师,负责铺设一条长度为 n 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 n 块首尾相连的 ...

  7. 如何用phpmyadmin导入大容量.sql文件,直接使用cmd命令进行导入

    很多使用php+mysql建站的站长朋友们,经常要用到phpMyAdmin数据库管理工具备份和恢复数据库,当站点运行很久的时候,MySQL数据库会非常大,当站点碰到问题时,需要使用phpMyAdmin ...

  8. EF CodeFirst 实例Demo

    一直想搞一个EFCodeFirst的Demo,让自己通过实例真正了解CodeFirst,方便以后有需求的时候可以有思路.网上查了很多资料,发现很多博主的文章大量重复,根据推荐步骤走并不一定能够成功,而 ...

  9. canvas+js实现验证码功能

    转载自:https://blog.csdn.net/qq_42463851/article/details/90755734<!DOCTYPE html> <html> < ...

  10. NIO 中文乱码问题的解决代码实现

    之前在网上查询了很多关于解决NIO中文乱码的问题,仁者见仁智者见智,不过就找到的几种方法实现都太繁琐了,稍微研究了下NIO源码,以下是我自己的一种实现,偷懒用最简单的代码去实现是我的习惯! Demo: ...