当我尝试缓存()或持久化(MEMORY_ONLY_SER())我的 RDD 时,我的 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 个文件。我将其压缩并以 24 个文件存储在 S3 存储桶中(每个文件的大小为 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%,但我尝试使用内存更大的机器(比如每台30GB),效果是一样的。
这种行为的原因可能是什么?有人可以帮忙吗?