1. Phoenix定义Phoenix最早是saleforce的一个开源项目,后来成为Apache基金的顶级项目。 Phoenix是构建在HBase上的一个SQL层,能让我们用标准的JDBC APIs而不是HBase客户端APIs来创建表,插入数据和对HBase数据进行查询。
Phoenix完全使用Java编写,作为HBase内嵌的JDBC驱动。Phoenix查询引擎会将SQL查询转换为一个或多个HBase扫描,并编排执行以生成标准的JDBC结果集。直接使用HBase API、协同处理器与自定义过滤器,对于简单查询来说,其性能量级是毫秒,对于百万级别的行数来说,其性能量级是秒。 HBase的查询工具有很多,如:Hive、Tez、Impala、Spark SQL、Phoenix等。 Phoenix通过以下方式使我们可以少写代码,并且性能比我们自己写代码更好:
使用Phoenix的公司 2. 历史演进
ARRAY Type. 支持标准的JDBC数组类型 Sequences. 支持 CREATE/DROP SEQUENCE, NEXT VALUE FOR, CURRENT VALUE FOR也实现了 Multi-tenancy. 同一张HBase物理表上,不同的租户可以创建相互独立的视图 Views. 同一张HBase物理表上可以创建不同的视图
Apache Pig Loader . 通过pig来处理数据时支持pig加载器来利用Phoenix的性能 Derived Tables. 允许在一个FROM子句中使用SELECT子句来定义一张衍生表 Local Indexing. 后面介绍 Tracing. 后面介绍
Subqueries 支持在WHERE和FROM子句中的独立子查询和相关子查询 Semi/anti joins. 通过标准的[NOT] IN 和 [NOT] EXISTS关键字来支持半/反连接 Optimize foreign key joins. 通过利用跳跃扫描过滤器来优化外键连接 Statistics Collection. 通过收集表的统计信息来提高并行查询能力
Many-to-many joins. 支持两边都太大以至于无法放进内存的连接 Map-reduce Integration. 支持Map-reduce集成 Functional Indexes. 后面介绍
User Defined Functions. 后面介绍
Asynchronous Index Population. 通过一个Map-reduce job,索引可以被异步创建
Time series Optimization. 优化针对时间序列数据的查询
Transaction Support. 后面介绍
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的一个项目,是事务管理器,它在像HBase这样的分布式数据存储上提供全局一致事务。HBase本身在行层次和区层次上支持强一致性,Tephra额外提供交叉区、交叉表的一致性来支持可扩展性。 要想让Phoenix支持事务特性,需要以下步骤:
./bin/tephra 通过以上配置,Phoenix已经支持了事务特性,但创建表的时候默认还是不支持的。如果想创建一个表支持事务特性,需要显示声明,如下: CREATE TABLE my_table (k BIGINT PRIMARY KEY, v VARCHAR) TRANSACTIONAL=true; 就是在建表语句末尾增加 原本存在的表也可以更改成支持事务的,需要注意的是,事务表无法改回非事务的,因此更改的时候要小心。一旦改成事务的,就改不回去了。 ALTER TABLE my_other_table SET TRANSACTIONAL=true; 3.2 User-defined functions(UDFs) 用户定义函数3.2.1 概述Phoenix从4.4.0版本开始支持用户自定义函数。 用户可以创建临时或永久的用户自定义函数。这些用户自定义函数可以像内置的create、upsert、delete一样被调用。临时函数是针对特定的会话或连接,对其他会话或连接不可见。永久函数的元信息会被存储在一张叫做SYSTEM.FUNCTION的系统表中,对任何会话或连接均可见。 3.2.2 配置
后两个配置需要跟hbse服务端的配置一致。 以上配置完后,在JDBC连接时还需要执行以下语句: Properties props = new Properties();props.setProperty('phoenix.functions.allowUserDefinedFunctions', 'true');Connection conn = DriverManager.getConnection('jdbc:phoenix:localhost', props); 以下是可选的配置,用于动态类加载的时候把jar包从hdfs拷贝到本地文件系统
3.3 Secondary Indexing 二级索引在HBase中,只有一个单一的按照字典序排序的rowKey索引,当使用rowKey来进行数据查询的时候速度较快,但是如果不使用rowKey来查询的话就会使用filter来对全表进行扫描,很大程度上降低了检索性能。而Phoenix提供了二级索引技术来应对这种使用rowKey之外的条件进行检索的场景。
3.4 Statistics Collection 统计信息收集
3.5 Row timestamp 时间戳
3.6 Paged Queries 分页查询
3.7 Salted Tables 散步表
3.8 Skip Scan 跳跃扫描
3.9 Views 视图
3.10 Multi tenancy 多租户
3.11 Dynamic Columns 动态列
3.12 Bulk CSV Data Loading 大量CSV数据加载
3.13 Query Server 查询服务器
3.14 Tracing 追踪
3.15 Metrics 指标
4. 架构和组成
5. 数据存储
6. 对QL的支持支持的命令如下:
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 reviewer_name FROM CUSTOMER_REVIEW WHERE score >= 8.0
Example:UPSERT INTO TEST VALUES('foo','bar',3);UPSERT INTO TEST(NAME,ID) VALUES('foo',123);
Example:UPSERT INTO test.targetTable(col1, col2) SELECT col3, col4 FROM test.sourceTable WHERE col5 < 100upsert="" into="" foo="" select="" *="" from="">
Example:DELETE FROM TEST;DELETE FROM TEST WHERE ID=123;DELETE FROM TEST WHERE NAME LIKE 'foo%';
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='DIFF'CREATE TABLE stats.prod_metrics ( host char(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' char(10) not null primary key, 'value' integer) 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
Example:DROP TABLE my_schema.my_table;DROP TABLE IF EXISTS my_table;DROP TABLE my_schema.my_table CASCADE;
Example:CREATE FUNCTION my_reverse(varchar) returns varchar as 'com.mypackage.MyReverseFunction' using jar 'hdfs:/localhost:8080/hbase/lib/myjar.jar'CREATE FUNCTION my_reverse(varchar) returns varchar as 'com.mypackage.MyReverseFunction'CREATE FUNCTION my_increment(integer, integer constant defaultvalue='10') returns integer as 'com.mypackage.MyIncrementFunction' using jar '/hbase/lib/myincrement.jar'CREATE TEMPORARY FUNCTION my_reverse(varchar) returns varchar as 'com.mypackage.MyReverseFunction' using jar 'hdfs:/localhost:8080/hbase/lib/myjar.jar'
Example:DROP FUNCTION IF EXISTS my_reverseDROP FUNCTION my_reverse
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;
Example:DROP VIEW my_viewDROP VIEW IF EXISTS my_schema.my_viewDROP VIEW IF EXISTS my_schema.my_view CASCADE
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
Example:DROP SEQUENCE my_sequenceDROP SEQUENCE IF EXISTS my_schema.my_sequence
Example:ALTER TABLE my_schema.my_table ADD d.dept_id char(10) VERSIONS=10ALTER TABLE my_table ADD dept_name char(50), parent_id char(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;
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 server_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))
Example:DROP INDEX my_idx ON sales.opportunityDROP INDEX IF EXISTS my_idx ON server_metrics
Example:ALTER INDEX my_idx ON sales.opportunity DISABLEALTER INDEX IF EXISTS my_idx ON server_metrics REBUILD
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 <>
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
Example:CREATE SCHEMA IF NOT EXISTS my_schemaCREATE SCHEMA my_schema
Example:USE my_schemaUSE DEFAULT
Example:DROP SCHEMA IF EXISTS my_schemaDROP SCHEMA my_schema 7. 安装部署7.1 安装预编译的Phoenix
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 prior phoenix-[*oldversion*]-client.jar from the lib directory of SQuirrel, copy phoenix-[*newversion*]-client.jar to the lib directory (*newversion* should be compatible with the version of the phoenix server jar used with your HBase installation)2. Start SQuirrel and add new driver to SQuirrel (Drivers -> New Driver)3. In Add Driver dialog box, set Name to Phoenix, and set the Example URL to jdbc:phoenix:localhost.4. Type “org.apache.phoenix.jdbc.PhoenixDriver” 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*, Driver: Phoenix, User Name: *anything*, Password: *anything*7. Construct URL as follows: jdbc:phoenix: *zookeeper quorum server*. For 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 your newly created Phoenix alias and click Connect. Now you are ready to run SQL queries against Phoenix. 8. 测试8.1 PherfPherf是可以通过Phoenix来进行性能和功能测试的工具。Pherf可以用来生成高度定制的数据集,并且测试SQL在这些数据集上的性能。 8.1.1 构建PherfPherf是在用maven构建Phoenix的过程中同时构建的。可以用两种不同的配置来构建:
mvn clean package -DskipTests
mvn clean package -P standalone -DskipTests 8.1.2 安装用以上的Maven命令构建完Pherf后,会在该模块的目标目录下生成一个zip文件。
./pherf.sh -drop all -l -q -z localhost -schemaFile .*user_defined_schema.sql -scenarioFile .*user_defined_scenario.xml 8.1.3 命令示例
$./pherf.sh -listFiles
$./pherf.sh -drop all -l -q -z localhost 8.1.4 参数
8.1.5 为数据生成增加规则8.1.6 定义场景8.1.7 结果结果实时写入结果目录中。可以打开.jpg格式文件来实时可视化。 8.1.8 测试
8.2 性能Phoenix通过以下方法来奉行
8.2.1 Phoenix对比相近产品8.2.1.1 Phoenix vs Hive (running over HDFS and HBase)Query: select count(1) from table over 10M and 100M rows. Data is 5 narrow columns. Number of Region Servers: 4 (HBase heap: 10GB, Processor: 6 cores @ 3.3GHz Xeon) 8.2.1.2 Phoenix vs Impala (running over HBase)Query: select count(1) from table over 1M and 5M rows. Data is 3 narrow columns. Number of Region Server: 1 (Virtual Machine, HBase heap: 2GB, Processor: 2 cores @ 3.3GHz Xeon) 8.2.2 Latest Automated Performance RunLatest Automated Performance Run | Automated Performance Runs History 8.2.3 Phoenix1.2性能提升
9. 参考资料
|
|
来自: 小小文摘91gdxi > 《待分类》