我最近开始研究使用 Hive 和 Impala 查询位于 HDFS 上的大量 CSV 数据。正如我所预料的那样,与 Hive 相比,对于我迄今为止使用的查询,我使用 Impala 获得了更好的响应时间。
我想知道是否有一些类型的查询/用例仍然需要 Hive 以及 Impala 不适合的地方。
对于 HDFS 上的相同数据,与 Hive 相比,Impala 如何提供更快的查询响应?
您应该将 Impala 视为“HDFS 上的 SQL”,而 Hive 更像是“Hadoop 上的 SQL”。
换句话说,Impala 甚至根本不使用 Hadoop。它只是在所有节点上运行守护进程,这些守护进程缓存 HDFS 中的一些数据,因此这些守护进程可以快速返回数据,而无需执行整个 Map/Reduce 作业。
这样做的原因是运行 Map/Reduce 作业会产生一定的开销,因此通过完全短路 Map/Reduce,您可以在运行时获得相当大的收益。
话虽如此,Impala 并没有取代 Hive,它适用于非常不同的用例。与 Hive 相比,Impala 不提供容错功能,因此如果您的查询过程中出现问题,那么问题就消失了。对于 ETL 类型的工作,如果一项工作的失败代价高昂,我会推荐 Hive,但 Impala 对于小型即席查询可能很棒,例如对于只想查看和分析一些数据的数据科学家或业务分析师没有建立强大的工作。同样从我个人的经验来看,Impala 还不是很成熟,当数据量大于可用内存时,我有时会看到一些崩溃。
恕我直言,HDFS 上的 SQL 和 Hadoop 上的 SQL 是相同的。毕竟 Hadoop 是 HDFS(还有 MapReduce)。所以当我们说HDFS上的SQL时,理解为Hadoop上的SQL(可以有也可以没有MapReduce)。
回到实际问题,Impala 在使用MPP
(大规模并行处理)时提供了更快的响应,这与 Hive 不同,后者在后台使用 MapReduce,这涉及一些初始开销(正如 Charles Sir 所指定的)。大规模并行处理是一种计算类型,它使用许多并行运行的独立 CPU 来执行单个程序,其中每个 CPU 都有自己的专用内存。Impala 基于 MPP 的事实不涉及 MapReduce 作业的开销,即。作业设置和创建、插槽分配、拆分创建、地图生成等,使其速度极快。
但这并不意味着 Impala 是您所有问题的解决方案。作为高度内存密集型 (MPP),它不适合需要大量数据操作(如连接等)的任务,因为您无法将所有内容都放入内存中。这是 Hive 更适合的地方。
因此,如果您需要实时,对数据子集的即席查询可以使用 Impala。如果您对大数据有批处理需求,请选择 Hive。
高温高压
impala 中的一些关键特性使其速度更快。
它不使用在单独的 jvm 中分叉非常昂贵的 map/reduce。它运行单独的 Impala 守护程序,它拆分查询并并行运行它们并在最后合并结果集。
它在内存中完成大部分操作。
它使用 hdfs 进行存储,对于大文件来说速度很快。它尽可能多地缓存从查询到结果再到数据。
它支持新的文件格式,如 parquet,即柱状文件格式。因此,如果您使用这种格式,对于大多数时间只访问少数列的查询来说,它会更快。
Impala 不会取代 MapReduce 或使用 MapReduce 作为处理引擎。让我们首先了解Impala 和 Hive 之间的关键区别。
现在为什么 Impala 在查询处理方面比 Hive 更快?以下是一些关键点。
在处理类似 SQL 的查询时,Impala 不会将中间结果写入磁盘(如在 Hive MapReduce 中);相反, 完整的 SQL 处理是在内存中完成的,这使得它更快。
使用 Impala,与 MapReduce 相比,查询立即开始执行,MapReduce 可能需要大量时间来开始处理更大的 SQL 查询,这增加了更多的处理时间。
Impala Query Planner 使用智能算法在并行节点中的多个阶段执行查询,以更快地提供结果,避免在大多数情况下可能不必要的排序和混洗步骤。
Impala 有关于 HDFS 中每个数据块的信息,因此在处理查询时,它利用这些知识在所有 DataNode 中更均匀地分布查询。
存在 Impala 守护进程,它在每个 DataNode 上运行。这些负责处理查询。当查询提交时,impalad(Impala 守护程序)读取和写入数据文件并通过将工作分配到 Impala 集群中的所有其他 Impala 节点来并行化查询。
快速性能的另一个关键原因是 Impala首先为每个查询生成汇编级代码。汇编代码的执行速度比任何其他代码框架都快,因为当 Impala 查询在内存中本地运行时,拥有一个框架会由于框架开销而增加额外的执行延迟。
Impala 在内存中处理所有查询,因此节点上的内存限制绝对是一个因素。您必须有足够的内存来支持生成的数据集,在复杂的 JOIN 操作期间它可能会成倍增长。
如果查询开始处理数据并且结果数据集无法容纳在可用内存中,则查询将失败。
我可以想到 Impala 速度更快的以下原因,尤其是在复杂的SELECT语句上。