HDFS基礎理論以及Java API訪問示例
近年來機器學習開始在各行各業的發展中扮演重要角色,而機器學習效果的提升離不開大規模的訓練數據,從而對計算能力和存儲容量都提出了新的要求。大數據時代必須解決海量數據的高效存儲問題,hadoop分佈式文件系統(Hadoop Distributed File System,HDFS)是谷歌文件系統(Google File System,GFS)的開源實現,也是hadoop的兩大核心組成部分之一,提供了在廉價服務器集羣中進行大規模分佈式文件存儲的能力。
一.基本概念
1.分佈式文件系統
分佈式文件系統是一種通過網絡實現文件在多臺主機上進行分佈式存儲的文件系統。
- 分佈式文件系統的設計一般採用C/S(Client/Server)客戶/服務器模式。
- 計算機集羣中的計算機節點一般放置在機架(rack)上,每個機架可以存放8-64個節點,同一機架上的不同節點之間通過網絡互連;不同機架之間採用交換機(switch)或另一級網絡。
2.HDFS中的數據塊
- 普通文件系統中的磁盤塊:磁盤進行數據讀寫的最小單位,通常512B
- HDFS中的塊(Block),默認爲64MB,爲了最小化尋址開銷
- HDFS中塊的大小會遠大於普通文件系統中磁盤塊的大小,原因是:
(1) 處理的數據規模大,塊越大,存儲的塊數越少
(2) HDFS的尋址開銷:- 磁盤尋道開銷
- 數據塊的定位開銷
3.客戶端對HDFS的操作
- [讀] 客戶端要訪問一個文件時,客戶端從名稱節點獲得數據節點和文件塊的映射關係,然後到相應位置去訪問文件塊。
- [寫] 當存儲文件時,由名稱節點來分配存儲位置,然後由客戶端將數據直接寫入對應的數據節點。
- [其他操作] 數據節點也需要根據名稱節點的命令來創建、刪除數據塊,並實現數據的冗餘複製。
4.名稱節點和數據節點
分佈式文件系統在物理結構上由計算機集羣中的多個節點構成,分爲兩類:
-
主節點(Master)/名稱節點(NameNode)
作用:
(1)管理文件系統的命名空間(文件塊和數據節點的映射關係,包括目錄、文件和塊),維護着文件系統的目錄樹和目錄樹內所有的文件和目錄(負責文件和目錄的創建、刪除、重命名);
(2)響應客戶端對文件的訪問;
這些信息以兩個文件形式永久地保存在本地磁盤上:
① 命名空間鏡像文件(也稱文件系統映像,File System Image,FSImage)即HDFS元數據的完整快照,每次NameNode啓動的時候,就會默認加載最新的命名空間映像
② 編輯日誌文件(Edit Log)
ps:HDFS集羣中只有一個命名空間,並且只有唯一一個名稱節點,該節點負責對這個命名空間進行管理。 -
從節點(Slave)/數據節點(DataNode)
根據需要存儲並檢索數據塊(受客戶端或namenode調度,處理客戶端的讀寫請求),並定期向namenode發送它們所存儲的塊的列表,以及其’心跳’信息(heartbeat)。
ps:所有的HDFS通信協議都是構建在TCP/IP協議基礎之上的- 客戶端通過一個可配置的端口向名稱節點主動發起TCP連接,並使用客戶端協議與名稱節點進行交互;
- 名稱節點和數據節點之間通過數據節點協議進行交互;
- 客戶端和數據節點之間通過RPC(Remote Procedure Call遠程過程調用)進行交互。
-
HDFS集羣在不同機架間的數據交換
一個HDFS集羣通常包含多個機架,不同機架之間的數據交換需要經過交換機或路由器,同一個機架上的不同機器之間的通信則不需要經過路由器或交換機,這意味着更大的通信貸帶寬。
二.如何訪問HDFS
1.命令行接口
(1)訪問
- 訪問本地文件系統
在命令行輸入
該條語句可以訪問本地文件系統目錄,如下:hadoop dfs -ls file:///
- 訪問HDFS文件系統
在命令行中輸入:
或者輸入hadoop dfs -ls hdfs:///
即可查看HDFS的根目錄hdfs dfs -ls /
(2)目錄操作
- 創建用戶目錄
第一次使用HDFS時,首先創建用戶目錄
[命令解析]$cd /usr/local/hadoop $hdfs dfs -mkdir -p /user/hadoop
-p表示若是多級目錄,父目錄和子目錄一起創建
hadoop dfs -mkdir//在HDFS上創建路徑爲 的目錄 - 顯示與當前用戶對應的HDFS上的用戶目錄
. 表示HDFS中的當前用戶目錄,即/user/hadoop目錄$hdfs dfs -ls .
(3)文件操作
-
從本地文件系統向HDFS中上傳文件 -put
如圖所示,本地文件系統/home/Documents路徑下存在一個文本文件mytext.txt,其內容如下:
在HDFS中已創建/user/hadoop/input路徑,用於接收從本地上傳的文件,在終端中輸入:$hdfs dfs -put /home/hadoop/Documents/mytext.txt input
輸入
hdfs dfs -ls input
可以列出HDFS上input文件夾中上傳的文件
我們再輸入hdfs dfs -cat input input/mytext.txt
即可查看文件具體內容
-
從HDFS下載文件到本地文件系統
$hdfs dfs -get input/mytext.txt /home/hadoop/Downloads
hdfs dfs -get [hdfs中文件路徑] [本地系統路徑]
-
在HDFS中移動文件
$hdfs dfs -mv
如在HDFS的根目錄下創建目錄/input$hdfs dfs -mv input/mytext.txt /input
要把HDFS的“/user/hadoop/input/mytext.txt”文件,剪切到HDFS的另外一個目錄“/input”中(注意,這個input目錄位於HDFS根目錄下),-mv後文件在源路徑中不存在
2.Java API
本系統的Eclipse中的工作空間爲:/home/hadoop/workspace
創建好項目之後,注意,需要爲項目添加需要用到的JAR包,方法如下:
選擇該項目,右鍵–>Build Path–>Configure Build Path, 橫向菜單中選擇 Libraries–>Add External JARs…
爲了編寫一個能夠與HDFS交互的Java應用程序,一般需要向Java工程中添加以下JAR包:
- ”/usr/local/hadoop/share/hadoop/common”目錄下的hadoop-common-2.7.1.jar和haoop-nfs-2.7.1.jar;
- /usr/local/hadoop/share/hadoop/common/lib”目錄下的所有JAR包;
- “/usr/local/hadoop/share/hadoop/hdfs”目錄下的haoop-hdfs-2.7.1.jar和haoop-hdfs-nfs-2.7.1.jar;
- “/usr/local/hadoop/share/hadoop/hdfs/lib”目錄下的所有JAR包。
運行該程序之前記得啓動hadoop
start-all.sh
3.Web_UI
- hadoop 2.x.x 版本 Master節點在瀏覽器中輸入localhost:50070即可看到整個集羣的狀態
- 【注意!】hadoop 3.x.x 版本端口號改爲9870
即在瀏覽器中輸入localhost:9870或Master:9870(若主機名已修改)