Spark & Scala调用saveAsTextFile()抛出UnsatisfiedLinkError异常求助
Hey there! I see you're new to Spark & Scala and hitting a frustrating error when trying to save your word count results. Let's break this down and fix it.
问题原因
那个java.lang.UnsatisfiedLinkError是Windows环境下Spark常见的坑——Hadoop的Windows本地原生库缺失或未正确配置。Spark依赖Hadoop的文件系统API来读写本地文件,而Windows需要对应的winutils.exe和hadoop.dll文件才能让这些API正常工作,缺失它们就会抛出这个链接错误。
具体解决方案
这里有几个清晰的步骤帮你搞定:
下载对应版本的Hadoop Windows原生库
你用的是Spark 2.3.0,对应的Hadoop版本通常是2.7.x,所以要找适配hadoop-2.7.x的Windows工具包。核心需要两个文件:winutils.exehadoop.dll
把它们放到一个专门的文件夹里,比如C:\hadoop\bin(先手动创建这个目录)。
配置系统环境变量
- 新建系统环境变量
HADOOP_HOME,值设为C:\hadoop(注意是文件夹根路径,不要加\bin) - 编辑
PATH环境变量,添加%HADOOP_HOME%\bin到列表中
- 新建系统环境变量
重启终端和spark-shell
环境变量需要重启终端才会生效,关掉当前的CMD窗口,重新打开后再启动spark-shell。(可选)临时配置(无需修改系统环境变量)
如果不想改动系统环境变量,你可以在启动spark-shell时直接指定参数:spark-shell --conf spark.hadoop.hadoop.home.dir=C:\hadoop或者在spark-shell里先执行这段代码(要在调用
saveAsTextFile()之前):System.setProperty("hadoop.home.dir", "C:\\hadoop")额外注意:输出目录不能提前存在
Spark的saveAsTextFile()要求目标目录不存在,如果你的output文件夹已经在当前路径下,先手动删除它再运行代码,不然会触发另一个错误。
验证你的代码
顺便说一句,你的wordcount代码本身是完全正确的,没有逻辑问题,只要环境配置到位,就能正常输出统计结果啦。
内容的提问来源于stack exchange,提问作者Nhan Tran

