Hadoop 디버깅: Exception in thread "main"java.lang.UnsatisfiedLinkError

10732 단어 hadoop디버깅
  • 이상 완전한 설명
  • Exception in thread "main" java.lang.UnsatisfiedLinkError:org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
  • 이상 추적 정보는 다음과 같다
  • 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:980)
        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:314)
        at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.getLocalPathForWrite(LocalDirAllocator.java:377)
        at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:151)
        at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:132)
        at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:116)
        at org.apache.hadoop.mapred.LocalDistributedCacheManager.setup(LocalDistributedCacheManager.java:125)
        at org.apache.hadoop.mapred.LocalJobRunner$Job.(LocalJobRunner.java:171)
        at org.apache.hadoop.mapred.LocalJobRunner.submitJob(LocalJobRunner.java:758)
        at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:244)
        at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1307)
        at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1304)
        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:1920)
        at org.apache.hadoop.mapreduce.Job.submit(Job.java:1304)
        at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1325)
        ……
  • 이 이상은 윈도우즈 환경에서hadoop 로컬 디버깅을 하는 장면에서 흔히 볼 수 있다

  • 추적 정보를 통해 문제의 발생원을 찾을 수 있는 것은 Native IO 때문이다.java: 609의 access 오류, 코드는 다음과 같습니다.
     /**
         * Checks whether the current process has desired access rights on
         * the given path.
         * 
         * Longer term this native function can be substituted with JDK7
         * function Files#isReadable, isWritable, isExecutable.
         *
         * @param path input path
         * @param desiredAccess ACCESS_READ, ACCESS_WRITE or ACCESS_EXECUTE
         * @return true if access is allowed
         * @throws IOException I/O exception on error
         */
        public static boolean access(String path, AccessRight desiredAccess)
            throws IOException {
          return access0(path, desiredAccess.accessRight());
        }

    시스템 내부를 통해 조작 권한이 있는지 판단하는 판단 기능을 알 수 있다. 윈도우즈 자체의 권한 설정으로 인해 이 방법은 자주 이상을 던진다.
    .해결 방법 1: 임시 테스트에서 원본 코드를 수정합니다
    NativeIO의 원본 코드를 찾아 테스트 프로젝트에서 같은 경로 파일을 만들고 모든 코드를 복사하며access 방법을 다음과 같이 수정합니다.
       public static boolean access(String path, AccessRight desiredAccess)
            throws IOException {
            return true;
          //return access0(path, desiredAccess.accessRight());
        }

    항상 허용 설정을 통해 이 문제를 건너뛰십시오.
  • 해결 방법 2: 원격 linux 집단을 사용하여 디버깅을 협조합니다

  • 문제의 발생원은 윈도우즈의 관계이기 때문에 원격 linux 환경에서의 (또는 설정된 윈도우즈 환경) hadoop 집단을 빌려 원격 디버깅을 하면 된다.해결 방법은 원격 환경의hadoop 프로필 (아래) 을 디버깅 프로젝트의 환경 변수에 추가하는 것입니다.
  • core-site.xml
  • hdfs-site.xml
  • yarn-site.xml(비퀘스트 디버깅 없음)
  • mapred-site.xml(일반적으로 없음)
  • 좋은 웹페이지 즐겨찾기