发布网友 发布时间:2小时前
共1个回答
热心网友 时间:1小时前
Impala概述
Impala是一个开源高性能分布式SQL查询引擎,由Cloudera于2017年开源。它专为在Apache Hadoop集群中处理大规模数据集提供快速大数据查询和分析能力,与SQL兼容,适用于Hadoop生态系统。
Impala与Presto/Trino一样,是一个分布式并行处理(MPP)数据库引擎,作为Hadoop上的标准SQL查询引擎。
Doris与StarRocks基于Impala早期版本。
在Hadoop生态中的Impala位置
Impala的架构设计
在大数据领域,很多框架采用主从结构,如HDFS、Presto、YARN等,通过一个Master节点进行分布式控制、元数据管理及任务分发,而Slave节点只执行特定功能。然而,这样的架构存在Master节点单点问题及性能瓶颈。Presto的Master节点缺乏高可用方案,Master节点故障会导致集群完全不可用;在高并发和大量任务处理场景下,Presto的Master节点在解析阶段的耗时显著增加。
Impala采用去中心化架构,由StateStoreD、CatalogD和ImpalaD三个服务组成,没有主从概念,各司其职,相互配合。
StateStoreD负责状态同步,持续监控集群中所有ImpalaD的运行状况,并将其结果转发给每个ImpalaD。
StateStoreD在集群状态错误时提供帮助,对Impala集群运行不构成关键影响。如果StateStoreD停止运行,ImpalaD仍可继续运行,但如果其他ImpalaD脱机,集群的健壮性会受到影响。当StateStoreD重新上线时,它将重新建立与ImpalaD的通信并恢复监控功能。
StateStoreD只需在集群的某一个主机上运行。
CatalogD作为元数据访问网关,从Hive Metastore等外部Catalog获取元数据信息及统计信息,缓存在自己的catalog结构中。信息包括库表定义、列类型、统计信息(如表大小、行数、分区及各列信息),以及从NameNode获取的文件粒度信息(如文件存储位置、副本、文件块信息)。
ImpalaD请求CatalogD查询库表元数据信息。
ImpalaD执行DDL命令时通过CatalogD执行,更新由StateStoreD广播至集群其他ImpalaD。
同StateStoreD一样,一个集群只有一个CatalogD服务。
ImpalaD作为核心服务组件,分为三种运行模式:Coordinator、Executor和Executor And Coordinator(默认)。Coordinator模式下,ImpalaD仅作为查询协调者,负责解析SQL语句、生成执行计划、调度查询执行计划以及收集并返回查询结果。Executor负责具体的数据查询执行,包括数据扫描、聚合、排序等操作。Executor And Coordinator模式则包含两者功能。
生产环境一般建议ImpalaD做好角色分离,即要么是Executor,要么是Coordinator。
查询执行过程
在Impala中,查询处理的主要过程在ImpalaD中完成。ImpalaD可以进一步细分为Query Planner、Query Coordinator和Query Executor三个部分,其中Query Planner被称为FE端,主要用Java语言实现;Query Coordinator和Query Executor被称为BE端,由C++实现。
查询执行过程如下:
1、客户端(如JDBC、ODBC、Impala Shell)向Impala集群任意节点发送查询请求。
2、ImpalaD接收请求并通过JNI接口请求FE端。
3、FE端将查询解析生成抽象语法树(statementBase),加载元数据信息。
4、进行语义分析及权限校验(通过调用AnalysisContext.analyzeAndAuthorize方法),实际调用抽象语法树各StatementBase节点的analyze方法。
5、根据statementBase类型,进行不同处理,如DDL类型创建对应的catalog请求,普通query类型创建执行计划。
6、生成单节点执行计划(singleNodePlan),对plan进行小查询判断及优化,然后进行join重写,根据代价评估调整join类型及子节点顺序。
7、遍历单节点执行计划(singleNodePlan),生成PlanFragment,最终生成分布式执行计划,返回给Impala。
8、ImpalaD获得分布式执行计划,将查询状态设置为PENDING,创建线程执行查询请求。
9、提交查询并进行资源准入模块AdmissionControl判断,判断资源使用是否超限、是否满足条件、是否需要排队等待。
10、资源判断通过后,调用调度器scheler的Schele方法生成调度信息。
11、为查询创建Coordinator,执行Exec方法初始化fragment状态信息及BE端状态信息,然后分发任务。
12、在所有BE端并行启动查询执行,并阻塞直到启动完成。
13、所有BE端异步执行任务,如扫描、排序、聚合。
14、BE端执行完成后,查询结果在Coordinator中汇聚。
15、Coordinator将得到的查询结果传输给客户端。
Impala与Presto(Trino)对比
欢迎关注我的公众号“大数据小百科”,获取原创技术文章。