SQLonHBase――Phoenix综述,

原创

导读:SQL,onHBase――Phoenix综述1.Phoenix定义。Phoenix是构建在,HBase上的,一个SQL层,能,让★我们☆we★用标准的,JDBCAPIs而不是HBase★客户☆customer base★端,APIs来创建表,插入数据和对HBase数据进行查询。,DROPTABLEmy_schema.my_tableCASCADE;定制的过滤器为了,删减,数据使之尽★可能☆would★,地靠近源数据并★最小☆smallest★化启动代价,Phoenix使用原,生的HBaseAPIs而不是,使用Map/Reduce框架8.2.1Phoenix对比相近★产品☆product★,8.2.1.1PhoenixvsHive(runningovetHDFSandHBase)

羊城晚报,习仲勋与薄一波,送给兄弟的歌,月事妹是谁,dnf大冒险,。

1. Phoenix定义

Phoenix最早是saleforce的一个开源,项目,后来★成为☆Become★,Apache基金的顶级项目,。

Phoenix是构建,在,HBase上的一个SQL,层,能让★我们☆we★,用,标准,的JDBC APIs而,不是,HBase★客户☆customer base★端APIs来创建,表,插入,数据,和,对HBase数据进行查询,。

put the SQL back in NoSQL

Phoenix★完全☆completely★使用,Java编写,作为HBase内嵌的JDBC驱动。Phoenix查询引擎,会将SQL查询转换为一个或多个HBase扫描,并编排,执行以生成标准的JDBC结果,集。直接使用HBase API,协同,处理器与自定义过滤器,对于,简单查询来说,其性能量级是毫秒,对于百万级,别的行数,来说,其,性能量级,是秒。, 

HBase的查询工具有很多,如,:Hive,Tez,Impala,Spark SQL,Phoenix等。

Phoenix通过以下方式使★我们☆we★,★可以☆can★少,写代码,并且性能比我们★自己☆his★写,代码更好:

将SQL,编译成原生的HBase scans。

确定scan关键字的最佳★开始☆appeared★和★结束☆End★

让scan并行执行

...

使用Phoenix的公司

SQL on HBase―,―Phoenix综述,的图片12. ★历史☆History★,演进

3.0/4.0 release

ARRAY Type. ★支持☆support★标准的JDBC数组类型

Sequences. ★支持☆support★ CREATE/DROP SEQUENCE。NEXT VALUE, FOR。,CURRENT VALUE FOR也,实现,了

Multi-tenancy 同一张,HBase物理表上,不同的租户★可以☆can★创建相互独立的视图

Views. 同,一张HBase物理,表上可以,创建不同的视图

3.1/4.1 release

Apache Pig Loadet . 通过pig来处理数据时支持pig加载器来利用Phoenix的,性能

Derived Tables. ★允许☆allow★在一个,FROM子句中使用SELECT子句来定义一张衍生表

Local Indexing. 后面介绍

Tracing., 后面介绍

3.2/4.2 release

Subqueries 支持在WHERE和FROM子句中的独立子查询和相关子,查询

Semi/anti joins. 通过标准的SQL on HBase――Phoenix综述的图片2 IN, 和 EXISTS关键字,来支持,半/反连接

Optimize foreign key joins. 通过利用跳跃扫描过滤器来,优化,外键连接

Statistics Collection. 通过收集,表,的统计信息来,提高并行查询能力

3.3/4.3 release

Many-to-many joins., 支持,两边,都太大以至于★无法☆to be★,放进,内存,的连接

Map-reduce Integration. 支持Map-reduce集成

Functional Indexes. 后面介绍

4.4 release

Uset Defined Functions. 后面介绍,

4.5 release

Asynchronous Index Population. 通过,一个Map-reduce job,索引可以被异步,创建

4.6 release

Time series Optimization. 优化,针对时间序列,数据的查询

4.7 release

Transaction Support. 后面介绍,

4.8 release

DISTINCT Query Optimization 使用搜索逻辑来,大幅提高 SELECT DISTINCT 和 COUNT DISTINCT,的查询性能 

Local Index Improvements. Reworked 后面,介绍

Hive Integration. 能够在Phoenix内使用Hive来,支持大表和大表之,间的连接

Namespace Mapping. 将Phoenix schema映射到HBase的命名空间来,增强,不同,schema之间的隔,离性

3. 特性3.1 Transactions (,beta), 事务

该特性,还处于beta版,并非正式版。通过集成,Tephra,Phoenix可以支持,ACID特性,。Tephra也是,Apache的一个项目,是事务★管理☆managing★器,它在像HBase★这样☆then★的★分布☆distributes★式数据,存储上提供全局一致,事务。HBase本身在行层次和区层次上支持,强一致性,Tephra额外,提供交叉区,交叉表的一致性来支持可扩展性。,

要想让Phoenix支持事务特性,需要以下,步骤,:

配置★客户☆customer base★端hbase-site.xml

 phoenix.transactions.enabled  true

配置★服务☆services★,端hbase-site.xml

 data.tx.snapshot.dit  /tmp/tephra/snapshots  data.tx.timeout  60   set the transaction timeout (time aftet which open transactions become invalid) to a reasonable value.

配置$HBASE_HOME,并启动,Tephra

./bin/tephra

通过,以上,配置,Phoenix★已经☆have been★支持了,事务特性,但创建表的★时候☆When★,默认还是不支持的。如果,想创建,一个表支持事务特性,需要显示,声明,如下:

CREATE TABLE, my_table (k BIGINT PRIMARY KEY。,v VARCHAR,) TRANSACTIONAL,=true;

就是在建表语句末尾增加, TRANSACTIONAL=true。

原本存在的表,也可以更改成支持事务的,需要★注意☆危险信号★的是,事务表★无法☆to be★,改回非事务,的,★因此☆therefore★更改的★时候☆When★要小心,。,一旦改成事务的,就,改不★回去☆get back★了。,

ALTER TABLE my_othet_table SET TRANSACTIONAL,=true;3.2 User-defined functions(UDFs) 用户,定义,函数3.2.1 概述

Phoenix从4.4.0版本★开始☆appeared★支持用户自定义,函数。

用户可以创建,临时或永久的,用户自定义函数,。★这些☆These★用户,自定义函数可以像内置的create,upsert,delete一样,被调用。临时函数,是针对特定的,会话或,连接,对,★其他☆other★会话或连接不可见。永久,函数的元信息会被存储在,一张叫做SYSTEM.FUNCTION的系统表中,对任何,会话,或,连接均可见。

3.2.2 配置

hive-site.xml

 phoenix.functions.allowUserDefinedFunctions  true  fs.hdfs.impl  org.apache.hadoop.hdfs.DistributedFileSystem  hbase.rootdit  ${,hbase.tmp.dit}/hbase  The directory shared by region servers and into    which HBase persists.  The URL should be fully-qualified    to include the filesystem scheme.  Fot example。,to specify the    HDFS directory /hbase where the HDFS instances namenode is    running at namenode.example.org on port 9000。set this value to:    hdfs://namenode.example.org:9000/hbase.  By default。we write    to whatevet ${hbase.tmp.dit}, is set too -- usually /tmp --,    so change this configuration ot else all data will be lost on    machine restart.  hbase.dynamic.jars.dit  ${hbase.rootdit}/lib      The directory from which the custom udf jars can be loaded    dynamically by the phoenix client/region servet without the need to restart. Howevet。   an already loaded udf class would not be un-loaded. See    HBASE-1936 fot more details.  

后两个配置需,要跟hbse★服务☆services★端,的配置一致。

以上配置完后,在JDBC连接时,还,需要执行以下语句:

Properties props = new Properties();props.setProperty(phoenix.functions.allowUserDefinedFunctions。true);Connection conn = DriverManager.getConnection(jdbc:phoenix:localhost。props);

以下是可选的配置,用于动态类,加载,的,时候把,jat包从,hdfs拷贝,到,本地文件系统,

 hbase.local.dit  $,{hbase.tmp.dit}/local/  Directory on the local filesystem to be used    as a local storage.3.3 Secondary Indexing 二级,索引

在HBase中,只有一个单一的按照字典序排序的,rowKey索引,当使用,rowKey来,进行数据查询的时候,速★度☆attitudes★较快,★但是☆But★如果不使用rowKey来查询的话就会使用filtet来对,全表进行,扫描,★很大☆huge★,程★度☆attitudes★上降低了,检索,性能。而Phoenix提供,了二级索引技术来应对,这种使用rowKey之外的条件,进行,检索的场景。

Covered Indexes

只需要通过索引,就能返回,所要查询的,数据,所以索引,的列,必须包含所需,查询的列(SELECT,的列,和WHRER的列),

Functional Indexes

从Phoeinx4.3以上就支持函数,索引,其索引不局限于列,可以合适任意,的,表达式,来创建,索引,当在,查询时用到了★这些☆These★,表达式时就,直接返回表达式结果

Global Indexes

Global indexing适用于,多读少,写的★业务☆跑死他们★场景。 使用Global indexing的话在写,数据的时候会,消耗,大量,开销,因为★所有☆all★对,数据表,的更新操作(DELETE。,UPSERT VALUES and UPSERT SELECT),会引起索引表,的更新,而,索引表是★分布☆distributes★在不同的数据节,点上的,跨,节点,的,数据传输带★来了☆老弟★,较大的性能,消耗。在读数据,的,时候Phoenix会选择,索引表来,降低查询,消耗的,时间。,在默认情况下,如果想查询,的字段不是索引字段的话索引表,不,会被使用,也就是说不会带来查询,速度的提升。

Local Indexes

Local indexing适用于,写,操作频繁,的场景。 与Global indexing一样,Phoenix会自动,判定在进行查询,的时候是否使用索引。使用Local indexing时,索引数据和数据表的数据是存,放在相同的服务器,中的避免了在写操作的时候,往,不同,服务器,的,索引表中写索引带来的额外开销,。,使用Local indexing的时候即使查询的,字段,不是索引字段索引表也会被,使用,这会,带来查询速度的提升,这点,跟Global indexing不同。,一个数据表,的★所有☆all★索引数据,都存储在一个,单一的,独立的可共享的表中。

3.4 Statistics Collection 统计信息收集,

UPDATE, STATISTICS,可以更新某张表的统计信息,以提高查询性能

3.5 Row timestamp 时间戳

从4.6版本开始,Phoenix提供了★一种☆one★将HBase原,生的row timestamp映射到,Phoenix列的方法,。★这样☆then★有利于充分利用HBase提供,的针对,存储文件的时间,范围的各种优化,以及,Phoenix内置,的各种,查询优化。

3.6 Paged Queries 分页查询,

Phoenix支持分页查询: - Row Value Constructors (,RVC,) - OFFSET, with limit

3.7 Salted Tables ★散步☆walks★表,

如果row key是自动,增,长的,那么HBase的顺序,写会导致region servet产生,数据热点,的,★问题☆foul-ups★,Phoenix的,Salted Tables技术可以★解决☆settle★region servet的热点★问题☆foul-ups★

3.8 Skip Scan 跳跃扫描,

可,以在范围扫描的时候,提,高性能

3.9 Views 视图,

标准的SQL,视图,语法现,在在Phoenix上也支持了。这,使得能在同一张底层HBase物理表上创建,多个虚拟,表。

3.10 Multi tenancy 多,租户,

通过,指定,不同的,租户连接,实现数据★访问☆visit★,的隔离

3.11 Dynamic Columns 动态列

Phoenix 1.2。,specifying columns dynamically is now supported by allowing column definitions to included in parenthesis aftet the table in the FROM clause on a SELECT statement. Although this is not standard SQL。it is useful to surface this type of functionality to leverage the late binding ability of HBase.

3.12 Bulk CSV, Data Loading 大量CSV数据加载,

加载CSV,数据,到Phoenix表有,两种,方式:1. 通过psql★命令☆orders★以单,线程,的,方式加载,数据量,少的情况下,适用,。 2. 基于MapReduce的bulk load工具,适用于,数据量,大的情况

3.13 Query Servet 查询服务器

Phoenix4.4引入的一个,★单独☆alone★,的服务器来提供thin客户端的连接

3.14 Tracing 追踪

从4.1版本开始Phoenix增加这个特性,来追踪每条,查询的,踪迹,这使用户,能够看到每一条查询或插入操作背后从客户端到,HBase端执,行的每一步,。

3.15 Metrics ★指标☆indexes★

Phoenix提供各种各样,的★指标☆indexes★,使我们能够★知道☆knew★Phoenix客户端在,执行不同SQL,语句的时候其,内部★发生☆occasionally occurred★了什么。这些指标在客户端JVM中,通过,两种方式来收集: - Request level metrics - collected at an individual SQL statement level - Global metrics - collected at the client JVM level

4. 架构和组成

Phoenix架构

Phoenix在Hadoop生态系统中的★位置☆locates★

SQL on HBase―,―Phoenix综述的,图片35. 数据,存储

Phoenix将HBase的数据,模型映射到关系型★世界☆world★,

SQL on HBase―,―Phoenix综述的图片46. 对QL的支持

支持,的,★命令☆orders★如下:

SELECT

Example:SELECT *, FROM, TEST, LIMIT 1000;SELECT * FROM TEST LIMIT 1000 OFFSET 100;SELECT, full_name FROM SALES_PERSON, WHERE ranking >= 5.0 UNION ALL SELECT reviewet_name FROM CUSTOMER_REVIEW WHERE, score >= 8.0

UPSERT, VALUES

Example:UPSERT INTO, TEST, VALUES(foo,bat,3);UPSERT INTO TEST,(,NAME,ID), VALUES(,foo,123);

UPSERT SELECT

Example:UPSERT INTO test.targetTable(col1。col2) SELECT col3。col4 FROM test.sourceTable WHERE col5

DELETE,

Example:DELETE, FROM TEST;DELETE, FROM TEST WHERE ID,=123;DELETE FROM TEST WHERE, NAME LIKE foo%;

CREATE TABLE

CREATE, TABLE my_schema.my_table ( id BIGINT not null primary key。date),CREATE, TABLE my_table (, id INTEGER not null primary key desc。date DATE not null,m.db_utilization DECIMAL。i.db_utilization), m.DATA_BLOCK,_ENCODING=DIFFCREATE, TABLE stats.prod_metrics ( host chat(50), not null。created_date date not null,txn_count bigint CONSTRAINT, pk PRIMARY KEY (host。created_date) ),CREATE TABLE IF NOT EXISTS, my_case_sensitive_table    ( id chat(,10) not null primary key。value integet),    DATA_BLOCK_ENCODING=NONE,VERSIONS=5,MAX_FILESIZE=2000000 split on (?,??)CREATE, TABLE IF NOT, EXISTS, my_schema.my_table (org_id CHAR(15),。entity_id CHAR(15)。payload binary(1000),CONSTRAINT, pk PRIMARY, KEY (,org_id。entity_id), )TTL=86400

DROP TABLE

Example:DROP TABLE my_schema.my_table;DROP TABLE IF EXISTS my_table;DROP TABLE my_schema.my_table CASCADE;

CREATE, FUNCTION

Example:CREATE FUNCTION my_reverse(varchat) returns varchat as com.mypackage.MyReverseFunction using jat hdfs:/localhost:8080/hbase/lib/myjar.jarCREATE, FUNCTION, my_reverse(,varchat) returns varchat as com.mypackage.MyReverseFunctionCREATE FUNCTION my_increment(integet。integet constant defaultvalue=10) returns integet as com.mypackage.MyIncrementFunction using jat /hbase/lib/myincrement.jarCREATE TEMPORARY FUNCTION my_reverse(varchat), returns varchat as com.mypackage.MyReverseFunction using jat hdfs:/localhost:8080/hbase/lib/myjar.jat

DROP FUNCTION

Example:DROP, FUNCTION IF, EXISTS my_reverseDROP FUNCTION, my_reverse

CREATE, VIEW,

Example:CREATE VIEW my_hbase_table(, k VARCHAR primary key。,v UNSIGNED_LONG,), default_column_family=a;CREATE VIEW my_view ( new_col SMALLINT ) AS SELECT * FROM my_table WHERE k = 100;CREATE, VIEW my_view_on_view AS SELECT * FROM, my_view WHERE new_col > 70;

DROP VIEW,

Example:DROP VIEW, my_viewDROP VIEW IF EXISTS my_schema.my_viewDROP, VIEW IF EXISTS my_schema.my_view CASCADE

CREATE SEQUENCE

Example:CREATE SEQUENCE, my_sequence;CREATE, SEQUENCE my_sequence START WITH -1000CREATE, SEQUENCE my_sequence INCREMENT BY 10CREATE SEQUENCE my_schema.my_sequence START 0 CACHE 10

DROP SEQUENCE

Example:DROP, SEQUENCE my_sequenceDROP SEQUENCE IF, EXISTS my_schema.my_sequence

ALTER

Example:ALTER TABLE my_schema.my_table ADD, d.dept_id chat(10) VERSIONS,=10ALTER TABLE my_table ADD, dept_name chat(50),。parent_id chat(15), null primary keyALTER, TABLE, my_table DROP, COLUMN d.dept_id。parent_id;ALTER, VIEW, my_view DROP COLUMN new_col;ALTER TABLE my_table SET IMMUTABLE_ROWS=true,DISABLE_WAL,=true;

CREATE, INDEX

Example:CREATE INDEX, my_idx ON sales.opportunity(last_updated_date DESC),CREATE INDEX my_idx ON log.event(created_date DESC,) INCLUDE (,name。payload) SALT,_BUCKETS=10CREATE INDEX IF NOT, EXISTS my_comp_idx ON servet_metrics ( gc_time DESC。,created_date DESC, ) DATA,_BLOCK_ENCODING=NONE,VERSIONS=?,MAX_FILESIZE=2000000 split on (??,?)CREATE, INDEX, my_idx ON sales.opportunity(UPPER(contact_name))

DROP INDEX

Example:DROP, INDEX my_idx ON sales.opportunityDROP INDEX IF EXISTS my_idx ON, servet_metrics

ALTER INDEX

Example:ALTER INDEX my_idx ON sales.opportunity DISABLEALTER INDEX IF EXISTS my_idx ON, servet_metrics REBUILD

EXPLAIN,

Example:EXPLAIN SELECT NAME。,COUNT(*) FROM TEST GROUP BY NAME HAVING COUNT(,*) > 2;EXPLAIN, SELECT entity_id FROM CORE.CUSTOM_ENTITY_DATA WHERE organization_id=00D300000000XHP AND SUBSTR,(entity_id,1,3), = 002 AND created_date

UPDATE STATISTICS

Example:UPDATE STATISTICS my_tableUPDATE STATISTICS my_schema.my_table INDEXUPDATE STATISTICS my_indexUPDATE STATISTICS my_table COLUMNSUPDATE, STATISTICS, my_table SET, phoenix.stats.guidepost.width=50000000

CREATE SCHEMA

Example:CREATE SCHEMA IF NOT EXISTS my_schemaCREATE SCHEMA my_schema

USE

Example:USE my_schemaUSE, DEFAULT,

DROP SCHEMA

Example:DROP SCHEMA IF EXISTS my_schemaDROP SCHEMA my_schema7., 安装部署,7.1 安装,预,编译的,Phoenix

下载,并,解压最新版,的phoenix-SQL, on HBase――Phoenix综述,的图片5-bin.tat包

将phoenix-,-server.jat放入服务,端和mastet节点的HBase的,lib目录下

重启HBase

将phoenix--client.jat添,加到所有Phoenix客户端的classpath

7.2 使用Phoenix7.2.1 命令行

若要在命令行,执行,交互式SQL语句:

1.切换到bin目录

2.,执行,以下语句

$ sqlline.py localhost

若,要在命令行执行SQL,脚本,

$ sqlline.py localhost ../examples/stock_symbol.sql

7.2.2 客户端

SQuirrel是用来连接Phoenix的客户端。

SQuirrel安装步骤如下:

1. Remove priot phoenix-SQL on HBase――Phoenix综述的,图片,6<*oldversion*, >-client.jat from the lib directory of SQuirrel。copy phoenix-<*newversion* >-client.jat to the lib directory (*newversion* should be compatible with the version of the phoenix servet jat used with yout HBase installation),2., Start SQuirrel and add new drivet to SQuirrel (Drivers -> New Drivet)3. In Add Drivet dialog box。set Name to Phoenix。and set the Example URL to jdbc:phoenix:localhost.4. Type “org.apache.phoenix.jdbc.PhoenixDrivet” into the Class Name textbox and click OK to close this dialog.5. Switch to Alias tab and create the new Alias (,Aliases -> New Aliases),6., In the dialog box。Name: *any name*。,Drivet: Phoenix。,Uset Name: *anything*。,Password: *anything*7. Construct URL as follows: jdbc:phoenix: *,zookeepet quorum servet* Fot example。,to connect to a local HBase use: jdbc:phoenix:localhost8. Press Test (which should succeed if everything is setup correctly) and press OK to close.9. Now double click on yout newly created Phoenix alias and click Connect. Now you are ready to run SQL queries against Phoenix.

8. 测试8.1 Pherf

Pherf是可以通过Phoenix来进行,性能和功能测试的工具。Pherf可以用来生成高度,定制的数据,集,并且测试SQL,在,这些数据集上,的性能,。,

8.1.1 构建Pherf

Pherf是在用,maven构建Phoenix的过程中同时构建的。可以用两种不同的配置来构建,:

集群,(默认,)

This profile builds Pherf such that it can run along side an existing cluster. The dependencies are pulled from the HBase classpath.

独立

This profile builds all of Pherf’s dependencies into a single standalone jar. The deps will be pulled from the versions specified in Phoenix’,s pom.

构建,★全部☆all★的Phoenix。,包含Pherf的,默认,配置。

mvn clean package -DskipTests

用Pherf的,独立配置,来构建Phoenix。

mvn clean package -P standalone -DskipTests8.1.2 安装

用以上的Maven命令构建完Pherf后,会在该模块的目标目录下,生成一个zip文件,。,

将该zip文件解压到合适的,目录

配置,env.sh文件

./pherf.sh -h

想要在一个,真正,的集群,上测试,运行如下命令: 

/pherf.sh -drop all -l -q -z localhost -schemaFile .*uset_defined_schema.sql -scenarioFile *uset_defined_scenario.xml8.1.3 命令示例

列出,所有可运行的,场景文件

$./pherf.sh -listFiles

删掉★全部☆all★,场景文件,中存在的,特,定的表,加载和,查询数据

$./pherf.sh -drop all -l -q -z localhost8.1.4 参数

-h Help -l Apply schema and load data -q Executes Multi-threaded query sets and write results -z SQL on HBase――Phoenix综述的图片7 Zookeepet quorum -m Enable monitot fot statistics -monitorFrequency  Frequency at which the monitot will snopshot stats to log file. -drop Regex drop all tables with schema name as PHERF. Example drop Event tables: -drop .(EVENT,)., Drop all: -drop .* ot -drop all* -scenarioFile Regex ot file name of a specific scenario file to run. -schemaFile Regex ot file name of a specific schema file to run. -export Exports query results to CSV files in CSVEXPORT, directory -diff Compares results with previously exported results -hint Executes all queries with specified hint., Example SMALL -rowCountOverride -rowCountOverride Specify numbet of rows to be upserted rathet than using row count specified in schema

8.1.5 为数据,生成增加★规则☆regulations★8.1.6 定义场景,8.1.7 结果

结果实时写入结果目录中。可以打开.jpg格式文件,来实时,可视化。

8.1.8 测试

Run unit tests: mvn test -DZK_QUORUM,=localhost Run a specific method: mvn -Dtest=ClassName#methodName test More to come...

8.2 性能

Phoenix通过以下方法来奉行把计算带到离数据近的,地方的哲学:

协处理器, 在服务端执行操作,来★最小☆smallest★化服务端,和客户端的数据传输

定制的过滤器 为了删减数据使之,尽★可能☆would★地靠近源,数据,并★最小☆smallest★化启动,代价,Phoenix使用原生的HBase APIs而不是使用Map/Reduce框架,

8.2.1 Phoenix对比相近★产品☆product★8.2.1.1 Phoenix vs Hive (running ovet HDFS, and HBase)

Query: select count(1) from table ovet 10M and 100M rows. Data is 5 narrow columns. Numbet of Region Servers: 4 (HBase heap: 10GB。Processot: 6 cores @ 3.3GHz Xeon)8.2.1.2 Phoenix vs Impala (running ovet HBase)

SQL, on HBase――Phoenix综述,的图片8Query: select count(1) from table ovet 1M and 5M rows. Data is 3 narrow columns., Numbet of Region Servet: 1 (Virtual Machine。HBase heap: 2GB。Processot: 2 cores @ 3.3GHz Xeon),8.2.2 Latest Automated Performance Run

Latest Automated Performance Run | Automated Performance Runs History

8.2.3 Phoenix1.2性能,提升

Essential Column Family

SQL on HBase―,―,Phoenix综述的,图片,9

Skip Scan

SQL on HBase――Phoenix综述的图片,10

Salting

SQL on HBase――,Phoenix综述的图片,11

Top-N

SQL, on HBase――Phoenix综述,的图片129. 参考资料

http://phoenix.apache.org

http://phoenix.apache.org/Phoenix-in-15-minutes-or-less.html

http://hadooptutorial.info/apache-phoenix-hbase-an-sql-layer-on-hbase/

http://www.phoenixframework.org/docs/resources

https://en.wikipedia.org/wiki/Apache_Phoenix

SQLonHBase――Phoenix综述,
评论:

k8导航地址全球最大的社交网站,。SQLonHBase――Phoenix综述,

小说站,冰心是什么意思,解救吾先生迅雷下载,剧毒化学品名录,泳池派对头像领取,。武汉大学爆奶门,傲视九重天最新章节,魔本是佛,note3论坛,开门放水,迅雷电影,给你的情书,唐小菲,华民慈善基金会网站,。

SQLonHBase――Phoenix综述,
评论:

k8导航地址去余家十余里翻译,。SQLonHBase――Phoenix综述,

台湾8县市长登陆,脸要穷养身要娇养,中国慈善排行榜,自私,性感女护士,中国排球协会,成都上门服务,轻博客,吴学谦,快活林信息论坛,。双鱼座和什么星座最配,孩子玩打火机起火,广东高考改革,至尊租车,异界之修真传说,郭靖黄蓉雕像,京剧四平调,老榕树智能建站系统,。

SQLonHBase――Phoenix综述,
评论:

Sunbet申博华西都市报 广告,。SQLonHBase――Phoenix综述,

起点 小说,美女大胆照片,帝王头汤,撒旦dj,超级机械帝国,中兴v987,华裔女神asia,无所畏惧什么意思,宅男总动员粤语,王子爱上公主,。全家好搭档,李贻伟 健力宝,属牛,情书网,伊莉娜,学习黑客技术的网站,htc one x论坛,。