impala 查询计划树

时间:2019-03-19
本文章向大家介绍impala 查询计划树,主要包括impala 查询计划树使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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 查询的执行流程

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

  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为每个查询 产生了汇编级别的代码,其他的代码框架会增加额外的延迟;