네이티브 라이브러리 가이드

네이티브 라이브러리 가이드 (Native Libraries Guide)

이 가이드는 네이티브 Hadoop 라이브러리와 네이티브 공유 라이브러리에 대한 간단한 설명을 담고 있습니다.

출처: Native Libraries Guide

참고: 환경에 따라 "네이티브 라이브러리(native libraries)"는 컴파일해야 하는 모든 *.so를 의미할 수 있고, "네이티브 압축(native compression)"은 압축과 관련된 컴파일 대상 *.so만 가리킬 수 있습니다. 다만 현재 이 문서는 네이티브 Hadoop 라이브러리(libhadoop.so)만 다룹니다. libhdfs 라이브러리(libhdfs.so) 문서는 여기를 참고하세요.

네이티브 Hadoop 라이브러리

Hadoop은 성능을 위해, 그리고 Java 구현이 없어서 특정 구성요소의 네이티브 구현을 제공합니다. 이 구성요소들은 하나의 동적 링크 네이티브 라이브러리인 "네이티브 hadoop 라이브러리"로 제공됩니다. *nix 플랫폼에서 이 라이브러리는 libhadoop.so라는 이름입니다.

사용법 (Usage)

네이티브 hadoop 라이브러리 사용은 꽤 쉽습니다.

  • 구성요소(Components)를 검토합니다.
  • 지원 플랫폼을 검토합니다.
  • 미리 빌드된 네이티브 hadoop 라이브러리를 포함한 hadoop 릴리스를 다운로드하거나, 직접 빌드합니다. 다운로드하든 빌드하든 라이브러리 이름은 동일합니다: libhadoop.so
  • 압축 코덱 개발 패키지(zlib-1.2, gzip-1.2 이상)를 설치합니다:
    • 라이브러리를 다운로드했다면, 배포에서 사용하려는 압축 코덱에 해당하는 개발 패키지를 하나 이상 설치합니다.
    • 라이브러리를 빌드한다면 두 개발 패키지를 모두 설치해야 합니다.
  • 런타임 로그 파일을 확인합니다.

구성요소 (Components)

네이티브 hadoop 라이브러리는 다양한 구성요소를 포함합니다.

  • 압축 코덱(Compression Codecs): bzip2, lz4, zlib
  • HDFS Short-Circuit Local Reads 및 HDFS 중앙 캐시 관리(Centralized Cache Management)용 네이티브 IO 유틸리티
  • CRC32 체크섬 구현

지원 플랫폼 (Supported Platforms)

네이티브 hadoop 라이브러리는 *nix 플랫폼에서만 지원됩니다. 이 라이브러리는 Cygwin이나 Mac OS X 플랫폼에서는 동작하지 않습니다.

네이티브 hadoop 라이브러리는 주로 GNU/Linux 플랫폼에서 사용되며 다음 배포판에서 테스트되었습니다.

  • RHEL4/Fedora
  • Ubuntu
  • Gentoo

위의 모든 배포판에서 32/64 비트 네이티브 hadoop 라이브러리는 해당 32/64 비트 jvm과 함께 동작합니다.

다운로드 (Download)

미리 빌드된 32비트 i386-Linux 네이티브 hadoop 라이브러리는 hadoop 배포판의 일부로, lib/native 디렉터리에서 구할 수 있습니다. hadoop 배포판은 Hadoop Common Releases에서 다운로드할 수 있습니다.

배포에서 사용하려는 압축 코덱에 맞춰 zlib 및/또는 gzip 개발 패키지를 반드시 설치하세요.

빌드 (Build)

네이티브 hadoop 라이브러리는 ANSI C로 작성되었으며 GNU autotools-체인(autoconf, autoheader, automake, autoscan, libtool)으로 빌드됩니다. 즉 표준을 준수하는 C 컴파일러와 GNU autotools-체인이 있는 모든 플랫폼에서 쉽게 빌드할 수 있습니다(지원 플랫폼 참고).

대상 플랫폼에 설치해야 할 패키지는 다음과 같습니다.

  • C 컴파일러 (예: GNU C Compiler)
  • GNU Autools Chain: autoconf, automake, libtool
  • zlib-development 패키지 (안정 버전 >= 1.2.0)
  • openssl-development 패키지 (예: libssl-dev)

필수 패키지를 설치한 후 표준 hadoop pom.xml 파일에 native 플래그를 전달해 네이티브 hadoop 라이브러리를 빌드합니다:

$ mvn package -Pdist,native -DskipTests -Dtar

새로 빌드된 라이브러리는 다음 위치에서 확인할 수 있습니다:

$ hadoop-dist/target/hadoop-3.5.0/lib/native

다음 사항을 유의하세요.

  • 네이티브 hadoop 라이브러리를 빌드하려면 대상 플랫폼에 zlib와 gzip 개발 패키지를 모두 설치해야 합니다. 다만 배포의 경우 코덱 하나만 사용한다면 패키지 하나만 설치해도 충분합니다.
  • 빌드와 배포를 위해 대상 플랫폼의 32/64 비트 jvm에 맞는 올바른 zlib용 32/64 라이브러리가 필요합니다.

런타임 (Runtime)

bin/hadoop 스크립트는 시스템 속성 -Djava.library.path=<path>를 통해 네이티브 hadoop 라이브러리가 라이브러리 경로에 있도록 보장합니다.

런타임 동안 MapReduce 태스크의 hadoop 로그 파일을 확인하세요.

  • 모두 정상이면: DEBUG util.NativeCodeLoader - Trying to load the custom-built native-hadoop library... INFO util.NativeCodeLoader - Loaded the native-hadoop library
  • 문제가 있으면: WARN util.NativeCodeLoader - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

확인 (Check)

NativeLibraryChecker는 네이티브 라이브러리가 올바르게 로드됐는지 확인하는 도구입니다. 다음과 같이 실행할 수 있습니다.

$ hadoop checknative -a
   14/12/06 01:30:45 WARN bzip2.Bzip2Factory: Failed to load/initialize native-bzip2 library system-native, will use pure-Java version
   14/12/06 01:30:45 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
   Native library checking:
   hadoop: true /home/ozawa/hadoop/lib/native/libhadoop.so.1.0.0
   zlib:   true /lib/x86_64-linux-gnu/libz.so.1
   zstd: true /usr/lib/libzstd.so.1
   lz4:    true revision:99
   bzip2:  false

네이티브 공유 라이브러리 (Native Shared Libraries)

DistributedCache를 사용해 라이브러리 파일을 배포하고 심볼릭 링크하면 어떤 네이티브 공유 라이브러리든 로드할 수 있습니다.

이 예시는 Unix 계열 시스템에서 공유 라이브러리 mylib.so를 배포하고 MapReduce 태스크에서 로드하는 방법을 보여줍니다.

  • 먼저 라이브러리를 HDFS에 복사합니다: bin/hadoop fs -copyFromLocal libmyexample.so.1 /libraries/libmyexample.so.1
  • 작업 실행 프로그램은 다음을 포함해야 합니다: DistributedCache.createSymlink(conf); DistributedCache.addCacheFile("hdfs://host:port/libraries/libmyexample.so.1#libmyexample.so", conf);
  • MapReduce 태스크는 다음을 포함할 수 있습니다: System.loadLibrary("myexample");

참고: 네이티브 hadoop 라이브러리를 다운로드하거나 빌드했다면, MapReduce 태스크에서 라이브러리를 사용할 수 있게 DistributedCache를 쓸 필요가 없습니다.

더 알아보기 (Learn more)