HDFS详解(架构设计、副本放置策略、读写流程、进程、常用命令等)
?前言:當數據集的大小超過一臺獨立的物理計算機的存儲能力時,就有必要對它進行分區(Partition)并存儲到若干臺單獨的計算機上。管理網絡中跨多臺計算機存儲的文件系統成為分布式文件系統(distributed filesystem)。該系統架構與網絡之上,勢必會引入網絡編程的復雜性,因此分布式文件系統比普通磁盤文件系統更為復雜。例如:使文件系統能夠容忍節點故障且不丟失任何數據,就是一個極大的挑戰。
一、HDFS的設計
????HDFS是以流式數據訪問模式來存儲超大文件,具有以下特點:
流式數據訪問????HDFS構建思路決定為:一次寫入、多次讀取是最高效的訪問模式。
商用硬件????Hadoop不需要部署在高昂且高可靠的硬件上,HDFS的設計使得數據的靠可性和安全性增加。
低時間延遲的數據訪問????HDFS不適合此種方式,對于低延遲的訪問需求,可以選擇HBase。
大量的小文件????Namenode用于存儲文件系統的元數據,首相與Namenode的內存,對于大量的小文件,Namenode的管理壓力過大。
多用戶寫入,任意修改文件????HDFS不支持多用戶寫入操作,也不支持在文件任意位置進行修改,數據的添加在文件的末尾。
二、HDFS的架構設計
????HDFS的架構遵循主/從架構模式,主要進程為Namenode,Datanode,Secondarynamenode,在啟動過程中,啟動順序也是按照這個順序。
????對于磁盤的存儲,我們每個磁盤都有默認的數據塊,文件系統塊的大小(默認512字節)一般為數據塊的整數倍。對于HDFS同樣有數據塊這一概念,原先官方默認的數據塊為64M,目前新版本的默認為128M。若想改變這一默認,需要修改HDFS的配置文件,名稱為:dfs.blocksize,默認128M。
????Q1:HDFS塊為何這么大?
????A:HDFS的塊比磁盤的塊大,目的是最小化尋址開銷。如果塊設置的足夠大,從磁盤傳輸數據的時間會明顯大于定位這個塊開始位置的時間。假如尋址時間為10ms,文件傳輸速率為100MB/s,為了使尋址時間僅占傳輸時間的1%,我們就需要將塊設置為100MB左右,以此來達到最優占比。但是數據塊也不宜設置過大,因為Mapreduce的map任務每次只處理一個數據塊,故如果任務量少于集群的節點數量,作業運行速度就比較慢。
????Q2:對于一個130M的文件,需要幾個塊,如何分配,實際存儲大小是多少?
????A:需要兩個塊,分別為128M 2M ,實際存儲大小也是為130M。
????HDFS架構圖如下圖所示。
????HDFS集群有兩類節點以管理者-工作者模式運行,即Namenode(管理者)和多個Datanode(工作者)(也包含Namenode的輔助節點Secondarynamenode)。
????1、Namenode負責內容
文件系統的命名空間
文件名稱,字節數
文件目錄結構
文件的屬性(權限、創建時間、副本數)
文件對應哪些數據塊以及數據塊對應哪些datanode節點
????作用:管理文件系統的命名空間。維護著文件系統書以及整棵樹內所有的文件和目錄。這些信息以兩個文件形式永久保存在本次磁盤上:命名空間鏡像文件fsimage和編輯日志文件editlog。NN官方默認配置為1000M
????在工作環境中,我們可能面臨諸多文件都是小文件的狀況,這時候就需要考慮小文件如何壓縮成大文件。
????假設一個文件的名稱占30字節,對于NN默認內存為1000M,則可以存儲3495 2522個文件名稱。假如我們有3495 2522個小文件,每個文件是1M,則我們會有3495 2522個數據塊,那么NN中的文件名稱就會占滿NN的內存,這樣一來不利于NN節點的工作。若我們將3495 2522個小文件,壓縮成128M一個的文件,需要27 3067個文件,這時候在NN中所需要的文件名稱存儲大小就僅為7.8M,大幅度降低了NN維護的壓力,同時DN實際存儲沒有變化。
????2、Datanode負責內容
數據塊和數據塊校驗和
????Datanode與Namenode通信方式:每隔3秒發送一個心跳包,每十次心跳發送一次blockReport
????3、Secondarynamenode
定期整合fsimage和editlog文件
????作用就是定期合并fsimage+editlog文件為新的fsimage,推送給namenode,俗稱檢查點動作,checkpoint,時間周期為默認1小時;內存大小默認64M。
三、副本放置策略
第一副本:放置在上傳文件的DataNode上;如果是集群外提交,則隨機挑選一臺磁盤不太慢,CPU不太忙的節點上;
第二副本:放置在于第一個副本不同的機架節點上;
第三副本:與第二個副本相同機架的不同節點上;
如果還有更多的副本,則隨機放在節點中。
下圖為三副本配置示意圖
四、文件讀寫流程
Client通過FileSystem.open(filepath)方法,去與Namenode進行rpc通信,返回該文件的部分或全部的block列表(也包含該列表各block的分布在Datanode地址的列表),也就是返回FSDataInputStream對象;
Client調用FSDataInputStream對象的read()方法:
去與第一個塊的最近的Datanode進行read,讀取完成后,會check,加入successful,會關閉與當前Datanode通信;(假如check fail,會記錄失敗的塊和Datanode信息,下次就不會讀取;那么回去該塊的第二個Datanode地址讀取)
然后去第二個塊的最近的Datanode上進行讀取,check后,關閉此Datanode的通信;
假如block列表讀取完了,文件還未結束,那么FileSystem會從Namenode獲取下一批的block的列表。(讀操作對于Client端是透明的,感覺就是連續的數據流)
?????3.Client調用FSDataInputStream.close()方法,關閉輸入流。
Client調用FileSystem.create(filepath)方法,去與Namenode進行rpc通信,check該路徑的文件是否存在以及有沒有權限創建該文件,假如可以,就創建一個空的新文件,但是并不關聯任何block,返回一個FSDataOutputStream對象;(假如不可以創建,就返回錯誤信息,一般代碼要帶有try-catch去捕捉異常)
Client調用FSDataOutputStream對象的write()方法,會將第一個塊寫入第一個Datanode,第一個Datanode寫完傳給第二個節點,第二個寫完傳給第三個節點,當第三個節點寫完返回一個ack packet給第二個節點,第二個返回一個ack packet 給第一個節點,第一個節點返回ack packet給FSDataOutputStream對象,表示第一個塊寫完,副本數為3;
剩余的塊依次這樣寫;
當向文件寫入數據完成后,Client調用FSDataOutputStream.close()方法,關閉輸入流,flush緩存區的數據包;
再調用FileSystem.complete()方法,告訴Namenode節點寫入成功。
五、pid進程詳解
????Hadoop進程的pid文件默認存放在/tmp目錄中,linux默認情況下是一個月清空一次。若將pid文件刪除了,對我們的HDFS運行沒有影響,但是當停止集群時,若將namenode的pid刪除,會發生錯誤顯示:no namenode to stop。這時會存在殘留進程,下次啟動時可能啟動不起來,不利于集群維護。(jps顯示的是hsperfdata文件中的內容)
????解決方法是不修改Linux系統內容,而是更改Hadoop的pid進程的默認存儲路徑,進入etc配置文件,修改hadoop-env.sh文件。
cd /opt/software/hadoop-2.8.1/etc/hadoop
# The directory where pid files are stored. /tmp by default.
# NOTE: this should be set to a directory that can only be written to by?
# ? ? ? the user that will run the hadoop daemons. ?Otherwise there is the
# ? ? ? potential for a symlink attack.
export HADOOP_PID_DIR=${HADOOP_PID_DIR}
export HADOOP_SECURE_DN_PID_DIR=${HADOOP_PID_DIR}
六、HDFS常用命令
????1、hadoop fs == hdfs dfs
命令的執行要在bin目錄下
例:./hadoop fs -ls /
hadoop fs -ls / 查看
hadoop fs -lsr
hadoop fs -mkdir /user/haodop 創建文件夾
hadoop fs -put a.txt /user/hadoop 上傳到hdfs
hadoop fs -get /user/hadoop/a.txt 從hdfs下載
hadoop fs -cp src dst 復制
hadoop fs -mv src dst 移動
hadoop fs -cat /user/hadoop/a.txt 查看文件內容
hadoop fs -rm /user/hadoop/a.txt 刪除文件
hadoop fs -rmr /user/hadoop 刪除文件夾
hadoop fs -text /user/hadoop/a.txt 查看文件內容
hadoop fs -copyFromLocal localsrc dst ?與hadoop fs -put功能類似
hadoop fs -moveFromLocal localsrc dst 將本地文件上傳到hdfs,同時刪除本地文件
????2、幫助命令查看
hadoop幫助命令查看,不需要輸入help,只需要在bin目錄下輸入即可。
例:./hadoop?
? ? ./hadoop fs
原文鏈接:https://blog.csdn.net/qq_25302531/article/details/80563216
總結
以上是生活随笔為你收集整理的HDFS详解(架构设计、副本放置策略、读写流程、进程、常用命令等)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PS菜鸟入门 -- 窗口
- 下一篇: 机器学习笔记(十)——Logistic