PySpark使用snappy压缩CSV/JSON文件报错,无压缩时正常如何修复?
问题根因
报错的核心原因是Snappy压缩的原生本地库加载失败,错误栈最底层的java.lang.UnsatisfiedLinkError已经明确说明JVM无法调用snappy对应的原生压缩方法,该问题和业务数据、CSV写入逻辑无关,因此你去掉压缩配置后写入逻辑可以正常运行。
可落地的修复方案
方案一:替换为无原生依赖的压缩算法
直接修改写入配置,将snappy替换为gzip或deflate,这两类压缩算法为纯Java实现,不需要依赖系统原生库,代码修改量最小,示例如下:df.write.format('csv').option("compression","gzip").option('header','true').save('R')方案二:安装对应系统的Snappy原生依赖
确保Spark运行环境的所有节点都安装Snappy原生库:- Linux环境:CentOS执行
yum install snappy,Ubuntu执行apt install libsnappy1v5 libsnappy-java - Windows环境:下载对应版本的
snappy-java.dll放到JDK的bin目录,或添加到系统PATH路径中
- Linux环境:CentOS执行
方案三:使用带全平台原生库的Snappy依赖
启动PySpark任务时添加指定版本的snappy-java依赖包,该版本内置了各平台的原生库,无需单独安装系统依赖:pyspark --packages org.xerial.snappy:snappy-java:1.1.8.4如果是提交任务,对应将该依赖添加到
spark.jars.packages配置项中即可。方案四:开启Snappy纯Java回退模式
提交任务时添加JVM启动参数,强制使用snappy的纯Java实现,不需要加载本地原生库:spark-submit --conf spark.driver.extraJavaOptions="-Dorg.xerial.snappy.use.system.libpath=false" --conf spark.executor.extraJavaOptions="-Dorg.xerial.snappy.use.system.libpath=false" 你的任务脚本.py
内容的提问来源于stack exchange,提问作者Techie Baba
相关产品推荐
相关产品推荐

