缓存()/ persist()的apache-spark内存消耗
当我尝试缓存()或持久化(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-孵化-hadoop1.0.4.jar pl.instream.dsp.offline.OfflineAnalysis
数据集大约有50GB的数据分成24个文件。 我将其压缩并存储在S3存储桶中的24个文件中(每个文件大小为7MB到300MB)。
我绝对找不到我的集群这种行为的原因,但似乎火花消耗了所有可用内存并进入了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的数据太少。 我至少尝试了几个100个分区。
接下来,您使用SPARK_MEM=5g
但是说每个节点都有7.5 GB,因此您可能还有SPARK_MEM=7500m
。
您也可以尝试增加内存分数,但我认为上述内容更有可能有所帮助。
一般要点:使用HDFS为你的文件而不是s3,它的速度要快得多。 确保在缓存之前正确地挖掘数据 – 例如,如果您说有100列的TSV数据,但是您只使用了10个字段,那么请确保在尝试缓存之前已经提取了这些字段。
“原始”缓存和“序列化”缓存之间存在很大差异
-
原始缓存:(
rdd.cache()
或rdd.persist(org.apache.spark.storage.StorageLevel.MEMORY_ONLY)
)这将消耗2x-3x的内存。 例如,100MB的rdd可以消耗350MB的内存
-
序列化缓存(rdd.persist(org.apache.spark.storage.StorageLevel.MEMORY_ONLY_SER))
这消耗了相同数量的内存以及一些小的开销。 例如,100MB数据将占用内存中的100MB +几KB。
在运营期间,原始缓存如何更快。 序列化缓存需要更长时间(因为在计算之前必须对对象进行反序列化)
这是我实验的有趣结果。
- 如何使用java创建一个简单的spark graphframe?
- 如何使用Java中的spark在Dataframe中用特定值替换空值?
- Apache Spark中的数据集
- Spark运行时错误:spark.metrics.sink.MetricsServlet无法实例化
- RDD不可序列化的Cassandra / Spark连接器java API
- 如果在SparkAction中使用PySpark,Oozie作业将无法运行
- 在同一Master下的Java和R Apps之间共享SparkContext
- apache spark MLLib:如何为字符串function构建标记点?
- 如何使Spark Streaming计算unit testing中文件中的单词?