当我尝试对我的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线程占用多少内存?。关于该链接的建议之一是在我尝试以下工作时使用。 我在四个线程上运行了很长时间。尽管作业不会连续地累积内存,但是所返回的值会不断增加,甚至不会下降。这意味着不会返回线程使用的堆上的实际内存量。它返回自线程启动以来在堆上为线程分配的内存总量。我的平台详细信息如下: