当我尝试对我的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。
SPARK_MEM=5g
SPARK_MEM=7500m
您也可以尝试增加内存比例,但我认为以上方法可能会有所帮助。
一般要点:为您的文件而不是s3使用HDFS,速度要快得多。确保在缓存数据之前适当地调整数据- 例如,如果您说有100列的TSV数据,但仅使用了10个字段,那么在尝试缓存之前,请确保已提取这些字段。