Phoenix边讲架构边调优

Phoenix边讲架构边调优
www.zeeklog.com  - Phoenix边讲架构边调优


一 基础架构详解

1  概念

讲调优之前,需要大家深入了解phoenix的架构,这样才能更好的调优。

Apache Phoenix在Hadoop中实现OLTP和运营分析,实现低延迟应用是通过结合下面两个优势:

具有完整ACID事务功能的标准SQL和JDBC API的强大功能

通过利用HBase作为后台存储,为NoSQL世界提供了late-bound, schema-on-read灵活的功能。

Apache Phoenix与其他Hadoop产品完全集成,如Spark,Hive,Pig,Flume和Map Reduce。

2  Sql支持

Apache Phoenix将SQL查询编译为一系列HBase scan,并编排这些scan的运行以生成常规的JDBC结果集。直接使用HBase的API的,与协处理器和自定义过滤器一起,实现了小查询以毫秒为单位,数千万级别的查询秒级。支持所有标准的SQL查询结构,包括SELECT,FROM,WHERE,GROUP BY,HAVING,ORDER BY等。它还支持一整套DML命令,以及通过DDL命令进行表格创建和版本增量更改。

以下是目前不支持的列表:

关系运算符。相交,减号。

其他内置功能。这些很容易添加 – 后面会出文章介绍。

3  事务

要启用完整的ACID事务(4.7.0版本中提供的测试版功能),请将phoenix.transactions.enabled属性设置为true。在这种情况下,您还需要运行发行版中包含的事务管理器。一旦启用,表可以选择性地声明为事务性的(参见这里为方向)。对事务表的提交将具有全或无的行为 - 要么所有的数据都将被提交(包括对二级索引的任何更新),要么没有(将抛出异常)。支持跨表和跨行事务。另外,查询时,事务表将会看到他们自己的未提交的数据。乐观并发模型用于检测第一次提交获取语义的行级别冲突。稍后的提交会产生一个异常,表明发现了冲突。事务是在语句中引用事务表时隐式启动的,在这种情况下,除非发生提交或回滚,否则不会看到来自其他连接的更新。

非事务表没有超出hbase担保的行级别的原子性的担保。另外,非事务表直到发生提交之后才会看到它们的更新。ApachePhoenix的DML命令,UPSERT VALUES,UPSERT SELECT和DELETE,在客户端批量挂起HBASE表的变化。当事务被提交时,更改被发送到服务器,并在事务回滚时被丢弃。如果为连接启用自动提交,则Phoenix将尽可能通过服务器端的协处理器执行整个DML命令,从而提高性能。

4 时间戳

通常情况下,应用程序会让HBase管理时间戳。但是,在某些情况下,应用程序需要控制时间戳本身。在这种情况下,可以在连接时指定CurrentSCN属性来控制任何DDL,DML或查询的时间戳。此功能可用于对先前行值运行快照查询,因为Phoenix使用此连接属性的值作为扫描的最大时间戳。

对于事务表时间戳是不可控的。事务管理器分配时间戳,在提交后该分配的时间戳变成hbase cell时间戳。

5 schema

Apache Phoenix支持通过DDL命令进行表创建和版本化增量更改。表元数据存储在HBase表中并进行版本控制,以便对先前版本的快照查询将自动使用正确的schema。

phoenix是通过CREATE TABLE命令创建的,可以是:

1. 从头开始构建,在这种情况下,HBase的表和列簇将自动创建。

2. 映射一张现有的hbase表,可以通过创建一个读写表或者一个只读视图来实现。需要注意的是hbase表Rowkey的数据类型及key values的数据类型必须和phoenix的数据类型一致。

对于读写表,如果它们不存在,列族将自动创建。将空的键值添加到每个行的第一列族中,以最小化查询project的大小。

对于只读VIEW,所有列系列必须已经存在。对HBase表进行的唯一修改是增加用于查询处理的Phoenix协处理器。VIEW的主要用例是将现有数据转移到Phoenix表中,因为在VIEW上不允许修改数据,查询性能可能会低于TABLE。

所有schema都是版本化的(最多保留1000个版本)。对旧数据进行快照查询将根据您连接的时间(基于CurrentSCN属性)提取并使用正确的模式。

6 变更

ALTER TABLE命令可以修改phoenix表。当运行引用表的SQL语句时,Phoenix将默认与服务器进行检查,以确保它具有最新的表元数据和统计信息。当您事先知道表格的结构可能永远不会改变时,这个RPC可能是不必要的。在Phoenix 4.7中添加了UPDATE_CACHE_FREQUENCY属性,以允许用户声明服务器检查元数据更新的频率(例如添加或删除表列或更新表统计信息)。可能的值是ALWAYS(默认),从不,和毫秒数值。ALWAYS值会导致客户端每次执行一个引用表的语句(或每次提交一个UPSERT VALUES语句)一次就检查服务器。

例如,以下DDL命令将创建表FOO并声明客户端应每15分钟检查表或其统计信息的更新:


CREATE TABLE FOO(k BIGINT PRIMARY KEY,v VARCHAR)UPDATE_CACHE_FREQUENCY = 900000;

7 视图

Phoenix支持表上的可更新视图,这种独特的功能可以利用HBase的无模式功能来添加列。所有视图都共享相同的底层物理HBase表,甚至可以独立索引。后面可以详细介绍。

8 多租户

phoenix建立在视图支持之上,也支持多租户。与视图一样,多租户视图可以添加专门为该用户定义的列。

9 Salting (散列)

一个表可以被声明为咸防止Region热点。您只需声明您的表有多少个salted桶,phoenix将透明地管理您的Salting。这个优化后面详细介绍。

9 映射hbase表

可以通过创建视图或者表的方式映射一张已经存在的hbase表到phoenix。详细操作请