Hbase Sql 层 Phoenix 的三个特性Row timestamp, Sequences 和 Salted Tables
Row timestamp
Phoenix 从4.6版本开始,提供了一个映射Hbase 的native timestamp 到phoenix的办法,从而可以利用Hbase提供的对于时序数据处理和查询的一系列优化手段。
这玩意可以干什么呢?
如果表里面有raw_Timestamp列的话,可以在查询的时候省下大部分的扫描时间,因为Hbase的 HFile meta数据里面会有最小和最大的时间戳,查询的时候,如果目标时间戳没有在当前HFile, 那么就直接跳过。
如果有列名被声明为row_timestamp, 必须满足以下的约束条件
- 只有类型为TIME, DATE, TIMESTAMP,BIGINT, UNSIGNED_LONG, 且是主键的列才能声明为row_timestamp
- 只有一个主键列能够声明为row_timestamp
- 值不能为null
- 声明为row_timestamp的列的值不能为负数
当往表里插入row_timestamp 列的时候,使用upsert values 或者 upsert select,可以显式的指定或者是让Phoenix自动生成值,如果没有指定的话,Phoenix使用服务器时间来设定raw_timestamp列,
Sequences
Sequences是一个标准的sql特性,可以生成单调的递增的数字序列,通常作为ID来使用。
create sequence my_schema.my_sequences
这句话会创建一个叫做my_schema.my_sequence 的序列值1, 每次增加1,没有最大值最小值,在Phoenix会缓存100个序列值。
如果想要指定最小最大值和每次增加的步幅,可以使用下面的语句
create sequence my_schema.my_sequence start with 100 increment by 2 cache 10
Salted Tables
如果你写数据的key单调递增的话,或者说你的key会导致数据都写到一个hbase 的region server的话,会造成hbase的单点问题,就是负载都在一台机器上,其他机器比较空闲,负载失衡,出现这种情况的话是比较不合理的。
为什么会出现这样的问题呢?这和hbase的存储方式有关系,hbase是以多维有序map的形式存储数据的,所以如果你写数据的key单调有序,写入位置就会集中在一起。
Phoenix的解决方案是显式的给key加盐,如果你创建了一个为自己带盐的表的话,你再去看hbase里的原始数据,你会发现你的row key前面被随机加上了一个字节。这样的话就会改变数据的单调性。分散写入负载。
使用为自己带盐的表,可以这样写:
create table tableName(id integer primary key) salt_buckets=20.
由于在key只增加一个字节,所以salt_buckets的取值范围是1-256.
如果你使用为自己带盐的表,你需要注意一些事情
1,顺序扫描
因为rowKey自己带盐,所以尽管你顺序的插入了,但是实际上并没有顺序的存,所以如果你的查询有顺序扫描发生的话,返回的结果肯定会和没有为自己带盐的表的返回结果不一样的啦。
2,splitting
如果没有指明表的splitting point, 为自己带盐的表会根据salt byte来进行pre-split, 这样可以保证负载分散,即使是在表的初始化阶段也会pre-split(并不是很明白想说啥)。如果用户想要指明split-point的话,必须考虑到salt byte的存在。
3,Row Key Order
Pre-split 同样保证了在进入同一个region server的数据拥有同样的salt byte,这样的话可以保证数据按照原来应有的顺序来排序,当发生跨region server的并行扫描的时候, 我们可以使用这一特性来在客户端合并排序,扫描结果会和没有为自己带盐的表一样的。
这个RowKey order可以用 phoenix.query.rowKeyOrderSaltedTable 配置项来调整,当设置为true时,我们不允许用户指定为自己带盐的表的split-point, 这样可以确保每个bucket 只包含进入同一个region server的salt byte。当这个配置项打开时,在进行rowKey扫描的时候,为自己带盐的表会表现得和不为自己带盐的表一样
性能
性能当然没的说了:点这里查看性能评估报告
Hbase Sql 层 Phoenix 的三个特性Row timestamp, Sequences 和 Salted Tables相关推荐
- Hbase索引( Phoenix二级索引)
Hbase索引( Phoenix二级索引) 1. Phoenix简介 1.1.Phoenix安装 1.2.常用命令 1.3.phoenix表映射 1.3.1.视图映射 1.3.2.表映射 1.3.3. ...
- CockroachDB架构——SQL层
ChockroachDB架构的SQL层向开发人员公开SQL API并将SQL语句转换成数据库其他部分使用的键值操作. --注意: 1)如果您还没有准备好,我们建议您阅读架构概览部分. 一.概览 一旦C ...
- SQL优化整理(三)
单表优化 字段 索引 查询SQL 引擎 MyISAM InnoDB 系统调优参数 升级硬件 读写分离 缓存 表分区 分区的好处: 分区的限制和缺点: 分区的类型: 分区适合的场景 垂直拆分的优点是: ...
- 分布式CAP定理,为什么不能同时满足三个特性?
在弄清楚这个问题之前,我们先了解一下什么是分布式的CAP定理. 根据百度百科的定义,CAP定理又称CAP原则,指的是在一个分布式系统中,Consistency(一致性). Availability(可 ...
- CockroachDB分布式SQL层架构解析
SQL 层 SQL层主要用来将SQL语句转化为K-V操作,并将操作送给事务层. SQL Parser, Planner, Executor,CRDB通过yacc将语句解析为抽象语句树(AST),yac ...
- php开发面试题---php面向对象详解(对象的主要三个特性)
php开发面试题---php面向对象详解(对象的主要三个特性) 一.总结 一句话总结: 对象的行为:可以对 对象施加那些操作,开灯,关灯就是行为. 对象的形态:当施加那些方法是对象如何响应,颜色,尺寸 ...
- sql语言和php,SQL语言快速入门(三)_php
我们日常使用SQL语言的工作过程中,使用最多的还是从已经建立好的数据库中查询信息.下面,我们就来详细介绍一下如何使用SQL语言实现各种数据库查询操作. SELECT-FROM 为方便讲解,我们在数据库 ...
- 标准SQL的update语句三种用法
标准SQL的update语句三种用法 一.环境: MySQL-5.0.41-win32 Windows XP professional 二.建立测试环境: DROP TABLE IF EXIS ...
- css的三个特性 背景透明设置
关于行内元素(补充一点) 行内元素只能容纳文本或其他行内元素.(a特殊a里面可以放块级元素) 例子: 关于行高tip: 选择器的嵌套层级不应大于3级,位置靠后的限定条件应尽可能的精确. 属性定义必须另 ...
最新文章
- NVIDIA GPU的快速傅立叶变换
- python traceback安装_Python错误:Traceback (most recent call last):感觉是软件出了问题
- 电脑开机3秒就重启循环_3秒开机不是梦,泰捷WE40旗舰升级版体验
- 一看就懂的例子告诉你用react-redux的正确姿势
- 实现三联tab切换特效
- 主页所停留的时间实现交互
- vsftp服务器mysql认证_基于mysql控制vsftp的用户认证机制
- 在图层上使用CATransform3D制做三维动画-b
- 2019年考研篇(2020毕业)
- 将iTunes音乐传输到USB驱动器以在汽车中收听
- 蓝桥杯单片机电路图讲解-74HC138-74HC02和74HC573的联合使用讲解
- 大公司都在用的招聘分析模型,会EXCEL就行,白嫖党不要错过
- Square, Inc.公布收购Afterpay的计划,将加强并促进卖家与Cash App生态系统之间的进一步融合
- golang errors
- java结束if_java中如何结束if循环
- ROS新手教程(talker/listener)
- 错误连接数据库 [xxx] : org.pentaho.di.core.exception.KettleDatabaseException: Error occurred while try
- Mysql报错Table ‘blog.user‘ doesn‘t exist
- 计算机科学期刊几个外审,期刊投稿服务发表论文外审一般几个专家审稿_优发表...
- 宠物经济:一门千亿级市场的孤独生意