【问题标题】:How Spark handle data larger than cluster memorySpark 如何处理大于集群内存的数据
【发布时间】:2017-12-11 05:02:58
【问题描述】:

如果我只有 1 个内存为 25 GB 的执行程序,并且它一次只能运行一个任务,那么是否可以处理(转换和操作)1 TB 数据,如果是,那么它将如何读取以及中间数据在哪里会被存储吗?

对于同样的场景,如果 hadoop 文件有 300 个输入拆分,那么 RDD 中将有 300 个分区,那么在这种情况下,这些分区在哪里? 它会只保留在 hadoop 磁盘上,我的单​​个任务将运行 300 次吗?

【问题讨论】:

    标签: apache-spark


    【解决方案1】:

    我在 hortonworks 网站上找到了一个很好的答案。

    与流行的观点相反,Spark 不仅仅存在于内存中

    a) 简单读取无随机播放(无连接,...)

    对于初始读取,Spark 像 MapReduce 一样读取流中的数据并 > 处理它。 IE。除非有理由 spark 不会在内存中实现完整的 RDD(如果你想缓存一个小数据集,你可以告诉他这样做)RDD 是有弹性的,因为 spark 知道如何重新创建它(从 hdfs 重新读取一个块例如)不是因为它存储在不同位置的内存中。 (不过也可以这样做。)

    因此,如果您过滤掉大部分数据或在地图端进行有效聚合,您将永远不会在内存中拥有完整的表。

    b) 随机播放

    这与 MapReduce 非常相似,因为它将地图输出写入磁盘并通过 http 使用 reducer 读取它们。然而,spark 在 Linux 文件系统上使用了一种激进的文件系统缓冲区策略,因此如果操作系统有可用内存,则数据实际上不会写入物理磁盘。

    c) 随机播放后

    shuffle 后的 RDD 通常由引擎缓存(否则失败的节点或 RDD 将需要完全重新运行作业)但是正如 abdelkrim 提到的,除非您否决,否则 Spark 可以将这些溢出到磁盘。

    d) 火花流

    这有点不同。除非您覆盖设置,否则 Spark 流式传输要求所有数据都适合内存。

    Here's is the original page.

    Matei Zaharia 最初的 Spark 设计论文也有帮助。 (section 2.6.4 Behavior with Insufficient Memory)

    希望有一些有用的东西。

    【讨论】:

    • 当你说store on disk时,是worker机器磁盘还是hdfs?
    • 我也有同样的疑惑,据我所知,Spark 不需要从源复制数据?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    • 2020-07-15
    • 2018-05-26
    • 2016-01-29
    • 2017-02-10
    • 1970-01-01
    相关资源
    最近更新 更多