본문 바로가기
카테고리 없음

Hadoop 'Unable to load native-hadoop library for your platform' 에러

by 꼬마낙타 2020. 3. 14.
반응형

HDFS 코드리뷰를 하면서 'Short Circuit Read' 코드를 테스트하기 위해서 도커 컨테이너에 환경 설정을 하고 리모트 디버거로 붙어서 보다가 다음과 같은 로그가 찍혀있는걸 보게되었습니다.

HDFS Short Circuit Read 코드 테스트를 위해서 도커에 컨테이너 세팅을 하고 원격 디버거로 붙어서 보다가 Short Circuit Read 설정으로 안들어가서 찾아보니 로그에 다음과 같은 내용이 찍혀 있었다.

19/12/02 20:46:04 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
19/12/02 20:46:05 WARN shortcircuit.DomainSocketFactory: The short-circuit local reads feature cannot be used because libhadoop cannot be loaded.

이런 로그가 찍히면서 Short Circuit Read 코드로 안들어가고 있었습니다.

Short Circuit Read는 Hadoop Client가 데이터 노드와 같은 호스트에 위치할 때, 데이터 노드의 여러 레이어를 거치지 않고 클라이언트가 바로 로컬 파일을 읽을 수 있도록 도메인 소켓을 통해서 FD를 전달해주는 기능입니다.

Short Circuit Read 기능을 사용하기 위해서는 도메인 소켓을 사용해야하는데, HDFS 코드 중에

if (DomainSocket.getLoadingFailureReason() != null) {
    return PathInfo.NOT_CONFIGURED;
}

위와 같은 부분이 있습니다.

'DomainSocket.getLoadingFailureReason()' 메소드에서 "libhadoop cannot be loaded"라는 문자열이 리턴되고 있어 Short Circuit Read 기능이 제대로 동작하지 않고 있었습니다. 결과적으로는 데이터 노드를 거쳐서 정상적으로 읽어오긴 하지만 ShortCircuitRead를 사용할 수 있음에도 불필요하게 데이터 노드를 거치는 오버헤드가 생겼습니다.

해결방법

해결방법은 간단하게 libhadoop을 찾도록 해주면 됩니다.

libhadoop.so 파일은 $HADOOP_HOME/lib/native 디렉토리에 위치하고 있는데요. 따라서 이 경로를 자바 프로그램 구동시 참조할 수 있게 해주면 됩니다. LD_LIBRARY_PATH 환경 변수에 $HADOOP_HOME/lib/native 경로를 추가해주면 됩니다.

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HADOOP_HOME/lib/native

.bashrc 파일과 hadoop-env.sh 파일에 추가해주시기 바랍니다. 이제 다시 프로그램을 구동하면 ShortCircuit Read를 정상적으로 사용할 수 있게 되엇으며, 경고 메시지 로그도 더 이상 찍히지 않습니다.

반응형

댓글