Hbase Sql 层 Phoenix 的三个特性Row timestamp, Sequences 和 Salted Tables
来源:互联网 发布:p2p数据分析报告 编辑:程序博客网 时间:2024/06/05 11:17
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
- Phoenix 散裂表(Salted Tables)
- Phoenix / HBase中的salted table
- HBase和Phoenix的整合
- Phoenix Salted Table
- Phoenix——HBase之上的SQL
- HBase---Phoenix(SQL on HBase)
- Phoenix和Hbase整合
- 【HBase】HBase上安装使用Phoenix来用sql语句更新操作数据,安装的过程各种坑和经验
- Phoenix 使用sql查询hbase
- Phoenix(sql on hbase)简介
- hbase SQL 框架phoenix使用
- phoenix——提供hbase的sql操作的框架
- phoenix——提供hbase的sql操作的框架
- Hbase的SQL接口之Phoenix使用总结(1)
- Hbase的SQL接口之Phoenix使用总结(1)
- phoenix 3.1 + hbase 0.94.21 的安装和使用
- phoenix 3.1 + hbase 0.94.21 的安装和使用
- mysql表数据发生变化时,主动通知业务系统(mysql-udf-http)
- 生活杂记
- Android安全专项-利用androguard分析微信
- 深入浅出Nginx之七【重要知识补充】
- pku1795 DNA Laboratory 状压DP
- Hbase Sql 层 Phoenix 的三个特性Row timestamp, Sequences 和 Salted Tables
- Socket-TCP/UDP浅析
- 多个 Kylin 服务
- AngularJS 指令的 Scope (作用域)
- cas 单点登录问题
- 基于FastDfs的分布式文件存储系统设计
- 互联网+农业的机遇与挑战
- 优先队列及最小堆最大堆
- Extjs4----anchor布局