在Spark中充分利用内存

时间:2018-02-11 18:08:35

标签: hadoop apache-spark pyspark

我已经运行了Pyspark应用程序,我正在尝试保留数据帧,因为我在代码中再次使用数据框。

我使用以下内容:

sourceDF.persist(StorageLevel.MEMORY_AND_DISK_SER)

我正在处理30GB的数据。 我有3个节点,所有16 GB RAM和4个虚拟核心。 从Spark UI,我看到持久性之后的内存大小非常少。我希望它尽可能地将缓存的数据存储在RAM内存中。

enter image description here

如何最好地利用RAM内存?

此外,任务的GC时间似乎很高。我怎样才能减少它?

enter image description here

1 个答案:

答案 0 :(得分:0)

您已经通过使用数据帧和使用序列化存储数据来充分利用内存。除了尽可能多地过滤掉缓存之前最终结果不需要的数据,你还能做更多的事情。

垃圾收集很棘手。在使用Dataframe API和无类型转换时,催化剂将尽力避免不必要的对象创建。在使用数据帧并遇到GC问题时,你真的没有多少发言权。就性能和对象创建而言,某些操作本质上更昂贵,但您只能使用类型化数据集api和rdd api来控制那些操作。你最好做你现在正在做的事情。如果GC确实是一个问题,那么您可以做的最好的事情就是使用JVM分析工具,找出哪些代码片段正在创建最多的对象,并希望对其进行优化。此外,尝试尽可能减少数据偏差,并在可能的情况下利用广播连接应有助于避免某些GC。