写点什么

Apache Impala 架构解析及与 Hive、SparkSQL 的性能比较

作者:编程江湖
  • 2022 年 3 月 29 日
  • 本文字数:3596 字

    阅读完需:约 12 分钟

一、Impala 介绍

Impala 是 Cloudera 公司主导开发的新型查询系统,它提供 SQL 语义,能查询存储在 Hadoop 的 HDFS 和 HBase 中的 PB 级大数据。已有的 Hive 系统虽然也提供了 SQL 语义,但由于 Hive 底层执行使用的是 MapReduce 引擎,仍然是一个批处理过程,难以满足查询的交互性。相比之下,Impala 的最大特点也是最大特点就是它的快速。

Impala 是用于处理存储在 Hadoop 集群中的大量数据的 MPP(大规模并行处理)SQL 查询引擎。 它是一个用 C ++和 Java 编写的开源软件。 与其他 Hadoop 的 SQL 引擎相比,它提供了高性能和低延迟。换句话说,Impala 是性能最高的 SQL 引擎(提供类似 RDBMS 的体验),它提供了访问存储在 Hadoop 分布式文件系统中的数据的最快方法。

二、Impala 架构解析



从上图(引用自 Apache Impala 官网)中看出,可以首先大体上描述下一个 SQL 从提交到获取查询结果是经历了哪些步骤(下面的步骤和上图中步骤不一一对应):

1、客户端提交任务:客户端通过 beeswax 或者 HiveServer2 接口发送一个 SQL 查询请求到 Impalad 节点,查询包括一条 SQL 和相关的 configuration 信息(只对本次查询生效),查询接口提供同步和异步的方式执行,两种接口都会返回一个 queryId 用于之后的客户端操作。

2、查询解析和分析: SQL 提交到 Impalad 节点之后交由 FE 模块处理,由 Analyser 依次执行 SQL 的词法分析、语法分析、语义分析、查询重写等操作,生成该 SQL 的 Statement 信息。

3、单机执行计划生成:根据上一步生成的 Statement 信息,由 Planner 生成单机的执行计划,该执行计划是有 PlanNode 组成的一棵树,这个过程中也会执行一些 SQL 优化,例如 Join 顺序改变、谓词下推等。

4、分布式执行计划生成:由 Planner 将单机执行计划转换成分布式并行物理执行计划,物理执行计划由一个个的 Fragment 组成,Fragment 之间有数据依赖关系,处理过程中需要在原有的执行计划之上加入一些 ExchangeNode 和 DataStreamSink 信息等。

5、任务调度和分发:由 BE 处理生成的分布式物理执行计划,将 Fragment 根据数据分区信息发配到不同的 Impalad 节点上执行。Impalad 节点接收到执行 Fragment 请求交由 Backend 模块处理 Fragment 的执行。

6、子任务执行:每一个 Fragment 的执行输出通过 DataStreamSink 发送到下一个 Fragment,由下一个 Fragment 的 ExchangeNode 接收,Fragment 运行过程中不断向 coordinator 节点汇报当前运行状态。

7、结果汇总:查询的 SQL 通常情况下需要有一个单独的 Fragment 用于结果的汇总,它只在 coordinator 节点运行,将多个 backend 的最终执行结果汇总,转换成 ResultSet 信息。

8、客户端查询结果:客户端调用获取 ResultSet 的接口,读取查询结果。

9、关闭查询:客户端调用 CloseOperation 关闭本次查询,标志着本次查询的结束。

三、Impala 组件

1. Impala Daemon 组件

  Impalad 是 Impala 的核心进程,运行在所有的数据节点上,可以读写数据,并接收客户端的查询请求,并行执行来自集群中其他节点的查询请求,将中间结果返回给调度节点。调用节点将结果返回给客户端。用户在 Impala 集群上的某个节点提交数据处理请求 则该节点称为 coordinator node(协调器节点),其他的集群节点传输其中的处理的部分数据到该 coordinator node,coordinator node 负责构建最终的结果数据返回给用户。Impala 支持在提交任务的时候(采用 JDBC ,ODBC 方式) 采用 round-robin 算法来实现负载均衡,将任务提交到不同的节点上 Impalad 进程通过持续的和 statestore 通信来确认自己所在的节点是否健康 和是否可以接受新的任务请求

2. Impala Statestore(主要优化点,线程数)

  状态管理进程,定时检查 The Impala Daemon 的健康状况,协调各个运行 Impalad 的实例之间的信息关系,Impala 正是通过这些信息去定位查询请求所要的数据,进程名叫作 statestored,在集群中只需要启动一个这样的进程,如果 Impala 节点由于物理原因、网络原因、软件原因或者其他原因而下线,Statestore 会通知其他节点,避免查询任务分发到不可用的节点上。

3. Impala Catalog Service(元数据管理和元存储)

  元数据管理服务,进程名叫做 catalogd,将数据表变化的信息分发给各个进程。接收来自 statestore 的所有请求 ,每个 Impala 节点在本地缓存所有元数据。 当处理极大量的数据和/或许多分区时,获得表特定的元数据可能需要大量的时间。 因此,本地存储的元数据缓存有助于立即提供这样的信息。当表定义或表数据更新时,其他 Impala 后台进程必须通过检索最新元数据来更新其元数据缓存,然后对相关表发出新查询。

4. 其他组件列表

Impala client:将 HiveQL 请求送给 Impalad,并等待结果返回给用户 Impalad:

Planner > FE(JAVA):负责解析查询请求,并生成执行计划树(Query Plan Tree)。

Coordinator > BE(C++):拆解请求(Fragment),负责定位数据位置,并发送请求到 Exec Engine,汇聚请求结果上报。

Exec Engine > BE(C++):执行 Fragment 子查询,比如 scan,Aggregation,Merge etc。statestore server:维护 Impalad 的伙伴关系,负责通知伙伴关系变化,类似于仪表盘的 zk 的故障监控功能。

meta server:

Hive Meta Storage:用户维护表的 schema 信息等元数据(存在于一个关系型数据库)。

NameNode of HDFS:用于定位 hdfs 的数据位置。

HMaster of HBase:用于定位 HBase 的数据的位置。

storage server:

HDFS:HDFS 的 DataNode 服务。

HBASE:HBase 的 RegionServer 服务。

四、Impala 的优缺点

1. Impala 的优点

1) Impala 不需要把中间结果写入磁盘,省掉了大量的 I/O 开销。

2) 省掉了 MapReduce 作业启动的开销。MapReduce 启动 task 的速度很慢(默认每个心跳间隔是 3 秒钟),Impala 直接通过相应的服务进程来进行作业调度,速度快了很多。

3) Impala 完全抛弃了 MapReduce 这个不太适合做 SQL 查询的范式,而是像 Dremel 一样借鉴了 MPP 并行数据库的思想另起炉灶,因此可做更多的查询优化,从而省掉不必要的 shuffle、sort 等开销。

4) 通过使用 LLVM 来统一编译运行时代码,避免了为支持通用编译而带来的不必要开销。

5) 用 C++实现,做了很多有针对性的硬件优化,例如使用 SSE 指令。

6) 使用了支持 Data locality 的 I/O 调度机制,尽可能地将数据和计算分配在同一台机器上进行,减少了网络开销

2. Impala 的缺点

1) Impala 不提供任何对序列化和反序列化的支持。

2) Impala 只能读取文本文件,而不能读取自定义二进制文件。

3) 每当新的记录/文件被添加到 HDFS 中的数据目录时,该表需要被刷新

五、Impala 的功能

1.Impala 可以根据 Apache 许可证作为开源免费提供。

2.Impala 支持内存中数据处理,它访问/分析存储在 Hadoop 数据节点上的数据,而无需数据移动。

3.Impala 为 HDFS 中的数据提供了更快的访问。

4.可以将数据存储在 Impala 存储系统中,如 Apache HBase 和 Amazon s3。

5.Impala 支持各种文件格式,如 LZO,序列文件,Avro,RCFile 和 Parquet。

6.使用 Impala,您可以使用传统的 SQL 知识以极快的速度处理存储在 HDFS 中的数据。

7.由于在数据驻留(在 Hadoop 集群上)时执行数据处理,因此在使用 Impala 时,不需要对存储在 Hadoop 上的数据进行数据转换和数据移动。

8.使用 Impala,您可以访问存储在 HDFS,HBase 和 Amazon s3 中的数据,而无需了解 Java(MapReduce 作业)。您可以使用 SQL 查询的基本概念访问它们。

9.为了在业务工具中写入查询,数据必须经历复杂的提取 - 变换负载(ETL)周期。但是,使用 Impala,此过程缩短了。加载和重组的耗时阶段通过新技术克服,如探索性数据分析和数据发现,使过程更快。

六、Hive、SparkSQL、Impala 性能对比

参照 cloudera 公司做的性能基准对比测试,所有测试都运行在一个完全相同的 21 节点集群上,每个节点只配有 64G 内存。之所以内存不配大,就是为了消除人们对于 Impala 只有在非常大的内存上才有好性能的错误认识。

配置:

  • 双物理 CPU,每个 12 核,Intel Xeon CPU E5-2630L 0 at 2.00GHz

  • 12 个磁盘驱动器,每个磁盘 932G,1 个用作 OS,其它用作 HDFS

  • 每节点 64G 内存

对比产品:

  • Impala

  • Hive-on-Tez

  • Spark SQL

  • Presto

查询:

  1. 21 个节点上的数据量为 15T

  2. 测试场景取自 TPC-DS,一个开放的决策支持基准(包括交互式、报表、分析式查询)

  3. 由于除 Impala 外,其它引擎都没有基于成本的优化器,本测试使用的查询都使用 SQL-92 标准的连接

  4. 采用统一的 Snappy 压缩编码方式,各个引擎使用各自最优的文件格式,Impala 和 Spark SQL 使用 Parquet,Hive-on-Tez 使用 ORC,Presto 使用 RCFile。

  5. 对每种引擎多次运行和调优

结果:单用户如下图所示:



多用户如下图所示(引用自 Apache Impala 官网):



查询吞吐率如下图所示(引用自 Apache Impala 官网):



Imapal 底层采用 MPP 技术,支持快速交互式 SQL 查询。与 Hive 共享元数据存储。Impalad 是核心进程,负责接收查询请求并向多个数据节点分发任务。statestored 进程负责监控所有 Impalad 进程,并向集群中的节点报告各个 Impalad 进程的状态。catalogd 进程负责广播通知元数据的最新信息。由测试结果可知,对于单用户查询,Impala 比其它方案最多快 13 倍,平均快 6.7 倍。对于多用户查询,差距进一步拉大:Impala 比其它方案最多快 27.4 倍,平均快 18 倍。


关键词:java培训

用户头像

编程江湖

关注

IT技术分享 2021.11.23 加入

关注【IT云文化】微信公众号,获取学习资源

评论

发布
暂无评论
Apache Impala架构解析及与Hive、SparkSQL的性能比较_编程江湖_InfoQ写作平台