Spark创建表遇UnsatisfiedLinkError错误求助(Windows环境)
问题描述
Windows环境下使用Apache Spark 3.3.0/3.3.1创建表时,触发以下错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
已执行以下操作但问题未解决:
- 下载对应版本的
hadoop.dll与winutils.exe - 配置
HADOOP_HOME、SPARK_HOME环境变量并添加至系统Path - 将上述文件放入
system32文件夹 - 重启电脑
怀疑问题由工作电脑安全设置导致,项目的sbt配置如下:
name := "Simple Project" version := "1.0" scalaVersion := "2.12.15" libraryDependencies ++= Seq("org.apache.spark" %% "spark-sql" % "3.3.1", "io.delta" %% "delta-core" % "2.1.1")
排查与解决办法
针对安全设置和其他可能的原因,试试下面这些操作:
1. 让安全软件放行相关文件
- 把
hadoop.dll和winutils.exe所在目录(包括system32和HADOOP_HOME/bin)添加到安全软件的信任列表,避免文件被拦截或篡改 - 临时关闭实时防护(需确认符合公司安全规定),测试是否能正常运行
2. 检查文件权限与完整性
- 右键点击
hadoop.dll和winutils.exe,选择「属性」→「安全」,确保当前用户拥有读取和执行权限 - 重新下载对应Hadoop版本的文件(Spark 3.3.x对应Hadoop 3.3.x版本),校验文件MD5值,避免下载损坏的文件
3. 强制指定Native库路径
在Spark代码中添加以下配置,直接指定hadoop.dll的路径,绕过系统环境变量的可能异常:
System.setProperty("java.library.path", "C:\\your\\hadoop\\bin\\path") // 替换为你的HADOOP_HOME/bin实际路径 val sysPaths = sys.props("java.library.path").split(";") val loader = classOf[org.apache.hadoop.io.nativeio.NativeIO].getClassLoader sysPaths.foreach(path => loader.asInstanceOf[java.net.URLClassLoader].addURL(new java.io.File(path).toURI.toURL))
4. 调整Spark的Hadoop依赖版本
修改sbt配置,指定与Spark兼容的Hadoop版本,避免依赖冲突:
libraryDependencies ++= Seq( "org.apache.spark" %% "spark-sql" % "3.3.1" exclude("org.apache.hadoop", "hadoop-client"), "org.apache.hadoop" % "hadoop-client" % "3.3.4", // 选择与Spark匹配的Hadoop版本 "io.delta" %% "delta-core" % "2.1.1" )
5. 使用无Native依赖的模式
如果上述方法都无效,可强制Spark使用非Native的Hadoop实现,在代码中添加:
spark.conf.set("spark.hadoop.fs.file.impl", "org.apache.hadoop.fs.LocalFileSystem") spark.conf.set("spark.hadoop.io.native.lib.available", "false")
内容的提问来源于stack exchange,提问作者MystCabe
相关产品推荐
相关产品推荐

