原生程式庫指南

概觀

本指南說明原生 Hadoop 程式庫,並包含關於原生共用程式庫的小段討論。

注意:根據您的環境,「原生程式庫」一詞可能指您需要編譯的所有 *.so;而「原生壓縮」一詞可能指您需要編譯的所有特別與壓縮相關的 *.so。不過,目前,本文件僅說明原生 Hadoop 程式庫 (libhadoop.so)。libhdfs 程式庫 (libhdfs.so) 的文件在此

原生 Hadoop 程式庫

Hadoop 有某些元件的原生實作,原因在於效能考量和 Java 實作不可用。這些元件可在稱為原生 Hadoop 程式庫的單一動態連結原生程式庫中取得。在 *nix 平台上,程式庫的名稱為 libhadoop.so

使用方式

使用原生 Hadoop 程式庫相當容易

  1. 檢閱元件。
  2. 檢閱支援的平台。
  3. 下載 hadoop 發行版,其中包含已預先建置的原生 hadoop 函式庫版本,或建置您自己的原生 hadoop 函式庫版本。無論您是下載或建置,函式庫的名稱都相同:libhadoop.so
  4. 安裝壓縮編解碼器開發套件 (>zlib-1.2, >gzip-1.2)
    • 如果您下載函式庫,請安裝一個或多個開發套件 - 任何您想與您的部署一起使用的壓縮編解碼器。
    • 如果您建置函式庫,則必須安裝兩個開發套件。
  5. 檢查執行時期日誌檔。

元件

原生 hadoop 函式庫包含各種元件

支援的平台

原生 hadoop 函式庫僅支援 *nix 平台。函式庫無法搭配 Cygwin 或 Mac OS X 平台使用。

原生 hadoop 函式庫主要用於 GNU/Linus 平台,並已在這些發行版上進行測試

  • RHEL4/Fedora
  • Ubuntu
  • Gentoo

在上述所有發行版上,32/64 位元原生 hadoop 函式庫將與各自的 32/64 位元 jvm 搭配使用。

下載

預先建置的 32 位元 i386-Linux 原生 hadoop 函式庫可用作 hadoop 發行版的一部分,並位於 lib/native 目錄中。您可以從 Hadoop Common Releases 下載 hadoop 發行版。

務必安裝 zlib 和/或 gzip 開發套件 - 任何您想與您的部署一起使用的壓縮編解碼器。

建置

原生 hadoop 函式庫以 ANSI C 編寫,並使用 GNU autotools 鏈 (autoconf、autoheader、automake、autoscan、libtool) 建置。這表示在任何具有標準相容 C 編譯器和 GNU autotools 鏈的平台上建置函式庫應該很簡單(請參閱支援的平台)。

您需要在目標平台上安裝的套件包括

  • C 編譯器(例如 GNU C 編譯器)
  • GNU Autools 鏈:autoconf、automake、libtool
  • zlib 開發套件(穩定版本 >= 1.2.0)
  • openssl 開發套件(例如 libssl-dev)

安裝先決條件套件後,請使用標準 hadoop pom.xml 檔,並傳遞原生旗標來建置原生 hadoop 函式庫

   $ mvn package -Pdist,native -DskipTests -Dtar

您應該會在中看到新建置的函式庫

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

請注意下列事項

  • 在目標平台上安裝 zlib 和 gzip 開發套件是建置原生 Hadoop 函式庫的必要條件;但是,如果你只想使用一種編解碼器,那麼在部署時只需安裝一個套件就夠了。
  • 為了建置和部署原生 Hadoop 函式庫,必須針對目標平台的 32/64 位元 jvm,擁有正確的 zlib 32/64 函式庫。

執行時期

bin/hadoop 腳本會透過系統屬性確保原生 Hadoop 函式庫在函式庫路徑中:-Djava.library.path=<path>

在執行時期,請檢查 MapReduce 任務的 Hadoop 日誌檔。

  • 如果一切正常,那麼:DEBUG util.NativeCodeLoader - Trying to load the custom-built native-hadoop library... INFO util.NativeCodeLoader - Loaded the native-hadoop library
  • 如果發生問題,那麼:INFO util.NativeCodeLoader - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

檢查

NativeLibraryChecker 是用來檢查原生函式庫是否正確載入的工具。你可以按照下列方式啟動 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

原生共用函式庫

你可以使用 DistributedCache 載入任何原生共用函式庫,以分發和建立函式庫檔案的符號連結。

這個範例說明如何分發共用函式庫 mylib.so,並從 MapReduce 任務載入它。

  1. 首先將函式庫複製到 HDFS:bin/hadoop fs -copyFromLocal mylib.so.1 /libraries/mylib.so.1
  2. 啟動工作的程式應該包含以下內容:DistributedCache.createSymlink(conf); DistributedCache.addCacheFile("hdfs://host:port/libraries/mylib.so. 1#mylib.so", conf);
  3. MapReduce 任務可以包含:System.loadLibrary("mylib.so");

注意:如果你下載或建置了原生 Hadoop 函式庫,你不需要使用 DistibutedCache 讓 MapReduce 任務可以使用該函式庫。