【问题标题】:Spark SQL - READ and WRITE in sequence or pipeline?Spark SQL - 按顺序或管道读取和写入?
【发布时间】:2016-04-13 09:10:50
【问题描述】:

我正在研究 Spark SQL 的成本函数。 在对 TABLE SCAN 行为进行建模时,我无法理解 READ 和 WRITE 是在管道中执行还是按顺序执行。

让我们考虑以下 SQL 查询:

SELECT * FROM table1 WHERE columnA = ‘xyz’;

每个任务:

  1. 读取数据块(本地或远程节点)
  2. 过滤掉不满足谓词的元组
  3. 将剩余的元组写入磁盘

(1)、(2)和(3)是按顺序执行还是流水线执行?换句话说,数据块首先被完全读取(构成它的所有磁盘页面),然后被过滤,然后被重写到磁盘,或者这些活动是在管道中进行的? (即在读取 (n+1)-tuple 时,可以处理和写入 n-tuple)。

提前致谢。

【问题讨论】:

    标签: apache-spark apache-spark-sql


    【解决方案1】:

    每当您提交作业时,Spark 所做的第一件事就是为您的作业创建 DAG(有向无环图)。

    创建 DAG 后,spark 知道哪些任务可以并行运行,哪些任务取决于上一步的输出等等。

    所以,在你的情况下, Spark 将并行读取您的数据(您可以在分区中看到),将它们过滤掉(在每个分区中)。 现在,由于保存需要过滤,所以它会等待至少一个分区的过滤完成,然后开始保存。

    【讨论】:

    • 所以,根据你的回答,给定单个任务,它的计算时间可以通过TimeRead+TimeProcessing+TimeWrite来估计(按顺序,没有管道)。 TimeRead 是读取其分区所花费的时间,TimeProcessing 用于过滤它,TimeWrite 用于将结果写入本地磁盘。我说的对吗?
    【解决方案2】:

    经过进一步挖掘,我发现 Spark SQL 使用了所谓的“火山式拉模型”。 根据这样的模型,一个简单的扫描-过滤-写入查询应该在管道中执行并且是完全分布式的。

    换句话说,在读取分区(HDFS 块)时,可以对读取的行执行过滤。无需阅读整个块即可开始过滤。相应地执行写入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      • 1970-01-01
      • 1970-01-01
      • 2012-06-01
      相关资源
      最近更新 更多