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

macOS Big Sur上PySpark Pandas UDF出现EOFError问题求助

问题诊断与解决方案:macOS Big Sur下PySpark Pandas UDF抛出EOFError

问题场景

你在macOS Big Sur上运行PySpark的Pandas UDF时遇到了EOFError,错误堆栈里还附带了java.lang.UnsupportedOperationException: sun.misc.Unsafe 或 java.nio.DirectByteBuffer.<init>(long, int) 不可用的提示,但相同代码在Google Colab能正常执行,普通Spark UDF也完全没问题。

核心原因

这是macOS Big Sur + Java 11 + Spark 3.0.x组合的兼容性坑:Spark的Pandas UDF依赖Arrow实现高效的数据传输,而Arrow底层依赖Java的sun.misc.Unsafe API。在macOS Big Sur的OpenJDK 11环境中,这个API的权限被系统限制,导致Spark与Python进程之间的Arrow数据通道直接中断,最终Python工作进程崩溃并抛出EOFError。

解决步骤

1. 降级Java到OpenJDK 8

Spark 3.0.x对Java 8的兼容性最佳,这是解决问题的核心:

  • 用Homebrew安装OpenJDK 8:
    brew install openjdk@8
    
  • 配置环境变量(根据你的shell类型选择配置文件,zsh用~/.zshrc,bash用~/.bash_profile):
    echo 'export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)' >> ~/.zshrc
    echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.zshrc
    
  • 生效配置:
    source ~/.zshrc
    
  • 验证Java版本:
    java -version
    
    输出需显示openjdk version "1.8.0_xxx"

2. 确保PyArrow与Spark版本兼容

Spark 3.0.1推荐搭配PyArrow 0.17.x或2.0.0(你的当前版本2.0.0没问题,若仍有异常可尝试降级):

pip install pyarrow==0.17.1 --force-reinstall

3. 重新运行测试代码

现在再执行你的Pandas UDF代码,应该能正常运行。比如测试代码中的:

@pandas_udf("double", PandasUDFType.SCALAR)
def pandas_plus_one(v):
    return v + 1

df.withColumn('v', pandas_plus_one(df.v)).agg(count(col('v'))).show()

会正常输出count统计结果。

额外说明

Google Colab能正常运行是因为它默认使用OpenJDK 8,刚好避开了这个兼容性问题;而普通Spark UDF不依赖Arrow传输数据,所以不受影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:43:45