关于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和运营分析:
Apache Phoenix与其他Hadoop产品完全集成,如Spark,Hive,Pig,Flume和Map Reduce。
谁在使用Apache Phoenix?在这里阅读更多......
通过定义明确的行业标准API,成为Hadoop的OLTP和运营分析的可信数据平台。
厌倦了阅读已经只是想开始?看看我们的常见问题,倾听来自Apache凤凰谈话的Hadoop峰会2015年,回顾概括介绍,并跳转到我们的快速入门指南这里。
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命令创建的,可以是:
所有模式都是版本化的(最多保留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进行过滤。