当Spark正在S3上读取大数据集时,在“停机时间”期间会发生什么情况?

时间:2018-11-20 20:10:18

标签: apache-spark

我在AWS S3中有一堆JSON数据-假设有10万个文件,每个文件约5MB-我正在使用Spark 2.2的DataFrameReader通过以下方式读取和处理它们:

sparkSession.read.json(...)

我发现Spark在开始计算之前只会挂5分钟左右。较大的数据集可能要花费几个小时。当我说“挂起”时,我的意思是说,终端可视化不会显示群集正在运行的哪个阶段以及运行的距离,据我所知,它只是在阶段之间。

  

在此期间,Spark在做什么?我如何帮助它更快地运行?

我有两个想法,但是两个想法似乎都是错误的。

我的第一个想法是Spark正在尝试列出进行计算所需的所有文件。我通过实际离线创建文件列表并将其直接馈送到Spark而不是使用glob语法来进行测试:

val fileList = loadFiles() sparkSession.read.json(fileList:_*)

这实际上导致“悬挂”期持续更长的时间!

我的第二个想法是Spark正在这段时间为所有数据创建一个架构。但我通过手动指定架构来排除这种情况:

val schema = createSchema() sparksession.read.schema(schema).json(...)

这里的“挂起”时间段与以前相同,尽管总体计算速度更快。

所以我不太确定发生了什么或如何诊断。还有其他人碰到这个吗?

1 个答案:

答案 0 :(得分:0)

在S3中列出目录树的成本非常高,“分区”。这就是您所经历的。

修复

  • 文件少
  • 更浅的目录树