Spark 3.5.1与Hadoop 2.6.5正常运行但报UnsatisfiedLinkError如何解决?
解决Spark任务抛出java.lang.UnsatisfiedLinkError的问题
错误日志
2024-05-31 22:47:36.939[0;39m [32m INFO[0;39m [35m10452[0;39m [2m---[0;39m [2m[ main][0;39m [36ms.s.e.d.SQLHadoopMapReduceCommitProtocol[0;39m [2m:[0;39m Using output committer class org.apache.parquet.hadoop.ParquetOutputCommitter Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.createDirectoryWithMode0(Ljava/lang/String;I)V at org.apache.hadoop.io.nativeio.NativeIO$Windows.createDirectoryWithMode0(Native Method) at org.apache.hadoop.io.nativeio.NativeIO$Windows.createDirectoryWithMode(NativeIO.java:708) at org.apache.hadoop.fs.RawLocalFileSystem.mkOneDirWithMode(RawLocalFileSystem.java:647) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirsWithOptionalPermission(RawLocalFileSystem.java:700) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:672) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirsWithOptionalPermission(RawLocalFileSystem.java:699) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:672) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirsWithOptionalPermission(RawLocalFileSystem.java:699) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:672) at org.apache.hadoop.fs.ChecksumFileSystem.mkdirs(ChecksumFileSystem.java:788) at org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter.setupJob(FileOutputCommitter.java:356) at org.apache.spark.internal.io.HadoopMapReduceCommitProtocol.setupJob(HadoopMapReduceCommitProtocol.scala:188) at org.apache.spark.sql.execution.datasources.FileFormatWriter$.writeAndCommit(FileFormatWriter.scala:269) at org.apache.spark.sql.execution.datasources.FileFormatWriter$.executeWrite(FileFormatWriter.scala:304) at org.apache.spark.sql.execution.datasources.FileFormatWriter$.write(FileFormatWriter.scala:190) at org.apache.spark.sql.execution.datasources.InsertIntoHadoopFsRelationCommand.run(InsertIntoHadoopFsRelationCommand.scala:190) at org.apache.spark.sql.execution.command.DataWritingCommandExec.sideEffectResult$lzycompute(commands.scala:113) at org.apache.spark.sql.execution.command.DataWritingCommandExec.sideEffectResult(commands.scala:111) at org.apache.spark.sql.execution.command.DataWritingCommandExec.executeCollect(commands.scala:125) at org.apache.spark.sql.execution.QueryExecution$$anonfun$eagerlyExecuteCommands$1.$anonfun$applyOrElse$1(QueryExecution.scala:107) at org.apache.spark.sql.execution.SQLExecution$.$anonfun$withNewExecutionId$6(SQLExecution.scala:125) at org.apache.spark.sql.execution.SQLExecution$.withSQLConfPropagated(SQLExecution.scala:201) at org.apache.spark.sql.execution.SQLExecution$.$anonfun$withNewExecutionId$1(SQLExecution.scala:108) at org.apache.spark.sql.SparkSession.withActive(SparkSession.scala:900) at org.apache.spark.sql.execution.SQLExecution$.withNewExecutionId(SQLExecution.scala:66) at org.apache.spark.sql.execution.QueryExecution$$anonfun$eagerlyExecuteCommands$1.applyOrElse(QueryExecution.scala:107) at org.apache.spark.sql.execution.QueryExecution$$anonfun$eagerlyExecuteCommands$1.applyOrElse(QueryExecution.scala:98) at org.apache.spark.sql.catalyst.trees.TreeNode.$anonfun$transformDownWithPruning$1(TreeNode.scala:461) at org.apache.spark.sql.catalyst.trees.CurrentOrigin$.withOrigin(origin.scala:76) at org.apache.spark.sql.catalyst.trees.TreeNode.transformDownWithPruning(TreeNode.scala:461) at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan.org$apache$spark$sql$catalyst$plans$logical$AnalysisHelper$$super$transformDownWithPruning(LogicalPlan.scala:32) at org.apache.spark.sql.catalyst.plans.logical.AnalysisHelper.transformDownWithPruning(AnalysisHelper.scala:267) at org.apache.spark.sql.catalyst.plans.logical.AnalysisHelper.transformDownWithPruning$(AnalysisHelper.scala:263) at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan.transformDownWithPruning(LogicalPlan.scala:32) at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan.transformDownWithPruning(LogicalPlan.scala:32) at org.apache.spark.sql.catalyst.trees.TreeNode.transformDown(TreeNode.scala:437) at org.apache.spark.sql.execution.QueryExecution.eagerlyExecuteCommands(QueryExecution.scala:98) at org.apache.spark.sql.execution.QueryExecution.commandExecuted$lzycompute(QueryExecution.scala:85) at org.apache.spark.sql.execution.QueryExecution.commandExecuted(QueryExecution.scala:83) at org.apache.spark.sql.execution.QueryExecution.assertCommandExecuted(QueryExecution.scala:142) at org.apache.spark.sql.DataFrameWriter.runCommand(DataFrameWriter.scala:859) at org.apache.spark.sql.DataFrameWriter.saveToV1Source(DataFrameWriter.scala:388) at org.apache.spark.sql.DataFrameWriter.saveInternal(DataFrameWriter.scala:361) at org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:240) at org.apache.spark.sql.DataFrameWriter.parquet(DataFrameWriter.scala:792) at com.example.dubaiscala.spark.Sparktest.executeSparkJob2(Sparktest.java:50) at com.example.dubaiscala.spark.Sparktest.run(Sparktest.java:23) at com.example.dubaiscala.DubaiPolicawithscalaApplication.main(DubaiPolicawithscalaApplication.java:20)
问题原因
该错误源于Hadoop在Windows环境下无法加载对应版本的Native本地库(如winutils.exe、hadoop.dll),导致调用本地方法createDirectoryWithMode0失败,本质是Hadoop Native组件缺失或版本不兼容。
解决办法
1. 安装匹配版本的Hadoop Windows本地库
- 下载与Hadoop 2.6.5完全匹配的Windows本地库文件(包含winutils.exe和hadoop.dll)
- 将这两个文件放到Hadoop安装目录的
bin文件夹下
2. 配置系统环境变量
- 新增系统环境变量
HADOOP_HOME,值为你的Hadoop安装根目录 - 在系统
Path变量中添加%HADOOP_HOME%\bin - 重启命令行或开发工具,确保环境变量生效
3. 禁用Hadoop Native IO(临时快速修复)
若暂时无法配置本地库,可在Spark任务中强制禁用Native IO:
- 在SparkSession初始化时添加配置:
SparkSession spark = SparkSession.builder() .appName("YourAppName") .master("spark://your-master:7077") .config("spark.hadoop.hadoop.native.lib", "false") .config("spark.hadoop.io.native.lib.available", "false") .getOrCreate();
- 或在Spark的
spark-defaults.conf文件中添加全局配置:
spark.hadoop.hadoop.native.lib false spark.hadoop.io.native.lib.available false
4. 检查目录权限
确保运行Spark任务的用户对输出目录拥有读写权限,权限不足也可能触发该错误。
5. 验证Native库配置
运行Hadoop命令检查Native库加载状态:
hadoop checknative
若输出中大部分组件显示false,说明本地库未正确配置,需重新检查步骤1-2。
内容的提问来源于stack exchange,提问作者more_doubt
相关产品推荐
相关产品推荐

