impala与spark的ad-hoc查询性能比较

bakd9h0s  于 2021-05-27  发布在  Hadoop
关注(0)|答案(1)|浏览(1049)

我只对查询性能原因及其背后的体系结构差异感兴趣。我以前看到的所有答案都过时了,或者没有为我提供足够的背景来说明为什么 Impala 更适合于特殊查询。
从下面的三点考虑,只有第二点解释了为什么 Impala 在更大的数据集上更快。你能为以下陈述做些贡献吗?
impala不会错过查询预初始化的时间,这意味着impalad守护进程总是在运行并准备就绪。另一方面,spark作业服务器为相同的目的提供持久上下文。
impala在内存中,当数据没有足够的ram时,它会将数据溢出到磁盘上,性能会受到影响。spark也是如此。主要区别在于spark是在scala上编写的,并且有jvm限制,因此不建议使用大于32gb的worker(因为gc)。反过来,[错了,请参阅upd]impala是在c++上实现的,并且具有很高的硬件要求:建议使用128-256+gbs的ram。这是非常重要的,但是应该只对需要32-64+gbs内存的数据集有益。
impala与hadoop基础设施集成。afaik在另一个内存dwhs上使用impala的主要原因是能够在hadoop数据格式上运行,而无需从hadoop导出数据。意味着impala通常使用与spark相同的存储/数据/分区/bucketing,与spark相比,不会从数据结构中获得任何额外的好处。我说得对吗?
p、 2019年 Impala 比星火还要快吗?你有没有看到任何绩效基准?

升级版本:

问题更新:
一。为什么impala推荐128+gbs内存?每个 Impala 组件的实现语言是什么?文档中说“impala守护进程运行在集群中的每个节点上,每个守护进程都可以充当查询计划器、查询协调器和查询执行引擎。”。如果 impalad 是java,而不是用c++写的什么部分?impalad和columnar数据之间是否有关联?impalad或其他组件是否需要256 GB ram?
二。当涉及到集群洗牌(连接)时,impala释放了所有内存中的性能优势,对吗?与spark相比, Impala 有什么机制来提高连接性能吗?
iii.impala使用多级服务树(类似于smth的dremel引擎,请参阅此处的“执行模型”)与spark的有向无环图。就即席查询性能而言,mlst和dag究竟意味着什么?还是更适合多用户环境?

bwntbbo3

bwntbbo31#

首先,我不认为比较通用分布式计算框架和分布式dbms(sql引擎)有什么意义。但是如果我们仍然想比较单用户模式下的单个查询执行(?!),imo最大的区别是您已经提到的--impala查询协调器将所有内容(hive metastore中的表元数据+namenode中的块位置)缓存在内存中,而spark需要时间来提取这些数据以执行查询规划。
第二个大问题可能是shuffle实现,spark在阶段边界将临时文件写入磁盘,而impala则试图将所有内容保存在内存中。这导致了恢复能力上的巨大差异—虽然spark可以从丢失的执行器中恢复过来,并通过重新计算丢失的块继续前进,但在单个impalad守护进程崩溃后,impala将使整个查询失败。
在性能方面不太重要(因为它通常比其他东西花费的时间少得多),但在体系结构上重要的是工作分配机制——在spark中将编译好的整个阶段的代码发送给工作程序,而在impala中将声明性的查询片段发送给守护程序。
至于具体的查询优化技术(查询矢量化、动态分区剪枝、基于成本的优化),它们可能在今天达到标准,也可能在不久的将来达到标准。

相关问题