本節書摘來異步社群《hadoop mapreduce實戰手冊》一書中的第2章,第2.9節,作者: 【美】srinath perera , thilina gunarathne 譯者: 楊卓荦 責編: 楊海玲,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
hadoop mapreduce實戰手冊
libhdfs是一個原生共享庫,提供了一套c api,允許非java程式與hdfs進行互動。libhdfs使用jni通過java與hdfs進行互動。
準備工作
目前的hadoop發行版中包含了為32位和64位linux作業系統預編譯的libhdfs庫。如果你的作業系統與預編譯庫不相容,則可能需要下載下傳hadoop的标準發行版并從源代碼編譯libhdfs庫。有關編譯libhdfs庫的資訊請參見2.10節。
操作步驟
下列步驟顯示了如何在hdfs環境下使用hdfs的c api執行操作。
下面的示例程式會在hdfs中建立一個新檔案,向建立檔案中寫入一些文本資訊,并從hdfs讀回該檔案。用hdfs叢集中namenode的相關值替換namenode_hostname和端口變量。該hdfs_cpp_demo.c源檔案中的源代碼包位于該檔案夾的hdfs_c_api目錄中。
通過使用如下gcc指令編譯上面的程式。當編譯時,需要連結libhdfs和jvm庫。是以,還必須包括java安裝路徑的jni頭檔案。一個示例編譯指令如下所示。将arch和架構依賴的路徑替換成目前系統的路徑。
重置環境變量classpath,将其指向hadoop的依賴環境。一種保險的方法是将$hadoop_home和$hadoop_home/lib中的所有jar檔案全部包括在環境變量中。
ant建構腳本生成類路徑 在2.8節步驟2中給出的build檔案的末尾,添加下面的anttarget。本章源碼包的hdfs_c_api檔案夾中提供了修改後的build.xml腳本。
用ant print-cp執行ant建構,之後會生成一個包含$hadoop_home和$hadoop_home/lib中的所有jar檔案名的字元串。複制這個字元串導出到classpath環境變量中。
執行程式。
工作原理
首先,我們通過hdfsconnect指令輸入namenode的主機名(或ip位址)和端口來連接配接到一個hdfs叢集。hdfsconnectasuser指令可以作為一個特定的使用者連接配接到一個hdfs叢集。
使用hdfsopenfile指令建立檔案,并獲得新建立檔案的句柄。o_wronly | o_creat标志表示建立一個檔案或重寫現有檔案,并用隻寫模式打開它。其他支援的标志還有o_rdonly和o_append。該hdfsopenfile指令的第四、第五和第六個參數分别表示進行讀/寫操作的緩沖區大小、塊的備援因子和新建立檔案的塊大小。如果想使用這三個參數的預設值,可以将它們指定為0。
該hdfswrite指令将提供的資料寫入到outfile句柄指定的檔案中。資料大小需要以位元組數為機關指定。
hdfsread指令從infile指定的檔案中讀取資料。需要提供以位元組為機關的緩沖區大小作為第四個參數。hdfsread指令傳回檔案讀取的實際位元組數,該數量可能小于緩沖區大小。如果想要確定從檔案中讀取一定的位元組數,最好是在循環内使用hdfsread指令,直到讀完了指定的位元組數為止。
更多參考
hdfs的c api(libhdfs)支援的檔案系統操作比前面示例中用到的多。請參見$hadoop_home/src/
c++/libhdfs/hdfs.h頭檔案獲得更多有關的詳細資訊。
使用hdfs的配置檔案配置
還可以使用hdfs的配置檔案來告訴libhdfsnamenode的主機名和端口号,而不是通過hdfs-
connect指令以參數的方式傳入。
在hdfsconnect指令中,将namenode的主機名和端口号改為"default"和0。(将主機名設定為null将使libhdfs使用本地檔案系統)。
将hdfs安裝的conf目錄添加到classpath環境變量中。