火花读大文件

时间:2015-06-29 02:25:56

标签: memory-management apache-spark

这可能是一个愚蠢的问题。我想确保我理解正确。

当你在一个巨大的文件(400GB)中进入一个集群,集合执行程序内存只在120GB左右时,Spark似乎永远在读。它不会崩溃,也不会启动第一个地图工作。

我认为正在发生的事情是,Spark正在通过大文件作为流读取,并在执行程序内存不足时开始丢弃旧行。当.map代码的执行开始时,这显然可能是一个问题,因为执行程序jvm将再次从头开始读回文件。我想知道,Spark是否以某种方式将数据泄漏到硬盘驱动器上,类似于随机溢出机制。

注意,我不是指缓存过程。这与初始读取使用有关 sc.textFile(filename)

1 个答案:

答案 0 :(得分:12)

sc.textFile没有开始任何阅读。它只是定义了一个驱动程序驻留数据结构,可用于进一步处理。

直到在RDD上调用一个动作,Spark才会构建一个策略来执行所有必需的转换(包括读取),然后返回结果。

如果有一个被调用的动作来运行序列,并且你读取后的下一个转换是要映射,那么Spark将需要读取文件的一小部分行(根据分区策略的数量)核心)然后立即开始映射它,直到它需要将结果返回给驱动程序,或者在下一个转换序列之前进行随机播放。

如果您的分区策略(defaultMinPartitions)似乎淹没了工作者,因为您的分区的Java表示(HDFS术语中的InputSplit)大于可用的执行程序内存,那么您需要指定要读取的分区数为textFile的第二个参数。您可以通过将文件大小除以目标分区大小来计算理想的分区数(允许内存增长)。可以读取文件的简单检查是:

sc.textFile(file, numPartitions)
  .count()  

另外,请检查此问题:run reduceByKey on huge data in spark