티스토리 뷰
Hadoop 'Unable to load native-hadoop library for your platform' 에러
드라이빙 인사이트 2019. 12. 3. 05:56HDFS 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.
Hadoop Client가 데이터 노드와 같은 호스트에 위치할 때, 데이터노드를 거치지 않고 바로 파일에서 읽을 수 있도록 도메인 소켓을 사용하는 Short Circuit Read 기능이 있다.
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를 정상적으로 사용할 수 있게 되었다. 경고 메시지 로그도 더 이상 찍히지 않는다.
- Total
- Today
- Yesterday
- monitoring
- 화분
- InterlliJ
- 베란타 텃밭
- 도커
- 파이썬
- okhttp
- hadoop
- Jekyll
- MacOS
- 깃허브
- 청양고추
- pycharm
- 상추 재배기
- linux
- 고추
- nf_conntrack
- 리눅스
- 자바
- java
- 상추
- 지킬
- 텃밭
- Python
- GitHub
- docker
- 파이참
- 화분 버리기
- 하둡
- 베란다 텃밭
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |