当前位置: 首页 > 面试题库 >

apache-spark的cache()/ persist()内存消耗

咸昊昊
2023-03-14
问题内容

当我尝试对我的RDD进行cache()或持久化(MEMORY_ONLY_SER())时,我的Spark集群挂起。它运行良好,并在大约7分钟内计算出结果。如果我不使用cache()。

我有6个c3.xlarge EC2实例(4个内核,每个7.5 GB RAM),总共提供24个内核和37.7 GB。

我在master上使用以下命令运行应用程序:

SPARK_MEM = 5g MEMORY_FRACTION =“ 0.6” SPARK_HOME =“ / root / spark” java -cp
./uber-offline.jar:/root/spark/assembly/target/scala-2.10/spark-
assembly_2.10-0.9.0- incubating-hadoop1.0.4.jar
pl.instream.dsp.offline.OfflineAnalysis

数据集大约有50GB的数据,分为24个文件。我将其压缩并存储在S3存储桶中的24个文件中(每个文件的大小为7MB至300MB)。

我绝对找不到导致我的群集出现这种行为的原因,但似乎,例如spark消耗了所有可用内存并进入了GC收集循环。当我查看gc
verbose时,可以找到如下所示的循环:

[GC 5208198K(5208832K), 0,2403780 secs]
[Full GC 5208831K->5208212K(5208832K), 9,8765730 secs]
[Full GC 5208829K->5208238K(5208832K), 9,7567820 secs]
[Full GC 5208829K->5208295K(5208832K), 9,7629460 secs]
[GC 5208301K(5208832K), 0,2403480 secs]
[Full GC 5208831K->5208344K(5208832K), 9,7497710 secs]
[Full GC 5208829K->5208366K(5208832K), 9,7542880 secs]
[Full GC 5208831K->5208415K(5208832K), 9,7574860 secs]

最终导致出现如下消息:

WARN storage.BlockManagerMasterActor: Removing BlockManager BlockManagerId(0, ip-xx-xx-xxx-xxx.eu-west-1.compute.internal, 60048, 0) with no recent heart beats: 64828ms exceeds 45000ms

…并停止计算的任何进展。看起来内存消耗了100%,但是我尝试使用具有更多RAM(每台30GB)的计算机,效果是相同的。

这种行为的原因可能是什么?有人可以帮忙吗?


问题答案:

尝试使用更多分区,每个CPU应该有2-4个分区。IME增加分区数量通常是使程序更稳定(通常更快)的最简单方法。

默认情况下,我认为您的代码将使用24个分区,但是对于50 GB的数据而言,这太少了。我会尝试至少几个分区。

接下来,您要使用SPARK_MEM=5g每个节点有7.5 GB的空间,因此最好也有SPARK_MEM=7500m

您也可以尝试增加内存比例,但我认为以上方法可能会有所帮助。

一般要点:为您的文件而不是s3使用HDFS,速度要快得多。确保在缓存数据之前适当地调整数据-
例如,如果您说有100列的TSV数据,但仅使用了10个字段,那么在尝试缓存之前,请确保已提取这些字段。



 类似资料:
  • 我是spark的新手,有关于迭代器使用spark内存的问题。 在使用数据集的Foreach()或MapPartitions()(甚至直接调用RDD的iterator()函数时,spark是否需要先将整个分区加载到RAM中(假设分区在磁盘中),还是在我们继续迭代时可以延迟加载数据(意味着,spark可以只加载部分分区数据执行任务,并将中间结果保存到磁盘)

  • apollo3-cache-persist Simple persistence for all Apollo Client 3.0 cache implementations, includingInMemoryCache and Hermes. Supports web and React Native. See all storage providers. Basic Usage React

  • 如何增加Apache spark executor节点可用的内存? 我有一个2 GB的文件,适合加载到Apache Spark。我目前正在1台机器上运行apache spark,因此驱动程序和执行程序在同一台机器上。这台机器有8 GB内存。 我尝试了这里提到的各种东西,但我仍然得到错误,并没有一个明确的想法,我应该改变设置。 我正在从spark-shell交互地运行我的代码

  • 我有一个配置单元表,只有很少的bigint或string列,超过3800万行,总大小略大于1GB,测试环境是一个小型独立集群,有4个工作节点,每个都有8GB内存,Spark 1.4。在Spark sql shell中,我尝试执行一个sql 有好几次,工作总是停留在第一阶段,几乎没有任务悬而未决。 GC报告似乎表明没有足够的内存来存储临时对象,进程正在等待完整的GC完成。 一个挂起节点的GC输出:

  • 我正在构建一个Spark应用程序,我必须在其中缓存大约15GB的CSV文件。我在这里读到了Spark 1.6中引入的新: https://0x0fff.com/spark-memory-management/ 作者在和之间有所不同(火花内存又分为)。正如我所了解的,Spark内存对于执行(洗牌、排序等)和存储(缓存)东西是灵活的——如果一个需要更多内存,它可以从另一个部分使用它(如果尚未完全使用)

  • 问题内容: 我需要监视应用程序产生的线程消耗的内存量。如果贪婪的线程消耗太多内存,则想法是采取纠正措施。我已提到Java线程占用多少内存?。关于该链接的建议之一是在我尝试以下工作时使用。 我在四个线程上运行了很长时间。尽管作业不会连续地累积内存,但是所返回的值会不断增加,甚至不会下降。这意味着不会返回线程使用的堆上的实际内存量。它返回自线程启动以来在堆上为线程分配的内存总量。我的平台详细信息如下: