Impala - 核心原理、特点、以及架构详解
作者:hangge | 2024-10-15 08:45
我们知道 MapReduce 这个框架可以对海量数据进行分布式计算分析,但是由于需要一定学习成本,并且对非开发人员不够友好,所以后来出现了 Hive 这个数据分析工具。Hive 的优点是可以通过 SQL 直接计算分析 HDFS 中的海量数据,不需要写代码。不过由于 Hive 底层引擎默认使用的是 MapReduce,所以在 Hive 中提交的 SQL 任务的延迟度和计算效率相对一般。
在工作中我们希望能够在页面中输入一个 SQL 语句,点击查询按钮之后,可以快速查看结果,最好是能够在秒级别返回结果,这种数据分析需求也可以称之为即席查询。此时就需要有一个可以支持低延迟,并且计算效率也比较高的数据分析引擎了,所以 Impala 就出现了。Impala 的出现主要就是为了解决 Hive 执行效率低下的问题。
1,什么是 Impala?
(1)Impala 是 Cloudera 公司于 2013 年推出的一个新型查询系统,于 2017 年正式成为 Apache 的顶级项目。
(2)Impala 是一个用 C++ 和 Java 编写的开源计算引擎,可以提供对 HDFS、HBase 中数据的高性能、低延迟的交互式 SQL 查询功能,它的出现主要是为了提高海量数据下的 SQL 分析效率(lmpala 的性能可以达到 Hive 的 10~100 倍)。
2,Impala 的优点
- 基于内存运算,不需要把中间结果写入磁盘,节省了大量的 I/O 开销。
- 在底层不需要被转化为 MapReduce 任务,直接读取 HDFS 中的数据,大大降低了延迟。
- 底层计算引擎由 C++ 编写,由 LLVM 统一编译运行,效果更高。
- 兼容 Hive SQL,学习成本低,容易上手。
- 可以兼容 Hive 的 Metastore,对 Hive 中的数据直接做数据分析。
- 支持数据本地化特性,提高计算效率。
- 支持列式存储,可以和 HBase 整合。
- 支持多种文件格式,例如:TextFile、SequenceFile、RCFile 和 Parquet。其实只要是 Hive 支持的数据格式,目前 Impala 都是支持的。
- 支持 JDBC/ODBC 远程访问。
3,Impala 的缺点
- 对内存的依赖大,且完全依赖于 Hive。
- 稳定性不如 Hive,由于完全在内存中计算,所以内存不够则很容易出现问题。
- 没有提供任何对序列化和反序列化的支持。
- 只能读取文本文件,不能直接读取自定义的二进制文件。
- 每当新的记录/文件被添加到 HDFS 中的数据目录时,该表需要被刷新。
4,Impala 与 Hive 的关系
(1)Impala 中创建的表信息会直接被存储到 Hive 的 Metastore 中,它可以直接兼容 Hive 的元数据,即在 Hive 中创建的表在 Impala 中可以被直接使用。
(2)在实际工作中,Impala 可以和 Hive 无缝集成,如下图所示:
5,Hive 的架构
(1)Impala 主要包含 3 个核心模块:Impalad、Statestore 和 Catalog,除此之外,它还依赖 Hive 的 Metastore 和 HDFS:
- Impala daemon:简称为 impalad,它是 Impala 集群中的核心守护进程,需要在多个节点启动,一般会和 DataNode 节点部署在一起;他主要负责与 Statestore 保持通信,汇报工作。同时负责接收客户端的请求,执行查询,并把结果返给客户端。
- Statestore daemon:简称为 statestored,他主要负责收集集群中各个 Impalad 进程的资源信息、各节点健康状况,同步节点信息,以及负责 Query 的协调调度。
- Catalog daemon:简称为 catalogd,他主要负责分发表的元数据信息到各个 Impalad 中,以及接收来自 Statestore 的所有请求。
(2)具体工作流程如下:
- 1.客户端向某一个 Impalad 发送一个 Query(SQL)。
- 2.Impalad 将 Query 解析为具体的 Planner(行计划),然后交给当前机器的 Coordinator 中心协调节点。
- 3.Coordinator 将 Planner 发送到有数据的 Impalad 节点上,利用 Executor 去执行。
- 4.多个 Impalad 的 Executor 之间会进行通信,可能需要进行一些数据处理。
- 5.各个 Impalad 的 Executor 在执行完成后,会将结果返给 Coordinator。
- 6.Coordinator 将汇聚的查询结果返给客户端。
附一:对比 Hive、Impala 和 Kylin
Hive、Impala 和 Kylin 都适合应用于离线 OLAP 数据分析领域,不过它们各有特色,在技术选型时需要结合具体业务需求进行考虑。这 3 个离线 OLAP 引擎的对比如下。说明:
- 计算引擎:Hive 的计算引擎默认是 MapReduce,也支持 Tez 或者 Spark。Impala 的计算引擎是通过 C++ 自研的 MPP 引擎。Kylin 的计算引擎可以使用 MapReduce 或者 Spark。
- 计算性能:Hive 底层会使用 MapReduce,所以计算性能相对一般,不过可以考虑使用 Tez 或者 Spark 引擎来提高性能。Impala 是基于内存计算的,计算性能比较好。Kylin 底层可以使用 MapReduce 或者 Spark 引擎,使用 Spark 引擎时计算性能也比较好。
- 稳定性:Impala 是全部基于内存的,所以稳定性较差。Hive 和 Kylin 底层都可以使用 MapReduce,所以稳定性相对较高。
- 数据规模:Hive 比较适合 TB 级别的数据分析,数据规模太大会导致计算时间过长。Impala 也比较适合 TB 级别的数据分析,如果数据规模太大则内存会出现瓶颈。Kylin 比较适合 TB 和 PB 级别的数据分析,因为它会提前对数据进行预计算,在海量数据下也可以提供较好的性能。
- SQL 支持程度:在 Hive 中定义了简单的类 SQL 查询语言(QL)。Impala 可以兼用 HQL。Kylin 支持标准 SQL。
附二:Impala 和 Hive on Spark 的选择对比
1,Impala 和 Hive 的典型应用场景
(1)在实际工作中,如果考虑稳定性,建议使用 Hive,Hive 的底层引擎可以考虑是 MapReduce 或者 Tez。
(2)如果考虑执行效率,建议使用 Impala 或者 Hive on Spark。
2,Impala 和 Hive on Spark 的选择
(1)从 SQL 兼容程度上来说,Hive on Spark 是优于 Impala 的,因为 Hive 中的一些高级 SQL 函数 Impala 是不支持的。
(2)从任务执行的延迟上来说,Impala 是优于 Hive on Spark 的,因为 Hive on Spark 每次执行都会提交一个 Spark 任务,这个任务的提交过程是需要消耗一定时间的。Impala 的任务提交过程会更快。
(3)从资源利用率角度来说,Hive on Spark 是优于 Impala 的。因为 Impala 默认是需要安装自己的集群,这个集群资源只能运行 Impala 任务,而 Hive on Spark 是可以在 YARN 上执行的,YARN 的资源是共享的。
- 不过在 CDH5 版本之后,Impala 也开始支持 Impala on YARN 模式,他通过一个叫做 Llama(Long-Lived Application Master)的中间组件协调 Yarn 和 Impala,向 Yarn 资源管理器申请计算资源。
全部评论(0)