Impala 介绍
Impala 是 Cloudera 开源的一个高性能、分布式、SQL 查询引擎,用于Apache Hadoop 上进行交互式数据分析。Impala 可以实现实时的 SQL 查询操作,最初是为了解决 Hive-MapReduce 处理速度慢的问题,它能够使用 Hadoop 的 HDFS 存储及其他生态系统组件存储大规模数据并提供 SQL 访问接口,同时保持了对 Hive 元数据的兼容。
Impala 主要特点
-
高性能:Impala 能够在几秒钟内完成数十亿条记录的查询,支持高级数据操作功能,如 JOIN,窗口聚合和UNION等。这与 Impala 的架构有关,它使用单独的、单一的动态分布式内存(DDM)执行用户查询。
-
大数据:Impala 可以快速访问并分析数据仓库,支持 PB 级别的数据量,它通过并行处理数据 , 引入了数据分片机制来充分利用多节点并发的性质实现水平扩展。
-
简单易用:Impala 简单易用,不需要先定义模式,一个 SQL 查询可以在一个命令中完成,它支持 SQL-92 标准查询命令和原生 SQL 函数。
-
集成 Hadoop 生态:Impala 与 Hadoop 生态系统无缝集成,通过 Apache Sentry 实现最小权限原则,而且同时支持多种文件格式,包括文本、JSON、Avro 和 Parquet。
-
架构灵活:Impala 可以作为一个独立的服务运行在集群的节点上,它的查询执行引擎与 Hadoop 其他组件无关,同时在 Cloudera Manager 上集成管理。
Impala与 Hive的异同之处
Impala 与Hive都是构建在Hadoop之上的数据查询工具各有不同的侧重适应面,但从客户端使用来看Impala与Hive有很多的共同之处,如数据表元数据、ODBC/JDBC驱动、SQL语法、灵活的文件格式、存储资源池等。
但是Impala跟Hive最大的优化区别在于:没有使用 MapReduce进行并行计算,虽然MapReduce是非常好的并行计算框架,但它更多的面向批处理模式,而不是面向交互式的SQL执行。与 MapReduce相比,Impala把整个查询分成一执行计划树,而不是一连串的MapReduce任务,在分发执行计划后,Impala使用拉式获取数据的方式获取结果,把结果数据组成按执行树流式传递汇集,减少的了把中间结果写入磁盘的步骤,再从磁盘读取数据的开销。Impala使用服务的方式避免每次执行查询都需要启动的开销,即相比Hive没了MapReduce启动时间。
执行计划比较
Hive: 依赖于MapReduce执行框架,执行计划分成 map->shuffle->reduce->map->shuffle->reduce…的模型。如果一个Query会 被编译成多轮MapReduce,则会有更多的写中间结果。由于MapReduce执行框架本身的特点,过多的中间过程会增加整个Query的执行时间。
Impala: 把执行计划表现为一棵完整的执行计划树,可以更自然地分发执行计划到各个Impalad执行查询,而不用像Hive那样把它组合成管道型的 map->reduce模式,以此保证Impala有更好的并发性和避免不必要的中间sort与shuffle。
数据流比较
Hive: 采用推的方式,每一个计算节点计算完成后将数据主动推给后续节点。
Impala: 采用拉的方式,后续节点通过getNext主动向前面节点要数据,以此方式数据可以流式的返回给客户端,且只要有1条数据被处理完,就可以立即展现出来,而不用等到全部处理完成,更符合SQL交互式查询使用。
内存使用比较
Hive: 在执行过程中如果内存放不下所有数据,则会使用外存,以保证Query能顺序执行完。每一轮MapReduce结束,中间结果也会写入HDFS中,同样由于MapReduce执行架构的特性,shuffle过程也会有写本地磁盘的操作。
Impala: 在遇到内存放不下数据时,版本1.0.1是直接返回错误,而不会利用外存,以后版本应该会进行改进。这使用得Impala目前处理Query会受到一定的限制,最好还是与Hive配合使用。
调度比较
Hive: 任务调度依赖于Hadoop的调度策略。
Impala: 调度由自己完成,目前只有一种调度器simple-schedule,它会尽量满足数据的局部性,扫描数据的进程尽量靠近数据本身所在的物理机器。调度器 目前还比较简单,在SimpleScheduler::GetBackend中可以看到,现在还没有考虑负载,网络IO状况等因素进行调度。但目前 Impala已经有对执行过程的性能统计分析,应该以后版本会利用这些统计信息进行调度吧。
容错比较
Hive: 依赖于Hadoop的容错能力。
Impala: 在查询过程中,没有容错逻辑,如果在执行过程中发生故障,则直接返回错误(这与Impala的设计有关,因为Impala定位于实时查询,一次查询失败, 再查一次就好了,再查一次的成本很低)。
适用面比较
Hive: 复杂的批处理查询任务,数据转换任务。
Impala: 实时数据分析,因为不支持UDF,能处理的问题域有一定的限制,与Hive配合使用,对Hive的结果数据集进行实时分析。