为啥 Presto 比 Spark SQL 快 [关闭]

Posted

技术标签:

【中文标题】为啥 Presto 比 Spark SQL 快 [关闭]【英文标题】:Why Presto is faster than Spark SQL [closed]为什么 Presto 比 Spark SQL 快 [关闭] 【发布时间】:2018-10-05 10:38:15 【问题描述】:

为什么 Presto 比 Spark SQL 快?

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

【问题讨论】:

你能分享你在哪里运行你的 spark 和 presto 吗?你使用纱线,独立火花吗? 【参考方案1】:

一般来说,很难说 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 的更高版本支持多种基于成本的优化,请参阅here。【参考方案2】:

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

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

【讨论】:

容错开销的好处。【参考方案3】:

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

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

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

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

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

【讨论】:

以上是关于为啥 Presto 比 Spark SQL 快 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 dataset.count() 比 rdd.count() 快?

为啥 Spark 比 Hadoop Map Reduce 快

为啥在 Spark 中重新分区比 partitionBy 快?

为啥Spark比MapReduce快?

presto,dremio,spark-sql与ranger的整合记录

Spark SQL 与 Presto SQL 对比