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