[Binospace] 深入分析HBase-Phoenix执行机制与原理

标签: binospace 分析 hbase | 发表时间:2014-02-25 10:42 | 作者:cloudera
出处:http://www.iteye.com

针对HBase上SQL解决方案,目前社区内比较热门的有Cloudera的Impala,Horntworks的Drill,以及Hive。根据与HBase的操作方式,可以分为三种:

  • 以MapReduce为核心,单个任务使用hbase-client原始接口访问;
  • 以Google Dremel为核心,单个任务使用hbase-client原始接口访问;
  • 以HBase-Coprocessor为核心,结合Google Dremel的思想,客户端合并多个节点的处理结果。

Phoenix的安装:

2)安装apache-maven,可以自行google
3)mvn process-sources
4)mvn package -DskipTests
5)拷贝phoenix-{versionid}.jar到HBASE_HOME/lib/下,重启RS
6)java -jar phoenix-{versionid}-client.jar $(zkquorum) example/web_stat.sql example/web_stat.csv  //导入数据
7)java -jar phoenix-{versionid}-client.jar $(zkquorum) example/web_stat_query.sql //执行查询
 
对于SQL查询的解析过程:
 
antlr3/PhoenixSQL.g  ===antlr===〉
ls ${PHOENIX_HOME}/target/generated-sources/antlr3/com/salesforce/phoenix/parse
PhoenixSQLLexer.java  PhoenixSQLParser.java  PhoenixSQL.tokens
 
这里以一条Select语句为例子介绍其中的流程:
SELECT DOMAIN, AVG(CORE) Average_CPU_Usage, AVG(DB) Average_DB_Usage

FROM WEB_STAT
GROUP BY DOMAIN
ORDER BY DOMAIN DESC;

1)提交的SQL语句, PhoenixSQLLexer执行词法解析。注意这里的PhoenixSQLLexer是从src/antlr3/PhoenixSQL.g,经过antlr的翻译,生成的java代码。
目前SQL语句中可以识别的Token有:

tokens
{
SELECT=’select’;
FROM=’from’;
USING=’using’;
WHERE=’where’;
NOT=’not’;
AND=’and’;
OR=’or’;
NULL=’null’;
TRUE=’true’;
FALSE=’false’;
LIKE=’like’;
AS=’as’;
OUTER=’outer’;
ON=’on’;
IN=’in’;
GROUP=’group’;
HAVING=’having’;
ORDER=’order’;
BY=’by’;
ASC=’asc’;
DESC=’desc’;
NULLS=’nulls’;
LIMIT=’limit’;
FIRST=’first’;
LAST=’last’;
DATA=’data’;
CASE=’case’;
WHEN=’when’;
THEN=’then’;
ELSE=’else’;
END=’end’;
EXISTS=’exists’;
IS=’is’;
FIRST=’first’;
DISTINCT=’distinct’;
JOIN=’join’;
INNER=’inner’;
LEFT=’left’;
RIGHT=’right’;
FULL=’full’;
BETWEEN=’between’;
UPSERT=’upsert’;
INTO=’into’;
VALUES=’values’;
DELETE=’delete’;
CREATE=’create’;
DROP=’drop’;
PRIMARY=’primary’;
KEY=’key’;
ALTER=’alter’;
COLUMN=’column’;
TABLE=’table’;
ADD=’add’;
SPLIT=’split’;
EXPLAIN=’explain’;
VIEW=’view’;
IF=’if’;
CONSTRAINT=’constraint’;
}

 
2)根据PhoenixSQLParser的解析确定com.salesforce.phoenix.jdbc.PhoenixStatement.ExecutableStatement(Interface)的类型,目前有如下几类:
  • 增删数据:ExecutableAddColumnStatement、ExecutableDropColumnStatement
  • 创建/删除表格:ExecutableCreateTableStatement、ExecutableDropTableStatement
  • Select操作:ExecutableSelectStatement
  • 导入数据:ExecutableUpsertStatement
  • 解释执行:ExecutableExplainStatement
3)执行(2)中提供的实例化的ExecutableStatement提供executeQuery方法:
  • 创建QueryCompiler。
  • 执行compile过程。(识别limit、having、where、order、projector等操作,生成ScanPlan)
  • 封装Scanner,并根据识别出的修饰词,对于结果进行修饰,整合出ResultIterator的各种功能的实现,具体在com.salesforce.phoenix.iterator包下。
  • 该SQL对应的包装类为:OrderedAggregatingResultIterator.//它是如何组织数据,保证数据按照DESC或者ASC的方式展示?
在Delegator当中创建:
rowAggregators = {

instance of com.salesforce.phoenix.expression.function.CountAggregateFunction$1(id=2409), instance of com.salesforce.phoenix.expression.function.CountAggregateFunction$1(id=2410), instance of com.salesforce.phoenix.expression.aggregator.LongSumAggregator(id=2411), instance of com.salesforce.phoenix.expression.aggregator.LongSumAggregator(id=2412)
}

 
对于创建表格的逻辑:
1)解析SQL,翻译可执行的ExecutableCreateTableStatement,实例化MutationPlan。
2)创建MetaDataClient对象,将解析出的Statement转换成PTable的模型,更新SYSTEM.TABLE中的内容.(如果SYSTEM.TABLE不存在,还需要创建该表)
3)调用PhoenixConnection.addTable操作,这里会根据ConnectionQueryServicesImpl执行相关的服务。
4)加载Coprocessor。
            descriptor.addCoprocessor(ScanRegionObserver.class.getName(), phoenixJarPath, 1, null);
descriptor.addCoprocessor(UngroupedAggregateRegionObserver.class.getName(), phoenixJarPath, 1, null);
descriptor.addCoprocessor(GroupedAggregateRegionObserver.class.getName(), phoenixJarPath, 1, null);
descriptor.addCoprocessor(HashJoiningRegionObserver.class.getName(), phoenixJarPath, 1, null);
这里加载的Coprocessor有:
ScanRegionObserver:封装RegionObserver.postScannerOpen接口,捕获出现的异常。即在scanner开启之后,做基本遍历,属于基础类实现。
UngroupedAggregateRegionObserver:
GroupedAggregateRegionObserver
HashJoiningRegionObserver
会在RegionCoprocessorHost的组织下,分别执行这四个类的doPostScanOpen操作,会根据QueryPlan以及Statement中包含的信息,进行功能筛选和组装,最终被返回的结果,是已经按照需求处理过的,从而实现类似于GroupBy、Sort等操作。
 
2)
 
 
Coprocessor机制 :
包括两部分,Observer和Endpoint
Observer有RegionObserver、WALObserver、MasterObserver。用来实现固定执行点的”插桩”的功能,有点像关系型数据库当中的触发器的功能。
这里以RegionObserver的实现为例,介绍一下其中实现细节。
1)为Table加载Observer接口的实现类。
2)客户端调用某个操作的位置时,调用接口。例如,RegionObserver的postScannerOpen()会在执行scannerOpen之后执行。
3)每一个Region设置一个RegionCoprocessorHost,负责管理加载到该Region的Coprocessor。
4)每一个Region设置一个RegionCoprocesorEnvironment,封装在ObserverContext当中,作为执行Coprocessor的上下文环境。
Endpoint不同于Observer,虽然它也是被加载到Region上,但是它的执行方式,是由Client端借助Table.coprocessorExec执行,是client到Regions的一次或者多次RPC操作,有时可能还需要在Client端对获取到的数据进行合并。可以查看一例:使用Coprocessor进行RowCount统计  http://www.binospace.com/index.php/make-your-hbase-better-2/
 

本系列文章属于 Binos_ICTBinospace个人技术博客原创,原文链接为 http://www.binospace.com/index.php/in-depth-analysis-hbase-phoenix,未经允许,不得转载。



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [binospace 分析 hbase] 推荐:

[Binospace] 深入分析HBase-Phoenix执行机制与原理

- - SQL - 编程语言 - ITeye博客
针对HBase上SQL解决方案,目前社区内比较热门的有Cloudera的Impala,Horntworks的Drill,以及Hive. 根据与HBase的操作方式,可以分为三种:. 以MapReduce为核心,单个任务使用hbase-client原始接口访问;. 以Google Dremel为核心,单个任务使用hbase-client原始接口访问;.

HBase Coprocessor的分析

- - NoSQLFan
本文来自于NoSQLFan联合作者@ koven2049,他在淘宝从事Hadoop及HBase相关的应用和 优化. 对Hadoop、HBase都有深入的了解,本文就是他对HBase Coprocessor的一些分析,分享给大家. 原文地址: http://walkoven.com/?p=77.

HBase性能深度分析

- Rubby - 《程序员》杂志官网
HBase作为BigTable的一个开源实现,随着其应用的普及,用户对它的性能数据愈发关注. 本文将为您揭开HBase性能测试的一角,邀您一起参与到对云计算模块性能调优的深度思考中. 对于BigTable类型的分布式数据库应用来说,用户往往会对其性能状况有极大的兴趣,这其中又对实时数据插入性能更为关注.

HBase实现分析:HFile - HBase技术社区

- -
在这里主要分析一下HFile V2的各个组成部分的一些细节,重点分析了HFile V2的多级索引的机制,接下去有时间的话会分析源码中对HFile的读写扫描操作. 如下图,HFile的组成分成四部分,分别是Scanned Block(数据block)、Non-Scanned block(元数据block)、Load-on-open(在hbase运行时,HFile需要加载到内存中的索引、bloom filter和文件信息)以及trailer(文件尾).

HBase工程师线上工作经验总结----HBase常见问题及分析

- - 互联网 - ITeye博客
阅读本文可以带着下面问题:. 1.HBase遇到问题,可以从几方面解决问题. 2.HBase个别请求为什么很慢. 3.客户端读写请求为什么大量出错. 4.大量服务端exception,一般原因是什么. 6.Hbase数据写进去,为什么会没有了,可能的原因是什么. regionserver发生abort,遇到最多是什么情况.

两次hbase丢失数据的故障及原因分析

- gengmao - 蓝色时分
    hbase的稳定性是近期社区的重要关注点,毕竟稳定的系统才能被推广开来,这里有几次稳定性故障和大家分享.     第一次生产故障的现象及原因. 1 hbase发现无法写入 2 通过hbck检测发现.META.表中出现空洞,具体log是:;Chain of regions in table.     修复方法:直接使用check_meta.rb重新生成.META.表并修补空洞,但是会引起数据丢失.

实时分析系统(HIVE/HBASE/IMPALA)浅析

- - 数据库 - ITeye博客
1. 什么是实时分析(在线查询)系统. 大数据领域里面,实时分析(在线查询)系统是最常见的一种场景,通常用于客户投诉处理,实时数据分析,在线查询等等过. 因为是查询应用,通常有以下特点:. b. 查询条件复杂(多个维度,维度不固定),有简单(带有ID). c. 查询范围大(通常查询表记录在几十亿级别).

华为HBase二级索引(Secondary Index)细节分析

- - 数据库 - ITeye博客
华为在HBTC 2012上由其高级技术经理Anoop Sam John透露了其 二级索引方案,这在业界引起极大的反响,甚至有人认为,如果华为早点公布这个方案,hbase的某些问题早就解决了. 其核心思想是保证索引表和主表在同一个region server上. 目前该方案华为已经开源,详见: https://github.com/Huawei-Hadoop/hindex.

HBase在单Column和多Column情况下批量Put的性能对比分析

- - IT技术博客大学习
标签:   HBase   Put. 针对HBase在单column family单column qualifier和单column family多column qualifier两种场景下,分别批量Put写入时的性能对比情况,下面是结合HBase的源码来简单分析解释这一现象. 在客户端批量写入时,单列族单列模式和单列族多列模式的TPS和RPC次数相差很大,以客户端10个线程,开启WAL的两种模式下的测试数据为例,.

数据导入HBase最常用的三种方式及实践分析(2)

- - 开源软件 - ITeye博客
HBase提供importtsv工具支持从TSV文件中将数据导入HBase. 使用该工具将文本数据加载至HBase十分高效,因为它是通过MapReduce Job来实施导入的. 哪怕是要从现有的关系型数据库中加载数据,也可以先将数据导入文本文件中,然后使用importtsv 工具导入HBase. 在导入海量数据时,这个方式运行的很好,因为导出数据比在关系型数据库中执行SQL快很多.