這個入門教程描述了native(本地?原生?)hadoop庫,包含了一小部分關于native hadoop共享庫的讨論。
This guide describes the native hadoop library and includes a small discussion about native shared libraries.
注意: 根據你的環境,詞組 "native libraries" 可能會變成 *.so,這樣你就需要編譯,然後,要是詞組 "native compression" 變成 *.so,你就需要在編譯時特别指定相關的壓縮。(原文是在是翻不好! Depending on your environment, the term
"native libraries" could refer to all *.so‘s you need to compile; and, the term "native compression" could refer to all *.so‘s you need to compile that are specifically related to compression.)當期,然而,這個文檔隻讨論 native hadoop 庫(<code>libhadoop.so</code>).
Hadoop 有 native實作,是因為性能原因和Java的實作不可用而實作了特定的元件。這些元件可在單節點,動态連結的 native 庫中調用native hadoop庫。在*nix平台上,庫名是 <code>libhadoop.so</code>.
使用hadoop native庫相當簡單:
檢查元件
檢查支援的平台
或者下載下傳一個包含内置原生庫的hadoop發行版,或者建立你自己的 native hadoop 庫。不論是下載下傳還是建立,庫的名字都是一樣的:libhadoop.so
安裝壓縮編碼包 (>zlib-1.2, >gzip-1.2): + 如果你下載下傳庫安裝一個或更多的開發包-不論你用哪一個壓縮編碼器來部署。 + 如果你建立庫,則必須安裝兩個開發包。
檢查運作時日志檔案
native hadoop 庫包含兩個元件, zlib 和 gzip 壓縮編碼器:
zlib
gzip
native hadoop 庫對gzip工作來說是必須的。
native hadoop 庫僅在 *nix 平台上受支援。這個庫不能與 Cygwin或 Mac OS X 平台一同工作。
native hadoop 庫主要用在 GNU/Linus 平台,已經在這些發行版上測試過:
RHEL4/Fedora
Ubuntu
Gentoo
在所有上面的 32/64 位發行版上, native hadoop 庫會分别運作一個 32/64 位的 jvm.
内置的 32-bit i386-Linux native hadoop 作為hadoop發行版的一部分,位置是 <code>lib/native</code> 目錄。你可以從
Hadoop Common Releases 下載下傳hadoop發行版。
確定要安裝 zlib和/或 gzip 開發包 - 不論你用哪一個壓縮編碼器來部署。
native hadoop 庫實用 ANSI C 寫的,用 GNU autotools-chain (autoconf, autoheader, automake, autoscan, libtool)建構。這意味着它應該可以直接在任何有标準C編譯器和GNU autotools-chain(見支援的平台)的平台上建構庫。
你需要安裝在目标平台上的包:
C 編譯器(例如, GNU C Compiler)
GNU Autools Chain: autoconf, automake, libtool
zlib-開發包 (穩定版本 >= 1.2.0)
一旦你使用标準的hadoop build.xml file安裝了先決的包,并傳遞compile.native 标志(設為true)去建構 native hadoop library:
你應該可以看見建立的庫:
平台是系統屬性的組合: $-$-$ (如,
Linux-i386-32).
請注意:
必須安裝zlib 和 開發包到目标平台上,以便建構 native hadoop 庫。然而,為了開發的話僅安裝一個包就夠了,如果你隻想用編碼器的話。
必須有正确的 32/64庫 适合zlib,取決于目标平台的 32/64 位 jvm ,為的是建構和部署 native hadoop library.
bin/hadoop 腳本確定 native hadoop library 通過系統屬性在 library path 上:<code>-Djava.library.path=<path></code>
在運作時,為你的 MapReduce 任務檢查 hadoop 日志檔案。
如果一切正常,那麼: <code>DEBUG util.NativeCodeLoader - 試着加載自建構的 native-hadoop library...</code> <code>INFO util.NativeCodeLoader - 載入了的 native-hadoop library</code>
如果哪裡出錯了,那麼: <code>INFO util.NativeCodeLoader - 不能為你的平台載入 native-hadoop library ... 使用可用的java類</code>
你可以用DistributedCache 為分布和對稱連結庫檔案載入任何的 native shared library 。
這個例子展示了如何散布一個 a shared library, mylib.so, 并将其從一個 MapReduce任務中載入。
首先複制檔案到 HDFS: <code>bin/hadoop fs -copyFromLocal mylib.so.1 /libraries/mylib.so.1</code>
job啟動程式應該包含下面的: <code>DistributedCache.createSymlink(conf);</code> <code>DistributedCache.addCacheFile("hdfs://host:port/libraries/mylib.so. 1#mylib.so", conf);</code>
MapReduce 任務可以包含: <code>System.loadLibrary("mylib.so");</code>
注意: 如果你下載下傳了或建構了 native hadoop library,你不需要使用 DistibutedCache 來使庫對你的 MapReduce 任務可用。