这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战
一、组件
Impala 是一个分布式, 大规模并行处理(MPP)数据库引擎, 它包括多个进程。
Impala 与 Hive 类似不是数据库而是 数据分析工具
1 | bash复制代码# 在 linux123 中执行 |
如图:
impalad
- 角色名称为
Impala Daemon, 是在每个节点上运行的进程, 是Impala的核心组件, 进程名是Impalad; - 作用: 负责读写数据文件, 接收来自
Impala-shell,JDBC,ODBC等的查询请求, 与集群其它Impalad分布式并行完成查询任务, 并将查询结果返回给中心协调者。 - 为了保证
Impalad进程了解其它Impalad的健康状况,Impalad进程会一直与statestore保持通信。 Impalad服务由三个模块组成:Query Planner、Query Coordinator和Query Executor, 前两个模块组成前端, 负责接收SQL查询请求, 解析SQL并转换成执行计划, 交由后端执行。
statestored
statestore监控集群中Impalad的健康状况, 并将集群健康信息同步给Impaladstatestore进程名为statestored
catalogd
Impala执行的SQL语句引发元数据发生变化时,catalog服务负责把这些元数据的变化同步给其它Impalad进程(日志验证, 监控statestore进程日志)catalog服务对应进程名称是catalogd- 由于一个集群需要一个
catalogd以及一个statestored进程, 而且catalogd进程所有请求都是经过statestored进程发送, 所以官方建议让statestored进程与catalogd进程安排同个节点。
二、查询
查询流程如下图:
Client提交任务
Client发送一个SQL查询请求到任意一个Impalad节点, 会返回一个queryId用于之后的客户端操作。
- 生成单机和分布式执行计划
SQL提交到Impalad节点之后,Analyser依次执行SQL的词法分析、语法分析、语义分析等操作;
从MySQL元数据库中获取元数据, 从HDFS的名称节点中获取数据地址, 以得到存储这个查询相关数据的所有数据节点
- 单机执行计划: 根据上一步对
SQL语句的分析, 由Planner先生成单机的执行计划, 该执行计划是有PlanNode组成的一棵树, 这个过程中也会执行一些SQL优化, 例如Join顺序改变、谓词下推等。- 分布式并行物理计划: 将单机执行计划转换成分布式并行物理执行计划, 物理执行计划由一个的
Fragment组成,Fragment之间有数据依赖关系, 处理过程中需要在原有的执行计划之上加入一些ExchangeNode和DataStreamSink信息等。Fragment:sql生成的分布式执行计划的一个子任务;DataStreamSink: 传输当前的Fragment输出数据到不同的节点
- 任务调度和分发
Coordinator将Fragment(子任务) 根据数据分区信息发配到不同的Impalad节点上执行。Impalad节点接收到执行Fragment请求交由Executor执行。
Fragment之间的数据依赖
每一个
Fragment的执行输出通过DataStreamSink发送到下一个Fragment,Fragment运行过程中不不断向coordinator节点汇报当前运行状态。
- 结果汇总
查询的
SQL通常情况下需要有一个单独的Fragment用于结果的汇总, 它只在Coordinator节点运行, 将多个节点的最终执行结果汇总, 转换成ResultSet信息。
- 获取结果
客户端调用获取
ResultSet的接口, 读取查询结果。
(1)查询计划示例
1 | sql复制代码select t1.n1, t2.n2, count(1) as c |
(2)单机执行计划
QueryPlanner 生成单机的执行计划。
如图:
分析上面的单机执行计划
- 先去扫描
t1表中需要的数据, 如果数据文件存储是列式存储,可以便利的扫描到所需的列id n1需要与t2表进行Join操作, 扫描t2表与t1表类似获取到所需数据列id,n2t1与t2表进行关联, 关联之后再与t3表进行关联, 这里Impala会使用谓词下推扫描t3表只取join所需数据- 对
group by进行相应的aggregation操作, 最终是排序取出指定数量的数据返回。
(3)分布式并行计划
所谓的分布式并行化执行计划: 就是在单机执行计划基础之上结合数据分布式存储的特点, 按照任务的计算要求把单机执行计划拆分为多段子任务, 每个子任务都是可以并行执行的。
上面的单机执行计划 转为 分布式并行执行计划。
分布式并行执行计划,如图:
流程图,如下:
分布式执行计划中涉及到多表的 Join , Impala 会根据表的大小来决定 Join 的方式。
主要有两种: Hash Join 与 Broadcast Join
上面分布式执行计划中可以看出
T1,T2表大一些, 而T3表小一些, 所以对于T1与T2的Join Impala选择使用Hash Join
对于T3表选择使用Broadcast方式, 直接把T3表广播到需要Join的节点上。
分布式并行计划流程:
T1和T2使用Hash join, 此时需要按照id的值分别将T1和T2分散到不同的Impalad进程, 但是相同的id会散列到相同的Impalad进程, 这样每一个Join之后是全部数据的一部分T1与T2Join之后的结果数据再与T3表进行Join, 此时T3表采用Broadcast方式把自己全部数据(id列) 广播到需要的Impala节点上T1,T2,T3Join之后再根据Group by执行本地的预聚合, 每一个节点的预聚合结果只是最终结果的一部分(不同的节点可能存在相同的group by的值), 需要再进行一次全局的聚合。- 全局的聚合同样需要并行, 则根据聚合列列进行
Hash分散到不同的节点执行Merge运算(其实仍然是一次聚合运算), 一般情况下为了较少数据的网络传输,Impala会选择之前本地聚合节点做全局聚合工作。 - 通过全局聚合之后, 相同的
key只存在于一个节点, 然后对于每一个节点进行排序和TopN计算, 最终将每一个全局聚合节点的结果返回给Coordinator进行合并、排序、limit计算, 返回结果给用户。
本文转载自: 掘金