You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows 10下Spark 3.3.0出现ShuffleStatus为空的NullPointerException求助

Spark 3.3.0 Shuffle Unregister NullPointerException (Windows 10 + Java 17 + UDF)

问题场景

在Windows 10系统上,使用Java 17运行包含UDF的Spark 3.3.0简单数据处理流水线,仅处理30000条记录时触发以下NullPointerException:

[ERROR] Error in removing shuffle 2
java.lang.NullPointerException: Cannot invoke "org.apache.spark.ShuffleStatus.invalidateSerializedMapOutputStatusCache()" because "shuffleStatus" is null
        at org.apache.spark.MapOutputTrackerMaster.$anonfun$unregisterShuffle$1(MapOutputTracker.scala:882)
        at org.apache.spark.MapOutputTrackerMaster.$anonfun$unregisterShuffle$1$adapted(MapOutputTracker.scala:881)
        at scala.Option.foreach(Option.scala:437)
        at org.apache.spark.MapOutputTrackerMaster.unregisterShuffle(MapOutputTracker.scala:881)
        at org.apache.spark.storage.BlockManagerStorageEndpoint$$anonfun$receiveAndReply$1.$anonfun$applyOrElse$3(BlockManagerStorageEndpoint.scala:59)
        at scala.runtime.java8.JFunction0$mcZ$sp.apply(JFunction0$mcZ$sp.scala:17)
        at org.apache.spark.storage.BlockManagerStorageEndpoint.$anonfun$doAsync$1(BlockManagerStorageEndpoint.scala:89)
        at scala.concurrent.Future$.$anonfun$apply$1(Future.scala:678)
        at scala.concurrent.impl.Promise$Transformation.run(Promise.scala:467)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
        at java.base/java.lang.Thread.run(Thread.java:833)

已尝试搜索错误核心术语但未找到有效线索,已提交SPARK-40582工单。

排查与解决方向

  1. 版本兼容性调整
    Spark 3.3.0对Java 17的支持属于实验性阶段,正式完善支持从Spark 3.3.1开始。可以试试降级到Java 11,或者升级Spark到3.3.1及以上版本,验证是否能规避该问题。

  2. 关闭MapOutput状态缓存
    直接绕过触发NPE的代码路径,添加以下配置禁用Shuffle MapOutput的序列化缓存:

// 在代码中设置
spark.conf.set("spark.shuffle.mapOutput.status.cache.enabled", "false")

或者在spark-defaults.conf中添加:

spark.shuffle.mapOutput.status.cache.enabled=false
  1. 检查UDF实现
    UDF的序列化问题可能间接导致Shuffle状态异常。得保证你的UDF实现了Serializable接口,避免在UDF中持有非序列化的对象(比如未序列化的数据库连接、自定义工具类实例等)。

  2. Windows环境优化
    Windows原生环境下Spark Shuffle容易出现文件系统权限或路径相关的隐性问题:

  • 确认spark.local.dir配置的临时目录有完整读写权限,且路径不含中文、空格或特殊字符
  • 切换到WSL2环境运行Spark,规避Windows系统的兼容性限制
  1. 完善SPARK工单信息
    为了帮助社区更快定位问题,建议在SPARK-40582工单中补充:
  • 可复现问题的最小化代码片段(尤其是UDF定义和Shuffle相关的数据处理逻辑)
  • 完整的Spark配置参数列表
  • 环境的详细依赖版本(比如Scala版本)

内容的提问来源于stack exchange,提问作者Garret Wilson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 09:25:29