Impala查询计划树
Impala介绍
MPP是massively parallelprocessing(大量并行处理)。
Impala是一种新型的MPP查询引擎,每个SQL会同时在多个工作节点上执行,这些工作节点做查询任务的一部分,然后通过网络传递到下一个子任务,中间结果并不会落地。
Impala可以处理的数据包含:HBASE,HDFS,KUDU。
Impala架构
架构图展示impala的架构以及Impala sql查询的执行流程。
词汇表:
- ODBC:open database connection(开放的数据库连接)
- statement:message synchronization node for impala(消息同步节点)
- Catalog:Metadata Service Node in impala(元数据服务节点)
- Impalad:在impala系统中的任务执行节点
- Query Planner:Query Plan Tree(SQL执行计划生成器)
- Coordinator:coordinator节点提供外部的查询接口,包含beeswax接口和hiveserver2接口
impala查询计划流程
- 发送sql查询到impalad
客户端通过beeswax或者hiveserver2接口发送sql查询到impalad节点。 - 生成单独的和分布式的执行计划
当被FE模块处理后,通过Analyser依次进行词法分析,语法分析,语义分析,查询重写,生成关于SQL信息,基于这个信息,Planner生成单独的执行计划,这个计划是一个树,包含planNodes和一些sql优化。 - 执行分布式计划
BE生成分布式执行计划树,根据数据分布情况,Fragment分布到不同的Impala节点,每个Impala节点接收Fragment,传递到backend模块,进行Fragment的执行处理。 - Fragment之间的数据依赖
每个Fragment的执行输出通过DataStreamSink发送到下一个Fragment,通过下一个Fragment的ExchangeNode接收。在Fragment操作阶段,当前的运行状态会持续报告到Coordinator节点。 - 数据汇总
查询SQL需要一个单独的Fragment进行数据汇总,这个Fragment仅仅运行在coordinator,多个backends的执行输出会得到汇总,然后转化为ResultSet信息。 - 读取查询输出
客户端调用接口,得到ResultSet,读取查询结果,最终客户端调用CloseOperation关闭查询。
词汇表:
- FE:在impala代码中C++实现的后端部分
- BE:在impala代码中Java实现的前端部分
- Backend:在impala节点中任务执行模块,提供接口为任务执行
- Analyzer:impalad提供的sql解析器
- Fragment:一个分布式执行计划的子任务(是执行计划树的子树)
- ExchangeNode:一个特定的PlanNode,它会处理上一个Fragment传递过来的数据
- DataStreamSink:这个并不是PlanNode,它的任务是传递当前的Fragment输出到不同节点。
为什么Impala查询比Hive快
- 中间结果并不会落地
- 查询SQL被解析成可并行执行