本指南說明原生 Hadoop 程式庫,並包含關於原生共用程式庫的小段討論。
注意:根據您的環境,「原生程式庫」一詞可能指您需要編譯的所有 *.so;而「原生壓縮」一詞可能指您需要編譯的所有特別與壓縮相關的 *.so。不過,目前,本文件僅說明原生 Hadoop 程式庫 (libhadoop.so
)。libhdfs 程式庫 (libhdfs.so
) 的文件在此。
Hadoop 有某些元件的原生實作,原因在於效能考量和 Java 實作不可用。這些元件可在稱為原生 Hadoop 程式庫的單一動態連結原生程式庫中取得。在 *nix 平台上,程式庫的名稱為 libhadoop.so
。
使用原生 Hadoop 程式庫相當容易
原生 hadoop 函式庫包含各種元件
原生 hadoop 函式庫僅支援 *nix 平台。函式庫無法搭配 Cygwin 或 Mac OS X 平台使用。
原生 hadoop 函式庫主要用於 GNU/Linus 平台,並已在這些發行版上進行測試
在上述所有發行版上,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 鏈的平台上建置函式庫應該很簡單(請參閱支援的平台)。
您需要在目標平台上安裝的套件包括
安裝先決條件套件後,請使用標準 hadoop pom.xml 檔,並傳遞原生旗標來建置原生 hadoop 函式庫
$ mvn package -Pdist,native -DskipTests -Dtar
您應該會在中看到新建置的函式庫
$ hadoop-dist/target/hadoop-3.3.6/lib/native
請注意下列事項
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 任務載入它。
bin/hadoop fs -copyFromLocal mylib.so.1 /libraries/mylib.so.1
DistributedCache.createSymlink(conf);
DistributedCache.addCacheFile("hdfs://host:port/libraries/mylib.so. 1#mylib.so", conf);
System.loadLibrary("mylib.so");
注意:如果你下載或建置了原生 Hadoop 函式庫,你不需要使用 DistibutedCache 讓 MapReduce 任務可以使用該函式庫。