Spark SQL - 按顺序或管道读取和写入?
Posted
技术标签:
【中文标题】Spark SQL - 按顺序或管道读取和写入?【英文标题】:Spark SQL - READ and WRITE in sequence or pipeline? 【发布时间】:2016-04-13 09:10:50 【问题描述】:我正在研究 Spark SQL 的成本函数。 在对 TABLE SCAN 行为进行建模时,我无法理解 READ 和 WRITE 是在管道中执行还是按顺序执行。
让我们考虑以下 SQL 查询:
SELECT * FROM table1 WHERE columnA = ‘xyz’;
每个任务:
-
读取数据块(本地或远程节点)
过滤掉不满足谓词的元组
将剩余的元组写入磁盘
(1)、(2)和(3)是按顺序执行还是流水线执行?换句话说,数据块首先被完全读取(构成它的所有磁盘页面),然后被过滤,然后被重写到磁盘,或者这些活动是在管道中进行的? (即在读取 (n+1)-tuple 时,可以处理和写入 n-tuple)。
提前致谢。
【问题讨论】:
【参考方案1】:每当您提交作业时,Spark 所做的第一件事就是为您的作业创建 DAG(有向无环图)。
创建 DAG 后,spark 知道哪些任务可以并行运行,哪些任务取决于上一步的输出等等。
所以,在你的情况下, Spark 将并行读取您的数据(您可以在分区中看到),将它们过滤掉(在每个分区中)。 现在,由于保存需要过滤,所以它会等待至少一个分区的过滤完成,然后开始保存。
【讨论】:
所以,根据你的回答,给定单个任务,它的计算时间可以通过TimeRead+TimeProcessing+TimeWrite来估计(按顺序,没有管道)。 TimeRead 是读取其分区所花费的时间,TimeProcessing 用于过滤它,TimeWrite 用于将结果写入本地磁盘。我说的对吗?【参考方案2】:经过进一步挖掘,我发现 Spark SQL 使用了所谓的“火山式拉模型”。 根据这样的模型,一个简单的扫描-过滤-写入查询应该在管道中执行并且是完全分布式的。
换句话说,在读取分区(HDFS 块)时,可以对读取的行执行过滤。无需阅读整个块即可开始过滤。相应地执行写入。
【讨论】:
以上是关于Spark SQL - 按顺序或管道读取和写入?的主要内容,如果未能解决你的问题,请参考以下文章
kerberized Hadoop 环境中的 Spark 和启用的高可用性:Spark SQL 只能在写入任务后读取数据