综述
这篇文章记录了 Spark 应用开发过程遇到的各种问题及解决方案。主要来自于个人开发的实践,也有部分解决方案来自互联网,如有不足之处欢迎批评指正。本人会持续更新转载请保留原文地址
问题描述及解决方案
java.lang.OutOfMemoryError: Java heap space 错误
这个是 Spark 应用常见错误。JVM 堆内存空间不足。解决方案如下:
- 首先要判断是 Driver 或者 Executor 出现 OOM,通过--driver-memory 或者--executor-memory 进行调整。
- 如果是 Spark SQL 或者 Spark Streaming 的程序,建议适当地提高 heap size。
java.lang.OutOfMemoryError: GC overhead limit exceeded 错误
这个也是 Spark 应用常见错误,由于 GC 时间过长导致的。解决方案如下:
- 直接通过--driver-memory 或者--executor-memory 增加 heap size
- 修改 GC policy。可以使用-XX:UseG1GC 或者-XX:UseParallelGC
编译 OK,运行时出 NoClassDefineError 错误
这个错误非常清晰,根本原因就是 jar 没有放入 classpath 之中。首先需要判断到底是 Driver 还是 Executor 缺少这个 jar 包。
- 将 jar 包路径配置到 spark.driver.extraClassPath 或者 spark.executor.extraClassPath。
- 将 jar 包路径通过 spark-submit 的--driver-class-path 或者--executor-class-path 指定。
其实,spark-submit 还有一个--packages 参数,这个参数让 Spark 通过 Maven 从本地或者远程的 repository 处获取 jar 包。这个参数看似非常方便,但实际使用的时候不是很实用。因为 Hadoop 和 Spark 集群应用一般都是部署在内网的,为了数据安全,一般情况都是无法访问外网的。
org.apache.spark.SparkException: Task not serializable
关于这个问题有单独的一篇文章进行分析,详见:Spark Troubleshooting - Task not serializable 问题分析
java.io.IOException: No space left on device 错误
具体 stack trace 如下:
stage 89.3 failed 4 times, most recent failure: |
这个错误是由于,Spark "scratch" space 不足,具体路径通过 spark.local.dir 参数设置,默认是/tmp。官方对于 scratch space 的解释是
Directory to use for "scratch" space in Spark, including map output files and RDDs that get stored on disk. |
spark.driver.maxResultSize 超出错误
数据拉回 Driver 端是有限制的,通过 spark.driver.maxResultSize 控制:
- 默认是 1g
- 可以设置为 0 或者 unlimited
- 如果设置成 unlimited 就不会再遇到这个错误,取而代之的是 OOM。
java.lang.IllegalArgumentException: Size exceeds Integer.MAX_VALUE
具体 stack trace 如下:
java.lang.IllegalArgumentException: Size exceeds Integer.MAX_VALUE |
这个问题是由于 shuffle block 大于 2GB 导致的,这个是 Spark 实现上的一个问题。Spark 使用 ByteBuffer 作为 storing blocks。
val buf = ByteBuffer.allocate(length.toInt) * ByteBufferislimitedbyInteger.MAX_SIZE |
这就是 2GB 的由来。
参考资料
- http://spark.apache.org/docs/latest/configuration.html