与hive相比,impala如何提供更快的查询响应

时间:2013-05-26 02:07:44

标签: hadoop hive impala

我最近开始研究使用Hive和Impala查询位于HDFS上的大量CSV数据。正如我所期待的那样,与Hive相比,我使用Impala的响应时间比我目前使用的查询要好。

我想知道是否有某些类型的查询/用例仍然需要Hive以及Impala不适合的地方。

与Hive相比,Impala如何为HDFS上的相同数据提供更快的查询响应?

5 个答案:

答案 0 :(得分:101)

你应该看到Impala是“HDFS上的SQL”,而Hive更像是“Hadoop上的SQL”。

换句话说,Impala甚至根本不使用Hadoop。它只是在所有节点上运行守护进程,它们缓存HDFS中的一些数据,这样这些守护进程就可以快速返回数据而无需完成整个Map / Reduce作业。

原因在于运行Map / Reduce作业会产生一定的开销,因此通过将Map / Reduce完全短路,您可以在运行时获得相当大的收益。

话虽这么说,Impala并没有取代Hive,但它对于非常不同的用例非常有用。与Hive相比,Impala不提供容错功能,因此如果在查询过程中出现问题,那么它就会消失。对于ETL类型的作业而言,一个作业的失败将是昂贵的,我会推荐Hive,但Impala对于小型即席查询非常棒,例如对于想要查看并分析一些数据的数据科学家或业务分析师而言没有建立稳健的工作。另外根据我的个人经验,Impala还不是很成熟,有时当数据量大于可用内存时,我会看到一些崩溃。

答案 1 :(得分:30)

恕我直言,HDFS上的SQL和Hadoop上的SQL是相同的。毕竟Hadoop是HDFS(还有MapReduce)。因此,当我们在HDFS上说SQL时,可以理解它是Hadoop上的SQL(可能有或没有MapReduce)。

回到实际问题,Impala提供了更快的响应,因为它使用MPP(大规模并行处理),而不像Hive那样使用MapReduce,这涉及一些初始开销(正如Charles先生所指定的那样)。大规模并行处理是一种计算类型,它使用许多独立运行的CPU来执行单个程序,其中每个CPU都有自己的专用内存。事实上,基于MPP的Impala不涉及MapReduce作业的开销作业设置和创建,插槽分配,拆分创建,地图生成等,这使得它非常快。

但这并不意味着Impala可以解决您遇到的所有问题。作为高度内存密集型(MPP),它不适合需要大量数据操作(如连接等)的任务,因为您无法将所有内容都放入内存中。这是Hive更适合的地方。

因此,如果您需要实时,对数据子集的即席查询将用于Impala。如果您对批量处理有大量需求而不是大数据,请转到Hive。

HTH

答案 2 :(得分:6)

impala中有一些关键特性使其速度更快。

  1. 它不使用非常昂贵的map / reduce来分叉 单独的jvms。它运行单独的Impala守护程序,用于拆分查询 并行运行它们并在最后合并结果集。

  2. 它在内存中完成大部分操作。

  3. 它使用hdfs存储,对于大文件来说速度很快。它 从查询到结果到数据尽可能地缓存。

  4. 它支持像plat这样的新文件格式,它是柱状文件 格式。因此,如果您使用此格式,查询的位置会更快 您只访问了几列    大部分时间都是。

答案 3 :(得分:1)

Impala不会替代MapReduce或将MapReduce用作处理引擎。让我们首先了解 Impala和Hive之间的关键区别

  1. Impala执行内存中查询处理,而Hive不执行
  2. Hive使用MapReduce处理查询,而Impala使用其自己的处理引擎。
  3. 可以使用用户定义的函数(UDF)或编写自定义的序列化器/解串器(SerDes)来扩展配置单元; 但是,Impala目前不像Hive那样支持可扩展性
  4. Impala取决于Hive的功能,而Hive不依赖于任何其他应用程序,仅需要 Hadoop核心平台(HDFS和MapReduce)
  5. Impala查询是HiveQL的子集,这意味着几乎每个Impala查询(有一些限制) 可以在Hive中运行。但是反之亦然,因为Hive支持的某些HiveQL功能不是 Impala支持。

现在,为什么在查询处理中Impala比Hive更快?以下是一些关键点。

  1. 在处理类似SQL的查询时, Impala不会在磁盘上写入中间结果(例如在Hive MapReduce中);代替 完整的SQL处理在内存中完成这使它处理起来更快

  2. 使用Impala,与MapReduce相比,查询立即开始执行。 是时候开始处理较大的SQL查询了,这会增加处理时间。

  3. Impala查询计划器使用智能算法在并行节点中的多个阶段中执行查询,以 提供更快的结果,避免了排序和混洗步骤,在大多数情况下,这是不必要的。

  4. Impala具有有关HDFS中每个数据块的信息,因此在处理查询时,它利用此知识在所有DataNode中更均匀地分配了查询。

  5. 存在一个Impala守护程序,该守护程序在每个DataNode上运行。这些负责处理查询。提交查询后,impalad(Impala守护程序)读取和写入数据文件,并通过将工作分配给Impala群集中的所有其他Impala节点来并行化查询。

  6. 提高性能的另一个关键原因是Impala 首先为每个查询生成程序集级代码汇编代码的执行速度比任何其他代码框架都要快,因为在运行Impala查询时 本机存在于内存中,由于存在框架,拥有框架会增加执行的额外延迟 开销。

Impala处理内存中的所有查询,因此节点上的内存限制绝对是一个因素。您必须具有足够的内存以支持结果数据集,在复杂的JOIN操作过程中可能会成倍增长。

如果查询开始处理数据并且结果数据集无法容纳在可用内存中,则查询将失败

答案 4 :(得分:0)

我可以考虑以下原因使Impala更快,尤其是在复杂的 SELECT 语句上。

  • Cloudera Impala是本机查询语言,避免了启动 在基于MapReduce / Tez的作业中常见的开销 (MapReduce程序需要花费一些时间才能使所有节点完全运行 容量)。在Hive中,每个查询都有“冷启动”的问题 而Impala守护程序进程是在启动时本身启动的, 随时准备处理查询。
  • 对于具有大量数据的表 和/或许多分区,检索表的所有元数据可以 耗时,在某些情况下需要几分钟。因此,每个Impala 节点缓存所有这些元数据,以供将来针对 同一张桌子。
  • Apache Hive是容错的,而Impala不 支持容错。运行配置单元查询时以及是否使用DataNode 在执行查询时关闭,查询的输出 由于Hive具有容错能力,因此将被生产。但是,那不是 Impala的案例。如果在Impala中执行查询失败,则必须 重新开始。