impala 查询计划树
impala介绍
MPP什么意思:即大规模并行处理
impala 是一种新型的MPP查询引擎,每一个impala执行的sql,可能同时在多个工作节点上进行运算,每一个节点执行查询任务的一部分,然后通过网络通信传递给下一个子任务,中间数据尽可能不落地。
impala可以处理的数据:HBASE,HDFS,KUDU
impala架构
这个架构图说明了impala的架构,也说明了impala的sql查询的执行流程。
对于图中的名词解释:
odbc:开放的数据库连接
Statestore:impala的消息同步节点
Catalog:impala中的元数据服务节点
impalad:impala系统中任务的执行节点
Query Planner:查询计划树(sql执行计划生成器)
Coordinator: impalad 节点中协调者模块,对外提供查询接口,包括beeswax接口 和 hiveserver2接口
impala 查询的执行流程
可以看到带序号的小箭头,流程如下:
- 向impalad 发送sql 语句: 客户端通过beeswax 或者 hiveserver2接口 发送一个sql查询请求到impalad 节点,
( 名词解释:
FE :impala 代码上划分的使用C++ 实现的 backend部分;
backend :impalad 节点中的任务执行模块,提供任务执行的接口;
) - 生成单机和分布式的执行计划: 之后由FE 模块处理,通过Analyser依次对这个sql执行词法分析、语法分析、语义分析、查询重写等操作。生成该sql 的statement 信息,根据这个信息,Planner生成单机的执行计划, 这个计划是由planNode组成的一棵树,也有一些sql优化。
将Planner的 单机执行计划 转换成 分布式的并行的物理执行计划(由多个Fragment组成),Fragment 之间有数据的依赖,新的计划也会加入一些ExchangeNode 和 DataStreamSink 信息等。
( 名词解释:
Analyser:impalad 提供的一中sql 解析器;
Fragment : sql生成的分布式执行计划的一个子任务(它包括执行计划的一个子树);
ExchangeNode:一种特殊的PlanNode,主要是处理前一个Fragment传递过来的数据;
DataStreamSink:这个不是PlanNode,他的作用是传输当前的Fragment输出数据到不同的节点。
) - 执行这个分布式计划:由BE处理生成的分布式物理执行计划,将Fragment 根据数据的分区信息发配到不同的Impala节点上执行,每个Impala节点接受到Fragment后交由 backend 模块处理Fragment的执行。
(名词解释:
BE:impalad 上使用 Java实现的 frontend 部分。
) - Fragment之间的数据依赖:每一个Fragment 的执行输出通过DataStreamSink 发送到下一个Fragment,由下一个Fragment的ExchangeNode接受,Fragment 运行的过程中不断的向coordinator 节点汇报当前的运行状态。
- 结果汇总:用于查询的sql 通常会有一个单独的Fragment用于结果的汇总,这个Fragment只会在coordinator中运行,将多个backend的最终执行结果汇总,然后转换成 ResultSet信息。
- 读取查询的结果:客户端调用 获取 ResultSet的接口,读取查询的结果,最后客户端调用CloseOperation 关闭本次查询,本质本次查询的结束。
impala 查询数据为什么比hive快:
impala之所以会比hive来说快,根本的原因是:
- 中间结果不落地;
- sql语句解析出来的任务尽可能的并行化执行,也避免了sorting 和 shuffle ;
- impala为每个查询 产生了汇编级别的代码,其他的代码框架会增加额外的延迟;
- 还有一点,Impala 是一个长期运行的进程,不会有MapReduce 和 Spark 的启动任务的时间,所以相比Hive ,Impala的sql 查询时间会更快。