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 查询的执行流程
可以看到带序号的小箭头,流程如下:
-
向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为每个查询 产生了汇编级别的代码,其他的代码框架会增加额外的延迟;
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Spring-如何给静态变量注入值
- ZooKeeper的伪分布式集群搭建以及真分布式集群搭建
- zookeeper权限acl与四字命令
- 微信公众号开发-素材/消息管理接口
- 微信开发的一些神坑
- Spring Boot集成ElasticSearch实现简单的增删查改接口
- Spring Cloud Zuul 综合使用
- Spring Cloud Hystrix - 服务容错
- 记一次内存溢出问题的排查、分析过程及解决思路
- Spring Cloud Sleuth + Zipkin 实现服务追踪
- Docker化你的SpringBoot项目
- 微信公众号开发者模式介绍及接入
- SpringBoot2.x整合MyBatis
- 使用微信测试账号对网页进行授权
- Spring JMS的使用