phoenix教程

关于phoenix的名称,直译为凤凰,在中国有凤凰涅盘之说,咋一听似乎该项目之前挂过很多次,现在翻身了,

实际上其官网戏谑的说有此一问的,可以回家睡大觉了,没时间回答你。

phoenix是构建的Hbase之上的,使用标准的SQL操作Hbase,可以做联机事务处理,拥有低延迟的特性。

Apache Hadoop的用于OLTP和运营分析

phoenix会把SQL编译成一系列的Hbase的scan操作,然后把scan结果生成标准的JDBC结果集,

其底层由于使用了Hbase的API,协处理器,过滤器,处理千万级行的数据也只用毫秒或秒级就搞定。

支持有:SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY等操作。

但phoenix目前不支持Intersect, Minus操作,Oracle是支持此操作的。

可以通过类似Mysql方式连接phoenix:

Connection conn = DriverManager.getConnection("jdbc:phoenix:server1,server2:3333",props);

Phoenix支持通过DDL命令进行表格创建和版本化增量更改,相应元数据存储在Hbase表中。

元数据用于描述phoenix表与hbase之间的关系,映射。

phoenix表可能通过两种方式创建

从头开始,这种方式Hbase的表与列族都会自动创建。
映射到一个存在的Hbase表。
Phoenix版"Hello World"例子:

create table test (mykey integer not null primary key, mycolumn varchar);
upsert into test values (1,'Hello');
upsert into test values (2,'World!');
select * from test;
//注意,phoenix没有insert,其insert与update合起来叫做:upsert

打印结果如下:

+-------+------------+
| MYKEY |  MYCOLUMN  |
+-------+------------+
| 1     | Hello      |
| 2     | World!     |
+-------+------------+

 

Apache Phoenix通过结合两者的优点,在Hadoop中为低延迟应用程序启用OLTP和运营分析:

  • 具有完整ACID事务功能的标准SQL和JDBC API的强大功能
  • 通过利用HBase作为其后备存储,来自NoSQL世界的后期绑定模式读取功能的灵活性

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


谁在使用Apache Phoenix?在这里阅读更多......
phoenix教程_第1张图片

任务

通过定义明确的行业标准API,成为Hadoop的OLTP和运营分析的可信数据平台。

快速开始

厌倦了阅读已经只是想开始?看看我们的常见问题,倾听来自Apache凤凰谈话的Hadoop峰会2015年,回顾概括介绍,并跳转到我们的快速入门指南这里。

SQL支持

Apache Phoenix接受您的SQL查询,将其编译为一系列HBase扫描,并协调这些扫描的运行以生成常规JDBC结果集。直接使用HBase API以及协处理器和自定义过滤器,可以为小型查询提供毫秒级的性能,或者为数千万行提供数秒的性能。

要查看支持的完整列表,请转到我们的语言参考。支持所有标准SQL查询构造,包括SELECT,FROM,WHERE,GROUP BY,HAVING,ORDER BY等。它还支持一整套DML命令以及通过DDL命令创建表和版本化增量更改。

这是目前支持的列表:

  • 关系运算符。相交,减。
  • 其他内置功能。这些很容易添加 - 请阅读此博客以获取分步说明。

连接

使用JDBC获取与HBase集群的连接,如下所示:

Connection conn = DriverManager.getConnection(“jdbc:phoenix:server1,server2:3333”,props);

其中props是可选属性,可能包括Phoenix和HBase配置属性,以及由以下内容组成的连接字符串:

jdbc:phoenix [ : [ :<端口号> [ :<根节点> [ : [ : ]]]]]

对于任何省略的部分,将从hbase-site.xml配置文件中使用相关属性值hbase.zookeeper.quorum,hbase.zookeeper.property.clientPort和zookeeper.znode.parent。可选的principal和keytab文件可用于连接到Kerberos安全集群。如果仅指定了principal,那么这将定义用户名,每个不同的用户都有自己的专用HBase连接(HConnection)。这提供了在同一JVM上具有多个不同连接的方法,每个连接具有不同的配置属性。

例如,以下连接字符串可能用于运行时间较长的查询,其中longRunningProps指定具有更长超时的Phoenix和HBase配置属性:

Connection conn = DriverManager.getConnection(“jdbc:phoenix:my_server:longRunning”,longRunningProps);

而以下连接字符串可能用于较短的运行查询:

Connection conn = DriverManager.getConnection(“jdbc:phoenix:my_server:shortRunning”,shortRunningProps);

请阅读相关的FAQ条目以获取示例URL。

交易

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

非事务性表没有超出HBase保证行级原子性的保证(参见此处)。此外,非事务表在发生提交之前不会看到它们的更新。Apache Phoenix,UPSERT VALUES,UPSERT SELECT和DELETE的DML命令,批量挂起对客户端HBase表的更改。提交事务时将更改发送到服务器,并在事务回滚时将其丢弃。如果为连接打开了自动提交,那么只要有可能,Phoenix就会通过服务器端的协处理器执行整个DML命令,因此性能会提高。

时间戳

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

事务表可能无法控制时间戳。相反,事务管理器会在提交后分配时间戳,这些时间戳将成为HBase单元格时间戳。时间戳仍然对应于挂钟时间,但是它们乘以1,000,000以确保整个群集的唯一性的足够粒度。

架构

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

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

  1. 从头开始构建,在这种情况下,将自动创建HBase表和列族。
  2. 映射到现有的HBase的表,通过创建任一读写TABLE或只读VIEW,需要提醒的是该行密钥和密钥值的二进制表示必须匹配菲尼克斯的数据类型(参见数据类型参考为二进制表示的细节)。
    • 对于读写TABLE,如果列族不存在,则会自动创建列族。空键值将添加到每个现有行的第一列族中,以最小化查询的投影大小。
    • 对于只读VIEW,所有列族必须已存在。对HBase表进行的唯一更改是添加用于查询处理的Phoenix协处理器。VIEW的主要用例是将现有数据传输到Phoenix表,因为VIEW上不允许进行数据修改,查询性能可能会低于TABLE。

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

涂改

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

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

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

查看

Phoenix支持可更新的视图,具有独特的功能,利用HBase的无模式功能,可以向其添加列。所有视图都共享相同的底层物理HBase表,甚至可以独立编制索引。更多阅读这里。

多租户

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

架构在读取时间

另一个与模式相关的功能允许在查询时动态定义列。这在您在创建时事先不知道所有列的情况下非常有用。您可以在此处找到有关此功能的更多详细信息。

映射到现有HBase表

Apache Phoenix支持通过CREATE TABLE和CREATE VIEW DDL语句映射到现有HBase表。在这两种情况下,HBase元数据保持原样,除了使用CREATE TABLE,启用KEEP_DELETED_CELLS选项以允许闪回查询正常工作。对于CREATE TABLE,将创建尚不存在的任何HBase元数据(表,列族)。请注意,表和列系列名称区分大小写,Phoenix的大写字母包含所有名称。要在DDL语句中使名称区分大小写,请用双引号将其括起来,如下所示:

创建视图“MyTable”(“a”。ID VARCHAR PRIMARY KEY)

对于CREATE TABLE,还将为每一行添加一个空键值,以便查询按预期运行(不需要在扫描期间投影所有列)。对于CREATE VIEW,这将不会完成,也不会创建任何HBase元数据。相反,现有的HBase元数据必须与DDL语句或ERROR 505(42000)中指定的元数据匹配:将只读取表是只读的。

另一个需要注意的是,HBase中字节序列化的方式必须与Phoenix预期的字节序列化方式相匹配。对于VARCHAR,CHAR和UNSIGNED_ *类型,Phoenix使用HBase Bytes实用程序方法来执行序列化。CHAR类型只需要单字节字符,UNSIGNED类型需要大于或等于零的值。

我们的复合行键是通过简单地将值连接在一起形成的,零字节字符用作可变长度类型之后的分隔符。有关我们的类型系统的更多信息,请参阅数据类型。

表也​​可以声明为盐渍以防止HBase区域热点。你只需要声明你的桌子有多少盐桶,凤凰将透明地为你管理盐腌。你会在此功能找到更详细的在这里,用盐腌和加盐的表之间的写入吞吐量一个很好的比较一起在这里。

蜜蜂

可以通过java.sql元数据接口检索表的目录,列,主键和类型:DatabaseMetaData,ParameterMetaData和ResultSetMetaData。为了通过DatabaseMetaData接口检索模式,表和列,模式模式,表模式和列模式在LIKE表达式中指定(即%和_是通过字符转义的通配符)。元数据API中的表目录参数用于根据多租户表的租户ID进行过滤。

你可能感兴趣的:(phoenix教程)