火花读大文件

bho*_*ass 7 memory-management apache-spark

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

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

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

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

Ali*_*Lee 12

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

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

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

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

sc.textFile(file, numPartitions)
  .count()  
Run Code Online (Sandbox Code Playgroud)

另外,请检查以下问题:对spark中的大量数据运行reduceByKey