我最近开始研究使用Hive和Impala查询位于HDFS上的大量CSV数据。正如我所期待的那样,与Hive相比,我使用Impala的响应时间比我目前使用的查询要好。
我想知道是否有某些类型的查询/用例仍然需要Hive以及Impala不适合的地方。
与Hive相比,Impala如何为HDFS上的相同数据提供更快的查询响应?
答案 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中有一些关键特性使其速度更快。
它不使用非常昂贵的map / reduce来分叉 单独的jvms。它运行单独的Impala守护程序,用于拆分查询 并行运行它们并在最后合并结果集。
它在内存中完成大部分操作。
它使用hdfs存储,对于大文件来说速度很快。它 从查询到结果到数据尽可能地缓存。
它支持像plat这样的新文件格式,它是柱状文件 格式。因此,如果您使用此格式,查询的位置会更快 您只访问了几列 大部分时间都是。
答案 3 :(得分:1)
Impala不会替代MapReduce或将MapReduce用作处理引擎。让我们首先了解 Impala和Hive之间的关键区别。
现在,为什么在查询处理中Impala比Hive更快?以下是一些关键点。
在处理类似SQL的查询时, Impala不会在磁盘上写入中间结果(例如在Hive MapReduce中);代替 完整的SQL处理在内存中完成,这使它处理起来更快。
使用Impala,与MapReduce相比,查询立即开始执行。 是时候开始处理较大的SQL查询了,这会增加处理时间。
Impala查询计划器使用智能算法在并行节点中的多个阶段中执行查询,以 提供更快的结果,避免了排序和混洗步骤,在大多数情况下,这是不必要的。
Impala具有有关HDFS中每个数据块的信息,因此在处理查询时,它利用此知识在所有DataNode中更均匀地分配了查询。
存在一个Impala守护程序,该守护程序在每个DataNode上运行。这些负责处理查询。提交查询后,impalad(Impala守护程序)读取和写入数据文件,并通过将工作分配给Impala群集中的所有其他Impala节点来并行化查询。
提高性能的另一个关键原因是Impala 首先为每个查询生成程序集级代码。 汇编代码的执行速度比任何其他代码框架都要快,因为在运行Impala查询时 本机存在于内存中,由于存在框架,拥有框架会增加执行的额外延迟 开销。
Impala处理内存中的所有查询,因此节点上的内存限制绝对是一个因素。您必须具有足够的内存以支持结果数据集,在复杂的JOIN操作过程中可能会成倍增长。
如果查询开始处理数据并且结果数据集无法容纳在可用内存中,则查询将失败。
答案 4 :(得分:0)
我可以考虑以下原因使Impala更快,尤其是在复杂的 SELECT 语句上。