windows本地運行mapreduce任務報org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z

本地運行mapreduce

前提

windows下編譯過的hadoop包,配置HADOOP_HOME環境變量、JAVA_HOME環境變量。

問題

在windows安裝hadoop後(也就是將Hadoop重新編譯後、配置HADOOP_HOME環境變量、JAVA_HOME環境變量後)運行mapreduce任務出現

Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z

完整報錯如下:

2020-05-03 23:13:18,617 INFO [org.apache.hadoop.mapreduce.JobSubmitter] - Cleaning up the staging area file:/tmp/hadoop-Ace/mapred/staging/ace1398509218/.staging/job_local1398509218_0001
Exception in thread "main" 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:609)
	at org.apache.hadoop.fs.FileUtil.canRead(FileUtil.java:977)
	at org.apache.hadoop.util.DiskChecker.checkAccessByFileMethods(DiskChecker.java:187)
	at org.apache.hadoop.util.DiskChecker.checkDirAccess(DiskChecker.java:174)
	at org.apache.hadoop.util.DiskChecker.checkDir(DiskChecker.java:108)
	at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.confChanged(LocalDirAllocator.java:285)
	at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.getLocalPathForWrite(LocalDirAllocator.java:344)
	at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:150)
	at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:131)
	at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:115)
	at org.apache.hadoop.mapred.LocalDistributedCacheManager.setup(LocalDistributedCacheManager.java:125)
	at org.apache.hadoop.mapred.LocalJobRunner$Job.<init>(LocalJobRunner.java:163)
	at org.apache.hadoop.mapred.LocalJobRunner.submitJob(LocalJobRunner.java:731)
	at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:240)
	at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1290)
	at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1287)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:422)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657)
	at org.apache.hadoop.mapreduce.Job.submit(Job.java:1287)
	at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1308)
	at WordCountDriver.main(WordCountDriver.java:44)

查了許多資料無非是兩個問題

  1. windows版本問題,比如是家庭版(家庭版少了許多功能,比如hyper-v等)
  2. hadoop包版本問題,這種情況比較少

解決

由於我不想在電腦中防止過多雜文件,於是採用將報錯點過濾,類似於測試階段使用Mock將一些功能模擬出來

創建org/apache/hadoop/io/nativeio

在這裏插入圖片描述

在該包下創建NativeIO覆蓋jar包中的NativeIO,也就是找到hadoop jar包中的NativeIO,並全部複製到剛創建的NativeIO.java

在這裏插入圖片描述

修改access這個地方,直接返回true

在這裏插入圖片描述


使用Mock也可以做到此作用,並且Mock更加規範,這裏就不詳細說明

接着就可以運行本地mapreduce任務了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章