Spark问题排查思路
- 历史任务报错的常见原因
- 集群变更。例如JAR包版本冲突,环境改动,部分task集中在变更的节点导致重试次数超限,变更时间过长超过任务容错时间等。前两者需要追查异常原因,后两者一般可通过重跑解决
- 数据异常。例如数据倾斜、数据量激增、脏数据等
- 资源紧张,包括队列资源紧张(结合Yarn队列资源监控),和节点资源紧张(节点CPU、io、内存等)。后者常见于Spark Shuffle异常和task启动异常
- 集群bug,包括Spark和上下游组件等可能出现的bug,常表现为任务卡住,需结合task堆栈信息排查
- 新任务问题主要集中在用户的使用不当和环境匹配上,常见的包括
- 没有显示调用stop()方法结束(SparkSession.stop() 或 SparkContext.stop()),导致任务挂起
- 调用System.exit()方法退出,导致Spark无法执行正常的清退逻辑,状态异常
- JAR包版本冲突。常见于用户同集群环境共同依赖的jar包版本不一致,如protobuf,commons等包。这种情况可以考虑通过参数优先加载用户jar包——spark.driver.userClassPathFirst=true,spark.executor.userClassPathFirst=true
- 参数配置不合理。例如开发测试环境和生产环境的数据量不是一个级别,因此有些可以在开发测试环境使用的配置参数无法适用于生产环境
- Spark版本不一致,例如用户使用了更高版本的特性(常见于AI团队)
</