一、概述
hadoop是目前使用比較多的分佈式文件系統,由於hadoop是用Java寫的,對非Java程序人員,不好直接使用它的接口,不過它提供了thrift接口服務器,因此也可以採用其他語言來編寫hadoop的客戶端,本文主要介紹的是它C++客戶端的使用。目前hadoop穩定版是1.2.1,thrift接口文件位於/src/contrib/thriftfs/if/hadoopfs.thrift,啓動thrift服務的腳本位於/src/contrib/thriftfs/scripts/start_thrift_server.sh,C++語言文件位於/src/contrib/thriftfs/gen-cpp,包括
hadoopfs_constants.cpp/.h,hadoopfs_types.cpp/.h,ThriftHadoopFileSystem.cpp/.h和ThriftHadoopFileSystem_server.skeleton.cpp七個文件,其中最後一個文件沒有用。
hadoopfs.thrift非常簡單,包括4個結構,2個異常,19個service函數。以下將分別介紹結構和函數。
二、安裝
Hadoop的thrift server是需要安裝的。如果下載的是帶bin的包,其中thrift server是沒有編譯到包中的,因此需要下載源代碼重新編譯。具體的編譯過程,可以參考http://blog.csdn.net/jiangheng0535/article/details/12089023,大致要下載ant,ivy,m4,autoconf,automake,libtool,然後用ant來編譯。採用文章中描述的步驟,基本上可以成功啓動thrift server。開啓thrift sever的腳本如下(當然,首先應啓動hadoop):- /src/contrib/thrifts/scripts/start_thrift_server.sh 端口號
三、接口結構
接口結構比較少,如下:
- ThriftHandle:這個東西相當於文件句柄
- Pathname:文件路徑
- FileStatus :實際上是文件的各種屬性,包括名稱、長度、文件/目錄、塊複製數、塊大小,權限屬性等。
- BlockLocation :文件塊的屬性,包括位置屬性,該塊在文件中的偏移量,大小等。
四、接口service函數
本文thrift採用的是0.9.1,此時hadoop自帶的C++文件中,hadoopfs_types和ThriftHadoopFileSystem會發生編譯錯誤,其中命名空間中的facebook應改爲::apache,hadoopfs_types.h中包含文件reflection_limited_types.h應該改爲TApplicationException.h,可以看出,此處生成的文件,採用的是老版本的thrift compiler。- setInactivityTimeoutPeriod:設置超時時間(s),如果超過此時間,服務器斷開。
- shutdown:斷開與服務器的連接
- create、createFile:這兩個是創建文件,並輸出文件句柄供寫入,後一個函數提供了更多的文件屬性參數來控制文件的創建。
- open:以讀寫方式打開一個已存在的文件,輸出文件句柄供操作。
- append:以添加方式打開一個已存在的文件,輸出爲文件句柄。
- write:向已打開的文件寫入數據,返回是否成功。
- read:向已打開的文件讀取數據,與通常文件讀取一樣,需指定讀取位置和讀取大小。
- close:關閉文件
- rm:刪除文件或目錄,可以指定是否遞歸刪除目錄
- rename:重新命名文件或目錄
- mkdirs:創建目錄
- exists:檢查文件或目錄是否存在
- stat:獲取文件或目錄的屬性,輸出的是FileStatus結構。
- listStatus:如果輸入是一個目錄,則輸出是目錄下所有文件的FileStatus結構(數組)
- chmod:設置文件/目錄的權限
- chown:設置文件/目錄的組和所有者
- setReplication:設置文件的複製因子(多少份)
- getFileBlockLocations:得到文件的塊的信息,輸出是BlockLocation數組。
以上這些接口除了具有複製因子、塊等信息外,與通常的文件操作沒有什麼區別,因此對它們進行再次封裝似乎沒有必要,除非有特殊的要求。