Spark运行出现java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljav

博主在尝试运行Spark本地模式的WordCount Demo时遇到问题,通过放置hadoop.ddl和winutils.exe文件,修改源码以及更新Java版本,最终解决了本地运行的问题。然而,当尝试使用spark-submit提交作业时,又遇到新的错误。经过排查,发现是由于使用了32位Java,而博主的系统为64位。升级到64位Java后,问题得到解决。博客强调了版本匹配和实践的重要性。

最近下载了下spak,跑个hello word小Demo,准备如下门,使用的是local方式的,在idea中跑wordcount,就出现了上述问题。按照网上说的,hadoop.ddlwinutils.exe都放到hadoop的bin下面了,而且还放到了C:/window/system32,满心欢喜的运行例子,发现还是出现上述问题,我懵了,后来看大家提供的需要把nativeIo那个类源码的access0方法变成returen true,我也照做了,好消息是终于成功了,开心!!!

后来我准备试下spark-submit提交,发现又出现问题了,我在想可能是我编译的例子有问题,那我就用spark-shell直接在终端写demo,发现到了RDD操作的时候,就出现上述问题,我崩溃了。。。
这个问题不解决,总感觉恶心的慌,我想是不是版本问题,我的spark是3.1.1,scala版本是2.12.10,hadoop是3.2,我看了下官网说的符合要求,后来怀疑haoop.ddl和winutils.exe是不是不符合我的hadoop版本,网上找了下,这俩包最新的是3.1,凑合用吧,再次满怀心情运行,发现还是出现问题。。。
后来几经崩溃下,发现网上的一篇,说是hadoop.ddl没有就是为了没有编译,System.load("D://hadoop.ddl"),发现说是java版本问题,重装了下Java,终于完美解决!

之前的java版本是32位的,但是我的机器是64位的
java 版本
后来重装了个64位java
在这里插入图片描述

实践是检验真理的唯一标准!

Exception in thread "main" java.lang.UnsatisfiedLinkError: 'boolean org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(java.lang.String, int)' at org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Native Method) at org.apache.hadoop.io.nativeio.NativeIO$Windows.access(NativeIO.java:645) at org.apache.hadoop.fs.FileUtil.canRead(FileUtil.java:1230) at org.apache.hadoop.fs.FileUtil.list(FileUtil.java:1435) at org.apache.hadoop.fs.RawLocalFileSystem.listStatus(RawLocalFileSystem.java:493) at org.apache.hadoop.fs.FileSystem.listStatus(FileSystem.java:1868) at org.apache.hadoop.fs.FileSystem.listStatus(FileSystem.java:1910) at org.apache.hadoop.fs.FileSystem$4.<init>(FileSystem.java:2072) at org.apache.hadoop.fs.FileSystem.listLocatedStatus(FileSystem.java:2071) at org.apache.hadoop.fs.ChecksumFileSystem.listLocatedStatus(ChecksumFileSystem.java:700) at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.singleThreadedListStatus(FileInputFormat.java:312) at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.listStatus(FileInputFormat.java:274) at org.apache.spark.input.WholeTextFileInputFormat.setMinPartitions(WholeTextFileInputFormat.scala:52) at org.apache.spark.rdd.WholeTextFileRDD.getPartitions(WholeTextFileRDD.scala:54) at org.apache.spark.rdd.RDD.$anonfun$partitions$2(RDD.scala:276) at scala.Option.getOrElse(Option.scala:189) at org.apache.spark.rdd.RDD.partitions(RDD.scala:272) at org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:49) at org.apache.spark.rdd.RDD.$anonfun$partitions$2(RDD.scala:276) at scala.Option.getOrElse(Option.scala:189) at org.apache.spark.rdd.RDD.partitions(RDD.scala:272) at org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:49) at org.apache.spark.rdd.RDD.$anonfun$partitions$2(RDD.scala:276) at scala.Option.getOrElse(Option.scala:189) at org.apache.spark.rdd.RDD.partitions(RDD.scala:272) at org.apache.spark.rdd.RDD.getNumPartitions(RDD.scala:292) at com.s
04-23
E:\anaconda3\anaconda\python.exe G:/dashuju/zshixun/daima/ider_daima/lyh_git/offline-pyspark/gmall_product/new1.py Setting default log level to "WARN". To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel). 25/07/31 10:36:21 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable Traceback (most recent call last): File "G:\dashuju\zshixun\daima\ider_daima\lyh_git\offline-pyspark\gmall_product\new1.py", line 39, in <module> .parquet(mock_data_path) \ ^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\86158\AppData\Roaming\Python\Python312\site-packages\pyspark\sql\readwriter.py", line 544, in parquet return self._df(self._jreader.parquet(_to_seq(self._spark._sc, paths))) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\86158\AppData\Roaming\Python\Python312\site-packages\py4j\java_gateway.py", line 1322, in __call__ return_value = get_return_value( ^^^^^^^^^^^^^^^^^ File "C:\Users\86158\AppData\Roaming\Python\Python312\site-packages\pyspark\errors\exceptions\captured.py", line 179, in deco return f(*a, **kw) ^^^^^^^^^^^ File "C:\Users\86158\AppData\Roaming\Python\Python312\site-packages\py4j\protocol.py", line 326, in get_return_value raise Py4JJavaError( py4j.protocol.Py4JJavaError: An error occurred while calling o37.parquet. : java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z at org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Native Method) at org.apache.hadoop.io.nativeio.NativeIO$Windows.access(NativeIO.java:793) at org.apache.hadoop.fs.FileUtil.canRead(FileUtil.java:1249) at org.apache.hadoop.fs.FileUtil.list(FileUtil.java:1454) at org.apache.hadoop.fs.RawLocalFileSystem.listStatus(RawLocalFileSystem.java:601) at org.apache.hadoop.fs.FileSystem.listStatus(FileSystem.java:1972) at org.apache.hadoop.fs.FileSystem.listStatus(FileSystem.java:2014) at org.apache.hadoop.fs.ChecksumFileSystem.listStatus(ChecksumFileSystem.java:761) at org.apache.spark.util.HadoopFSUtils$.listLeafFiles(HadoopFSUtils.scala:180) at org.apache.spark.util.HadoopFSUtils$.$anonfun$parallelListLeafFilesInternal$1(HadoopFSUtils.scala:95) at scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:286) at scala.collection.mutable.ResizableArray.foreach(ResizableArray.scala:62) at scala.collection.mutable.ResizableArray.foreach$(ResizableArray.scala:55) at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:49) at scala.collection.TraversableLike.map(TraversableLike.scala:286) at scala.collection.TraversableLike.map$(TraversableLike.scala:279) at scala.collection.AbstractTraversable.map(Traversable.scala:108) at org.apache.spark.util.HadoopFSUtils$.parallelListLeafFilesInternal(HadoopFSUtils.scala:85) at org.apache.spark.util.HadoopFSUtils$.parallelListLeafFiles(HadoopFSUtils.scala:69) at org.apache.spark.sql.execution.datasources.InMemoryFileIndex$.bulkListLeafFiles(InMemoryFileIndex.scala:162) at org.apache.spark.sql.execution.datasources.InMemoryFileIndex.listLeafFiles(InMemoryFileIndex.scala:133) at org.apache.spark.sql.execution.datasources.InMemoryFileIndex.refresh0(InMemoryFileIndex.scala:96) at org.apache.spark.sql.execution.datasources.InMemoryFileIndex.<init>(InMemoryFileIndex.scala:68) at org.apache.spark.sql.execution.datasources.DataSource.createInMemoryFileIndex(DataSource.scala:539) at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:405) at org.apache.spark.sql.DataFrameReader.loadV1Source(DataFrameReader.scala:229) at org.apache.spark.sql.DataFrameReader.$anonfun$load$2(DataFrameReader.scala:211) at scala.Option.getOrElse(Option.scala:189) at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:211) at org.apache.spark.sql.DataFrameReader.parquet(DataFrameReader.scala:563) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244) at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:374) at py4j.Gateway.invoke(Gateway.java:282) at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132) at py4j.commands.CallCommand.execute(CallCommand.java:79) at py4j.ClientServerConnection.waitForCommands(ClientServerConnection.java:182) at py4j.ClientServerConnection.run(ClientServerConnection.java:106) at java.lang.Thread.run(Thread.java:748) 怎么解决
最新发布
08-01
### Java中与Hadoop相关的UnsatisfiedLinkError错误解决方案 `java.lang.UnsatisfiedLinkError` 是由于尝试调用本地方法时出现问题而引发的异常。当涉及 `org.apache.hadoop.io.nativeio.NativeIO$Windows.access0` 方法时,通常是因为缺少必要的本地库文件或配置不当引起的。 #### 1. 缺少核心配置文件 如果没有成功加载 `core-site.xml` 文件,则可能导致无法正确连接到远程 HDFS 集群[^2]。可以通过以下方式验证并修复: - 使用 `FileSystem fs = FileSystem.get(conf); System.out.println(fs.getHomeDirectory());` 来确认当前使用的默认文件系统是否为预期的目标 HDFS 地址。 - 如果发现未指定目标地址,需确保在项目中的资源目录下存在有效的 `core-site.xml` 文件,并且其中定义了正确的属性: ```xml <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://<namenode-host>:8020</value> </property> </configuration> ``` #### 2. 缺失hadop.dll文件 对于 Windows 平台而言,Apache Hadoop 默认并不提供预编译好的二进制支持包。因此需要手动安装额外的支持工具来满足依赖关系[^3]。 ##### 下载winutils.exe及其配套组件 访问官方仓库或其他可信源获取最新的 winutils 工具集,例如 GitHub 上由 steveloughran 维护的镜像站点 (https://github.com/steveloughran/winutils)[^3]。 ##### 安装步骤 1. **解压**:将下载得到的压缩包展开至任意位置,比如 `C:\hadoop\bin`. 2. **设定环境变量** - 创建新的全局变量名为 `HADOOP_HOME`, 值设为目标路径 (`C:\hadoop`); - 修改现有的 PATH 列表,在其开头追加 `%HADOOP_HOME%\bin`; 3. **校验设置有效性**: 打开命令提示符窗口输入 `echo %HADOOP_HOME%`, 应返回先前所指派的位置字符串. 另外还需特别注意的是要把实际提取出来的动态链接库拷贝一份放置于操作系统标准搜索范围内, 即复制 `hadoop.dll` 至 `C:\Windows\System32`. #### 3. 版本兼容性问题 尽管理论上讲只要遵循上述指导即可解决问题,但在实践中仍有可能遇到因不同版本间差异而导致的新障碍。建议始终选用相互匹配的一致组合以减少不必要的麻烦[^4]: - 确认正在运行的应用程序框架以及底层支撑服务均采用相同的大版本号序列; - 对比文档说明仔细核对各项参数取值范围及语法结构变化; ```python from subprocess import Popen, PIPE def check_hadoop_version(): process = Popen(['hadoop', 'version'], stdout=PIPE, stderr=PIPE) output, _ = process.communicate() return output.decode('utf-8').strip() print(check_hadoop_version()) ``` 通过这段简单的 Python 脚本可以帮助快速了解目前环境中部署的具体发行版详情。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值