我已经运行了一个Pyspark应用程序,并且尝试在代码中再次使用该数据帧时尝试保留该数据帧。
我正在使用以下内容:sourceDF.persist(StorageLevel.MEMORY_AND_DISK_SER)
我正在处理30GB的数据。
我有3个节点,所有16 GB RAM和4个虚拟内核。
从Spark UI,我看到持久化后的内存大小要小得多。我希望它尽可能将缓存的数据存储在RAM内存中。
如何最好地利用RAM内存?
另外,任务的GC时间似乎很长。我该如何减少呢?
最佳答案
通过使用数据帧并通过序列化存储数据,您已经在充分利用内存。除了在缓存之前过滤出最终结果不需要的尽可能多的数据之外,您没有更多的事情要做。
垃圾收集很棘手。在使用Dataframe API和无类型转换时,催化剂将尽力避免不必要的对象创建。在使用数据框并遇到GC问题时,您实际上没有太多发言权。就性能和对象创建而言,某些操作本来会更昂贵,但是您只能使用类型化的数据集api和rdd api来控制这些操作。最好不要做您当前正在做的事情。如果GC确实是一个问题,那么您可以做的最好的事情就是使用JVM分析工具,查找哪些代码段创建了最多的对象并希望对其进行优化。此外,尝试尽可能减少数据偏斜,并在可能的情况下利用广播连接应有助于避免出现GC。
关于hadoop - 在Spark中充分利用内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48734725/