impala 查询计划树

impala介绍

MPP什么意思:即大规模并行处理

impala 是一种新型的MPP查询引擎,每一个impala执行的sql,可能同时在多个工作节点上进行运算,每一个节点执行查询任务的一部分,然后通过网络通信传递给下一个子任务,中间数据尽可能不落地。

impala可以处理的数据:HBASE,HDFS,KUDU

impala架构

impala数据库查询表索引 impala查询所有表以及模式名_impala架构

这个架构图说明了impala的架构,也说明了impala的sql查询的执行流程。

对于图中的名词解释:

odbc:开放的数据库连接

Statestore:impala的消息同步节点

Catalog:impala中的元数据服务节点

impalad:impala系统中任务的执行节点

Query Planner:查询计划树(sql执行计划生成器)

Coordinator: impalad 节点中协调者模块,对外提供查询接口,包括beeswax接口 和 hiveserver2接口


impala 查询的执行流程

impala数据库查询表索引 impala查询所有表以及模式名_查询计划树_02

可以看到带序号的小箭头,流程如下:

  1. 向impalad 发送sql 语句: 客户端通过beeswax 或者 hiveserver2接口 发送一个sql查询请求到impalad 节点,
    ( 名词解释:
    FE :impala 代码上划分的使用C++ 实现的 backend部分;
    backend :impalad 节点中的任务执行模块,提供任务执行的接口;
  2. 生成单机和分布式的执行计划: 之后由FE 模块处理,通过Analyser依次对这个sql执行词法分析、语法分析、语义分析、查询重写等操作。生成该sql 的statement 信息,根据这个信息,Planner生成单机的执行计划, 这个计划是由planNode组成的一棵树,也有一些sql优化。
    将Planner的 单机执行计划 转换成 分布式的并行的物理执行计划(由多个Fragment组成),Fragment 之间有数据的依赖,新的计划也会加入一些ExchangeNode 和 DataStreamSink 信息等。
    ( 名词解释:
    Analyser:impalad 提供的一中sql 解析器;
    Fragment : sql生成的分布式执行计划的一个子任务(它包括执行计划的一个子树);
    ExchangeNode:一种特殊的PlanNode,主要是处理前一个Fragment传递过来的数据;
    DataStreamSink:这个不是PlanNode,他的作用是传输当前的Fragment输出数据到不同的节点。
  3. 执行这个分布式计划:由BE处理生成的分布式物理执行计划,将Fragment 根据数据的分区信息发配到不同的Impala节点上执行,每个Impala节点接受到Fragment后交由 backend 模块处理Fragment的执行。
    (名词解释:
    BE:impalad 上使用 Java实现的 frontend 部分。
  4. Fragment之间的数据依赖:每一个Fragment 的执行输出通过DataStreamSink 发送到下一个Fragment,由下一个Fragment的ExchangeNode接受,Fragment 运行的过程中不断的向coordinator 节点汇报当前的运行状态。
  5. 结果汇总:用于查询的sql 通常会有一个单独的Fragment用于结果的汇总,这个Fragment只会在coordinator中运行,将多个backend的最终执行结果汇总,然后转换成 ResultSet信息。
  6. 读取查询的结果:客户端调用 获取 ResultSet的接口,读取查询的结果,最后客户端调用CloseOperation 关闭本次查询,本质本次查询的结束。

impala 查询数据为什么比hive快:

impala之所以会比hive来说快,根本的原因是:

  1. 中间结果不落地
  2. sql语句解析出来的任务尽可能的并行化执行,也避免了sorting 和 shuffle ;
  3. impala为每个查询 产生了汇编级别的代码,其他的代码框架会增加额外的延迟;
  4. 还有一点,Impala 是一个长期运行的进程,不会有MapReduce 和 Spark 的启动任务的时间,所以相比Hive ,Impala的sql 查询时间会更快。