与蜂巢相比,impala如何提供更快的查询响应
我最近开始研究使用Hive和Impala查询位于HDFS上的大量CSV数据。 正如我期待的那样,到目前为止我所使用的查询与Impala相比,我得到了更好的响应时间。
我想知道是否有某些types的查询/用例仍然需要Hive,而Impala并不适合。
与Hive相比,Impala如何为HDFS上的相同数据提供更快的查询响应?
您应该将Impala看作“HDFS上的SQL”,而Hive更多地是“Hadoop上的SQL”。
换句话说,Impala根本就不使用Hadoop。 它只是在所有节点上运行守护进程,cachingHDFS中的一些数据,这样这些守护进程可以快速返回数据,而不必经历整个Map / Reduce作业。
原因是运行一个Map / Reduce作业有一定的开销,所以通过Map / Reduce的短路,你可以在运行时获得很大的收益。
这就是说,Impala不能取代Hive,对于非常不同的用例是有好处的。 与Hive相比,Impala不提供容错function,因此如果在查询过程中遇到问题,那么它就消失了。 当然,对于ETLtypes的工作,如果一个工作失败会导致代价高昂,我会推荐Hive,但对于小型即席查询,Impala可能非常棒,例如数据科学家或业务分析师只想查看和分析一些数据没有build立健全的工作。 另外从我个人的经验来看,Impala还不是很成熟,有时当数据量大于可用内存时,我看到了一些崩溃。
IMHO,HDFS上的SQL和Hadoop上的SQL都是一样的。 毕竟Hadoop是HDFS + MapReduce。 所以当我们在HDFS上说SQL时,可以理解它是Hadoop上的SQL。
回到实际的问题,Impala提供了更快的响应,因为它使用MPP
(大规模并行处理),而不像使用MapReduce的Hive,这涉及一些初始开销(正如Charles先生指定的那样)。 大规模并行处理是一种计算,它使用许多独立的CPU并行执行一个程序,每个CPU都有自己的专用内存。 基于MPP的Impala事实上并不涉及MapReduce作业的开销。 作业设置和创build,插槽分配,分割创build,地图生成等等,使得它非常快速。
但这并不意味着Impala是解决所有问题的方法。 由于内存密集程度高(MPP),对于需要大量数据操作(如连接等)的任务来说,它并不适合,因为您无法将所有内容都纳入内存。 这是Hive更适合的地方。
所以,如果您需要实时的话,您的数据的一个子集的临时查询适用于Impala。 如果你有批量处理有点需要通过你的大数据去蜂巢。
HTH
在飞羚中有一些关键特征,使其快速。
-
它不使用map / reduce,这是非常昂贵的分叉jvms。 它运行单独的Impala Daemon,它将查询拆分并并行运行并在结尾处合并结果集。
-
它在内存中执行大部分操作。
-
它使用hdfs来存储大文件的快速文件。 它尽可能地将查询caching到数据结果中。
-
它支持像parquet这样的新的文件格式,它是列式文件格式。 所以,如果你使用这种格式,那么在大多数情况下你只能访问几列的查询将会更快。