【问题标题】:spark reading large file火花读取大文件
【发布时间】:2015-06-29 02:25:56
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: memory-management apache-spark


    【解决方案1】:

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

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

    如果调用了一个动作来运行序列,而你读取后的下一个转换是映射,那么 Spark 将需要读取文件的一小部分行(根据基于数量的分区策略) cores),然后立即开始映射它,直到它需要将结果返回给驱动程序,或者在下一个转换序列之前洗牌。

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

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

    另外,检查这个问题:run reduceByKey on huge data in spark

    【讨论】:

    • 我会重点检查一个动作是否实际被调用。此外,提及可以使用不同的持久性设置可能就足够了,如 here 所示。
    • 我可以告诉你所有你走错了路。所有代码的最后都有一个 .saveTextFile,它充当所需的操作。我今天重写了代码,用普通的旧 RDD 替换了 DataFrame,并且在相同大小的数据和集群下一切正常。我现在在想,这都和我写的DataFrame代码有关。
    • 真的希望有人能回答这个问题。我能够找到缓存在 Spark 中的工作方式,但找不到任何文档来解释当您的初始读取超过总内存时会发生什么。有人吗?
    • 编辑了我关于调整 InputSplit 大小以适应执行程序内存的回复。当你接受免费帮助时,你可能会更有礼貌。
    • 感谢编辑后的回复。没有不礼貌的意思,只是不想把某事标记为答案,如果它没有抓住重点。新的分区大小响应更针对原始问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 2017-05-19
    • 2020-04-05
    • 2019-08-16
    • 1970-01-01
    相关资源
    最近更新 更多