我正在为Spark SQL开发一个成本函数。在对TABLE SCAN行为建模时,我无法理解READ和WRITE是在管道中还是按顺序执行的。
让我们考虑以下SQL查询:
SELECT*FROM table1 WHERE columnA='xyz';
每个任务:
- 读取数据块(本地或远程节点)
- 筛选出不满足谓词的元组
- 将剩余的元组写入磁盘
(1)、(2)和(3)是按顺序执行还是在管道中执行?换句话说,数据块首先被完全读取(组成它的所有磁盘页面),然后被过滤,然后被重写到磁盘上,或者这些活动是在流水线中进行的?(即,在读取(n+1)-元组时,可以处理和写入n元组)。
提前谢谢。
每当您提交作业时,spark所做的第一件事就是为您的作业创建DAG(有向无环图)。
创建DAG后,spark知道哪些任务可以并行运行,哪些任务取决于前一步的输出,等等
所以,在你的情况下,Spark将并行读取您的数据(您可以在分区中看到),过滤掉它们(在每个分区中)。现在,由于保存需要过滤,所以它将等待至少一个分区的过滤完成,然后开始保存它。
经过进一步的挖掘,我发现Spark SQL使用了一个所谓的"火山式拉动模型"。根据这种模型,一个简单的扫描过滤器写查询可以在管道中执行,并且是完全分布式的。
换句话说,在读取分区(HDFS块)时,可以对读取的行执行过滤。不需要读取整个块来启动过滤。相应地进行写入。