[Trouble Shooting] Hadoop 외부라이브러리 import하는 법 (부제: NoClassDefFoundError)

DonaDona·2023년 6월 4일
0

문제 상황

Hadoop 프로젝트의 Map-Reduce 과정에서 외부라이브러리를 사용해야했으나, 빌드 후 생성된 Jar파일을 실행시키면 NoClassDefFoundError가 발생하는 상황
나의 경우 외부라이브러리는 형태소 분석기 Komoran이었다.

문제 해결 - 외부 라이브러리 경로 지정 + jar 실행 시 패키지명 병기

외부라이브러리가 위치해야하는 곳이 따로 있다고 한다. 해당 위치에 놓는 것만으로는 안되고, 외부라이브러리 경로(HADOOP_CLASSPATH)를 지정해주어야한다고.

vi $HADOOP_HOME/etc/hadoop/hadoop-env.sh

# 특정 폴더 안에 모든 jar파일을 참조할 수 있도록 외부 라이브러리 경로 지정
# hadoop-env.sh 파일에 다음을 적고 저장한다.
export HADOOP_CLASSPATH=$(find $HADOOP_HOME/share/hadoop -name '*.jar' | xargs echo | tr ' ' ':')

또한 Jar파일을 실행시키기 위해서 해당 파일의 클래스 명을 함께 적어주어야한다.
나의 경우 com.test.study.haddop.WordCount가 이에 해당한다.

hadoop jar hadoop.jar com.test.study.hadoop.WordCount test test_out

참고링크

이외 해결되지는 않았지만 NoClassDefFoundError에 한 시도와 관련 링크 모음

  1. build 후 생기는 out 폴더 삭제 후 재빌드 링크
  2. build.gradle 수정1 링크
jar {
    manifest {
        attributes 'Main-Class': '메인클래스'
    }
    from configurations.runtime.collect { zipTree(it) }
}
  1. build.gradle 수정2 링크
jar {
    archiveName = 'Name.jar'

    manifest {
        attributes 'Main-Class': 'your.main.class',
                'Class-Path': configurations.runtime.files.collect { "lib/$it.name" }.join(' '),
                'Implementation-Version': project.version
    }

    from(configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }) {}
}
  1. IDE Project Structure 수정 - 링크 누락

  2. Project Structure - Artifacts - Output Layout - Available Elements 수정 - 링크 누락

  3. build.gradle 수정3 링크

  4. 그외 기타

profile
기록용 공부용 개발 블로그

0개의 댓글