Spark:一般的通用最佳实践"内存不足"错误?

时间:2016-06-13 07:51:14

标签: apache-spark

我经常使用Spark,我认为这是一个非常好的数据处理解决方案。但是有时候我会忘记内存"只是看日志时,错误并不容易发现。是否有任何一般的好方法来找到并解决这些问题?我读到的建议解决方案是在这里和那里调整参数。听起来我喜欢尝试运气。

2 个答案:

答案 0 :(得分:1)

  • 避免使用GroupByKey
  • 不要将大型RDD的所有元素复制到驱动程序
  • 优雅地处理错误的输入数据
  • 当Spark通过网络传输数据时,需要将对象序列化为二进制形式。当混洗或需要传输大量数据的其他操作时,这会对性能产生影响。为了改善这种情况,首先要确保您的代码以最小化可能发生的混洗量的方式编写(例如,仅使用groupByKey作为最后的手段,而是更喜欢使用reduceByKey这样的操作来执行聚合作为就地尽可能)。其次,考虑一下 使用Kryo而不是java.io.Serializable作为对象,因为它更紧凑 二进制表示比标准Java序列化程序,并且压缩或解压缩也更快。为了进一步提高性能,特别是在处理数十亿个对象时,可以在启动时使用Kryo序列化程序注册类,从而节省更多宝贵的字节。
  • 对于较大的数据集(> 200Gb),JVM Spark运行中的垃圾收集可能会成为性能问题。通常,通过默认的ParallelGC切换到G1 GC最终会更高效。但是,根据数据集和应用程序的详细信息,将需要进行一些调整。

答案 1 :(得分:0)

除上述内容外,

  1. 根据输入大小管理执行程序内存
  2. 当输入大小不适合内存时,您可以使用磁盘和内存选项