为什么 Presto 比 Spark 快 SQL

Why Presto is faster than Spark SQL

为什么 Presto 比 Spark 快 SQL?

另外Presto和Spark在计算架构和内存管理上有什么区别SQL?

我认为主要区别在于 Presto 的架构与 MPP SQL 引擎非常相似。这意味着仅针对 SQL 查询执行进行了高度优化,而 Spark 是一个通用执行框架,能够 运行 多种不同的工作负载,例如 ETL、机器学习等

此外,Presto 为 SQL 查询实现较低延迟所做的一项权衡是不关心中间查询容错。如果其中一个 Presto 工作节点遇到故障(例如,关闭),在大多数情况下,正在进行的查询将中止并需要重新启动。另一方面,Spark 支持中间查询容错并且可以从这种情况中恢复,但为了做到这一点,它需要做一些额外的簿记工作,本质上是 "plan for failure"。当您的集群没有遇到任何故障时,这种开销会导致性能下降。

一般来说,很难说 Presto 肯定比 Spark 快还是慢 SQL。这实际上取决于您正在执行的查询类型、环境和引擎调整参数。然而,我在行业中看到的(Uber, Neflix 个示例)Presto 用作临时 SQL 分析,而 Spark 用于 ETL/ML 管道。

一个可能的解释是,为 Presto 安排查询没有太多开销。 Presto 协调器始终处于启动状态并等待查询。另一方面,Spark 采用的是懒惰的方法。驱动程序与集群管理器协商资源、复制 jar 并开始处理需要时间。

另一种认为Presto架构相当直白。它有一个协调器来执行 SQL 解析、计划、调度和一组执行物理计划的工作人员。

另一方面,Spark 核心之间有更多层。除了 Presto 具有的阶段外,Spark SQL 还必须应对 RDD 中的弹性构建,为作业进行资源管理和协商。

另请注意,Spark SQL 具有基于成本的优化器,可以更好地处理复杂查询。而 Presto(0.199) 有一个遗留的基于规则的优化器。 There is ongoing effort 将 CBO 引入 Presto,这可能会击败 Spark SQL 性能。

职位: Presto 强调查询,而 spark 强调计算。

内存存储: 都是内存存储和计算,spark在内存不够的时候会把数据写到磁盘,但是很快就会OOM。

任务、资源: spark在每个阶段实时提交任务和申请资源(这种策略会导致处理速度比presto稍慢); Presto申请所有需要的资源并提交所有任务。

数据处理: 在 spark 中,数据在传递到下一阶段之前需要被完全处理。 Presto是一种批处理(页面)流水线处理方式。只要页面完成,就可以发送到下一个任务(这种方式大大减少了各种查询的端到端响应时间)。

数据容错: 如果spark失败或者丢失数据,会根据亲缘关系重新计算。但是急速会导致查询失败。