Spark 如何处理比 Spark 存储大得多的数据?

Posted

技术标签:

【中文标题】Spark 如何处理比 Spark 存储大得多的数据?【英文标题】:How can Spark process data that is way larger than Spark storage? 【发布时间】:2021-03-12 08:01:20 【问题描述】:

目前正在学习 Spark,遇到了执行者的定义:

每个 executor 都会持有一块要处理的数据。这 chunk 称为 Spark 分区。它是行的集合 位于集群中的一台物理机器上。执行者负责 用于执行驾驶员分配的工作。每个执行者是 负责两件事:(1)执行驱动程序分配的代码, (2) 将计算状态报告给驱动程序

我想知道如果spark集群的存储量小于需要处理的数据会怎样? executors 将如何获取数据以放在集群中的物理机上?

同样的问题也适用于流数据,即未绑定的数据。 Spark 是否将所有传入的数据保存在磁盘上?

【问题讨论】:

【参考方案1】:

Apache Spark FAQ 简要提到了 Spark 可能采用的两种策略:

我的数据是否需要放入内存才能使用 Spark?

没有。如果内存不适合 Spark 的操作员将数据溢出到磁盘, 允许它在任何大小的数据上运行良好。同样,缓存的数据集 不适合内存的要么溢出到磁盘要么重新计算 需要时飞,由 RDD 的storage level 确定。

虽然 Spark 默认使用所有可用内存,但可以将其配置为仅使用磁盘运行作业。

在 Matei 关于 Spark (An Architecture for Fast and General Data Processing on Large Clusters) 的博士论文的 2.6.4 内存不足的行为 部分中,对由于可用内存量减少造成的性能影响进行了基准测试。

在实践中,您通常不会持久化 100TB 的源数据帧,而只会持久化被重用的聚合或中间计算。

【讨论】:

精彩的答案!

以上是关于Spark 如何处理比 Spark 存储大得多的数据?的主要内容,如果未能解决你的问题,请参考以下文章

Apache Spark 如何处理不适合内存的数据?

Spark 如何处理涉及 JDBC 数据源的故障场景?

从Spark SQL与RDD api编写数据

如何处理 Spark 中的多个 csv.gz 文件?

spark结构化流作业如何处理流-静态DataFrame连接?

从 Spark 写入镶木地板时如何处理空值