Spark SQL - 按顺序或管道读取和写入?

时间:2016-04-13 09:10:50

标签: apache-spark apache-spark-sql

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

让我们考虑以下SQL查询:

SELECT * FROM table1 WHERE columnA ='xyz';

每项任务:

  1. 读取数据块(本地或远程节点)
  2. 过滤掉不满足谓词的元组
  3. 将剩余的元组写入磁盘
  4. (1),(2)和(3)是按顺序还是在管道中进行?换句话说,首先完全读取数据块(构成它的所有磁盘页),然后将其过滤,然后将其重写到磁盘或这些活动是否在管道中执行? (即在读取(n + 1)元组时,可以处理和写入n元组。)

    提前致谢。

2 个答案:

答案 0 :(得分:0)

每当你提交一份工作时,首先要做的就是为你的工作创建DAG(定向非循环图)。

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

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

答案 1 :(得分:0)

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

换句话说,在读取分区(HDFS块)时,可以对读取行执行过滤。无需读取整个块即可启动过滤。相应地进行写作。