这可能是一个愚蠢的问题。我想确保我理解正确。
当你在一个巨大的文件(400GB)
中进入一个集群,集合执行程序内存只在120GB
左右时,Spark似乎永远在读。它不会崩溃,也不会启动第一个地图工作。
我认为正在发生的事情是,Spark正在通过大文件作为流读取,并在执行程序内存不足时开始丢弃旧行。当.map
代码的执行开始时,这显然可能是一个问题,因为执行程序jvm将再次从头开始读回文件。我想知道,Spark是否以某种方式将数据泄漏到硬盘驱动器上,类似于随机溢出机制。
注意,我不是指缓存过程。这与初始读取使用有关
sc.textFile(filename)
答案 0 :(得分:12)
sc.textFile
没有开始任何阅读。它只是定义了一个驱动程序驻留数据结构,可用于进一步处理。
直到在RDD上调用一个动作,Spark才会构建一个策略来执行所有必需的转换(包括读取),然后返回结果。
如果有一个被调用的动作来运行序列,并且你读取后的下一个转换是要映射,那么Spark将需要读取文件的一小部分行(根据分区策略的数量)核心)然后立即开始映射它,直到它需要将结果返回给驱动程序,或者在下一个转换序列之前进行随机播放。
如果您的分区策略(defaultMinPartitions
)似乎淹没了工作者,因为您的分区的Java表示(HDFS术语中的InputSplit
)大于可用的执行程序内存,那么您需要指定要读取的分区数为textFile
的第二个参数。您可以通过将文件大小除以目标分区大小来计算理想的分区数(允许内存增长)。可以读取文件的简单检查是:
sc.textFile(file, numPartitions)
.count()
另外,请检查此问题:run reduceByKey on huge data in spark