hdfs-mount
是一個將HDFS掛載為本地Linux
文件系統的工具,使用go語言開發,不依賴libdfs和java虛擬機。它允許將遠程HDFS作為本地Linux文件系統掛載,並允許任意應用程序或shell腳本以高效和安全的方式訪問HDFS作為普通文件和目錄。
1、特性(計划)簡介
以下翻譯自 hdfs-mount/README.md
- 高性能
- 使用protocol buffers協議直接連接HDFS和Linux內核FUSE接口(無需Java虛擬機)
- 針對吞吐量密集型工作負載進行設計和優化(盡可能以延遲交換吞吐量)
- 完全流式傳輸和自動預讀支持
- 並發操作
- 在內存中緩存元數據 (速度非常快 l!)
- 高穩定性和強大的故障處理行為
- 自動重試和故障轉移,全部可配置
- 可選的延遲掛載, 在 HDFS 可用之前
- 讀寫操作都支持
- 支持隨機寫入[慢,但功能正確]
- 支持文件截斷
- (可選)擴展ZIP存檔,並根據需要提取內容
- 這為”數百萬個小文件在HDFS上“(millions of small files on HDFS)問題提供了有效的解決方案
- 對CoreOS和Docker友好
- 可選擇打包為靜態鏈接的獨立可執行文件
2、構建程序
我的系統環境是CentOS 7.0 x86_64
,以下所有操作都是基於此。
先安裝編譯所需的必要工具軟件:
yum install make golang
然后下載hdfs-mount
的源碼回來,源碼倉庫地址:https://github.com/microsoft/hdfs-mount.git
git clone https://github.com/microsoft/hdfs-mount.git
然后就可以編譯了,先進入源碼目錄
# 進入源碼根目錄
cd hdfs-mount
# 執行構建
make
編譯的過程中因為要下載依賴(bazil/fuse、x/net/context、protobuf/proto),所以需要保持網絡通暢。
3、使用hdfs-mount掛載HDFS
因為hdfs-mount
基於FUSE(用戶空間文件系統)框架設計,所以需要先安裝fuse
內核模塊,並加載(如果沒有加載fuse
內核模塊,則無法hdfs-mount操作時候將失敗,並提示加載)。
# 安裝fuse模塊
sudo yum install fuse
# 加載fuse模塊
sudo modprobe fuse
然后就可以使用hdfs-mount
進行HDFS的掛載了,掛載后可以使用dd
命令進行一下讀寫速度測試。
# 掛載,因為hdfs-mount並不會后台運行,所以使用&放入后台
sudo ./hdfs-mount 192.168.0.32:9000 /mnt/hdfs &
# 測試一下讀取速度
dd bs=64k if=/mnt/hdfs/test.img of=/dev/null
記錄了24421+1 的讀入
記錄了24421+1 的寫出
1600485903字節(1.6 GB)已復制,9.56565 秒,167 MB/秒
hdfs-mount
的一些命令行參數如下,更多細節可執行hdfs-mount --help
查看。
# 查看使用幫助信息
./hdfs-mount --help
# 掛載必要選項: HDFS名字節點 端口 掛載位置
./hdfs-mount NameNode:Port MountPoint
# 下面是一些可選參數
-allowedPrefixes string
# 允許的前綴字符串,以逗號分隔的遠程HDFS上允許訪問的路徑前綴列表,如果指定了,掛載點將僅公開對這些前綴路徑的訪問(默認*)
-expandZips
# 實現zip文件的自動展開(訪問zip包內部文件)
-fuse.debug
# 日志輸出FUSE處理的線性信息
-lazy
# 延遲加載,允許在HDFS就緒前掛載HDFS文件系統
-logLevel int
# 日志輸出級別控制。0:僅fatal/err日志;1:+warning日志;2:+info日志
-readOnly
# 啟用只讀掛載
-retryMaxAttempts int
# 失敗操作的最大重試次數(默認99999999)
-retryMaxDelay duration
# 兩次重試之間的最大延時(默認1分0秒)
-retryMinDelay duration
# 兩次重試之間的最小延時(注意,第一次重試總是立即進行)(默認為1秒)
-retryTimeLimit duration
# 失敗操作的所有重試嘗試的時間限制 (默認為 5分0秒)