当前位置: 首页 > 知识库问答 >
问题:

Spark如何处理大于集群内存的数据

邓仲卿
2023-03-14

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

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

共有1个答案

苍嘉澍
2023-03-14

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

与人们普遍认为的相反,火花不仅仅存在于记忆中

a)简单的读没有洗牌(没有连接,...)

对于初始读取,类似Spark的MapReduce读取流中的数据

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

b) 洗牌

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

c)洗牌后

洗牌后的RDD通常由引擎缓存(否则发生故障的节点或RDD将需要完全重新运行作业),但正如abdelkrim提到的那样,Spark可能会将这些数据泄漏到光盘上,除非您对此进行反驳。

d) 火花流

这有点不同。Spark streaming希望所有数据都能放入内存,除非覆盖设置。

这是原始页面。

Matei Zaharia最初的Spark设计论文也有所帮助。(第2.6.4节内存不足的行为)

希望有有用的东西。

 类似资料:
  • null 当我运行上面的代码,然后该表以激发内存时,它占用的内存<2GB-与集群可用的内存相比很小-然后当我试图数据到驱动程序节点时,我会得到一个OOM错误。 我已尝试在以下设置上运行: 具有32个内核和244GB RAM的计算机上的本地模式 具有10 x 6.2GB执行程序和61GB驱动程序节点的独立模式 我的问题: 缓存后占用空间如此之少的数据文件怎么会导致内存问题? 在我转向可能损害性能的其

  • 我正在尝试用H2O(3.14)训练机器学习模型。我的数据集大小是4Gb,我的计算机RAM是2Gb,带有2G交换,JDK 1.8。参考本文,H2O可以使用2Gb RAM处理大型数据集。 关于大数据和GC的说明:当Java堆太满时,我们会进行用户模式的磁盘交换,即,您使用的大数据比物理DRAM多。我们不会因GC死亡螺旋而死亡,但我们会降级到核心外的速度。我们将以磁盘允许的速度运行。我个人测试过将12G

  • 我有四个问题。假设在spark中有3个worker节点。每个工人节点有3个执行器,每个执行器有3个核心。每个执行器有5 gb内存。(总共6个执行器,27个内核,15GB内存)。如果: > 我有30个数据分区。每个分区的大小为6 GB。最佳情况下,分区的数量必须等于核心的数量,因为每个核心执行一个分区/任务(每个分区执行一个任务)。在这种情况下,由于分区大小大于可用的执行器内存,每个执行器核心将如何

  • 参考: Spark独立集群中的工作者、执行者、核心是什么? 火花独立编号执行器/核心控件 如何使用Spark独立集群在辅助节点上管理多个执行器?

  • 好吧,我对使用Scala/Spark还比较陌生,我想知道是否有一种设计模式可以在流媒体应用程序中使用大量数据帧(几个100k)? 在我的示例中,我有一个SparkStreaming应用程序,其消息负载类似于: 因此,当用户id为123的消息传入时,我需要使用特定于相关用户的SparkSQL拉入一些外部数据,并将其本地缓存,然后执行一些额外的计算,然后将新数据持久保存到数据库中。然后对流外传入的每条

  • null null 为了进行简单的开发,我使用在独立集群模式下(8个工作者、20个内核、45.3G内存)执行了我的Python代码。现在我想为性能调优设置执行器内存或驱动程序内存。 在Spark文档中,执行器内存的定义是 每个执行程序进程使用的内存量,格式与JVM内存字符串相同(例如512M、2G)。