上一篇文章將Hadoop環境搭建完畢,下面我們學習一些HDFS的工作原理
HDFS ---> 分佈式文件系統 簡單說就是把很多數據文件分開放在很多的服務器上,採取分開的方式對很多很多的數據進行分析
一.HDFS特點:
1、支持超大文件
大數據有很多數據,所以能夠通過HDFS對很多很多數據進行控制,這個其他做的可能並不是那麼好。因爲機制原因對小文件反而效果沒有那麼好。
2、檢測和快速應對硬件故障
HDFS擁有備份功能,一個節點掛掉後因爲有數據備份,會很快的進行數據更新,將數據從其他節點拿過來。
3、流式數據訪問
一般都是批量處理,而不是用戶交互式處理,應用程序能以流的形式訪問數據庫。主要的是數據的吞吐量,而不是訪問速度。因此HDFS不適合於低延遲的數據訪問,HDFS的是高吞吐量。
4、簡化的一致性模型
適合的模型是:一次寫入多次讀出,可不斷追加,但不可修改。
4、高擴展性
數據能夠在namenode容量的限制下,不斷擴充datanode容量
可能你有這樣的疑惑?那HDFS與傳統雲盤有何區別?
我個人理解:1.HDFS能夠處理大量大文件,傳統雲盤並不能,傳統雲盤當擴充需要花費money,當容量達到PB就很大了,但是HDFS能夠存儲更多的數據
2.HDFS擁有備份功能,當子節點datanode掛掉後,會有其他子節點補充,同時又擁有信息備份功能(比如說第一個子節點存儲資源 A B ; 第二個子節點存儲資源 B C ; 第三個子節點存儲資源 C A),所以說當一個掛掉後會有信息進行補充
但是傳統雲盤不具備!雲盤不會給你備份,如果你將雲盤中的文件刪除後(刪除到回收站能恢復不叫備份!那只是把你的文件從一個文件夾拿到另外一個文件夾!時間過後仍然會徹底消失),文件將不存在
3.HDFS適合大吞吐量,高延遲場景,而傳統雲盤適合低吞吐,低延遲
4.傳統雲盤,能夠不斷寫入修改讀出,但是HDFS只能進行追加寫入,讀出(一次寫入,多次讀出)
可能以還有這樣的疑惑?那HDFS能開發成雲盤嗎?
個人理解:如果不修改,只是不斷追加和讀取,可以作爲雲盤
二:HDFS中四個節點之間的關係
我理解HDFS中有四個節點,分別是:1.HDFS Client 2.NameNode 3.Secondary NameNode 4.DataNode
1.HDFS Client
客戶端請求訪問HDFS時,無論是讀還是寫都是通過向namenode申請來進行,namenode作爲大哥,大哥同意後,客戶端可以與datanode進行溝通
會將文件進行分份,每128字節分一份(不同系統好像不同)
2.NameNode
負責客戶端請求的響應,負責管理整個文件系統的元數據,是大哥。啥是元數據?就是這樣-->/ckj.avi 2 (blk-01,blk-02,blk-03) blk-01:node01,node02 blk-02:node02,node03 (意思就是把文件分成三份,把第一份裝到第一個和第二個節點,第二份裝到第二個和第三個節點)
有鏡像文件和日誌文件
3.Secondary NameNode
也有鏡像文件和日誌文件,鏡像文件實時更新,日誌文件間斷更新,如果namenode掛掉後,會將鏡像給namenode
4.DataNode
負責管理用戶的文件數據塊,每一個文件塊可以有多個副本,並存放在不同的datanode上,Datanode會定期向Namenode彙報自身所保存的文件block信息,而namenode則會負責保持文件的副本數量
因爲有備份功能,所以說,一份文件會存好幾份,但是訪問時訪問那個呢?會訪問離客戶端最近的那個。
擁有心跳機制,不斷告訴namenode大哥,他還活着,當他不在告訴大哥他還活着時,大哥會認爲他掛掉了,並將他的數據重新放在另外一個blk上
客戶請求上傳文件流程
首先客戶端請求上傳,和namenode說一聲,nomenode檢查一些自己,發現沒有,告訴客戶端,你可以傳,客戶端說我要傳blk1,nomenode告訴客戶端,你可以傳到datanode的node1和node2,客戶端知道後,建立連接,傳過去了
客戶端請求讀文件流程
步驟基本一樣,客戶端請求讀文件,還是要問我大哥namenode,namenode知道後產生一條元數據給客戶端,告訴你,blk1裏面有node1,node2,blk2裏面有node2,node3,blk3裏面有node3,node1,客戶端知道後開始讀取
secondary namenode與namenode通信流程
namenode裏面存儲大量鏡像文件(Fsimage)和日誌文件(Edits),但是隨着時間的推移,日誌會佔很大的空間,這時候將鏡像文件及日誌文件給secondary namenode ,secondary namenode 將鏡像文件和日誌文件進行壓縮,合併成新的鏡像文件,再趁namenode不注意,傳給mamemode作爲namenode的鏡像文件
還有一個問題!HDFS的容量受誰的影響?
當Datanode掛掉或者不足時,會將新的Datanode掛到namenode下,會無限掛嗎?不會!因爲每掛一個datanode,會將150元數據放在大哥Namenode那裏,所以說,Namenode大小限制着HDFS容量,當然這是主要原因,還有諸多原因。
三:HDFS中常用命令
-help 功能:輸出這個命令參數手冊
-ls 功能:顯示目錄信息 示例: hadoop fs -ls hdfs://hadoop-server01:9000/ 備註:這些參數中,所有的hdfs路徑都可以簡寫 -->hadoop fs -ls / 等同於上一條命令的效果
-mkdir 功能:在hdfs上創建目錄 示例:hadoop fs -mkdir -p /aaa/bbb/cc/dd
-moveFromLocal 功能:從本地剪切粘貼到hdfs 示例:hadoop fs - moveFromLocal /home/hadoop/a.txt /aaa/bbb/cc/dd
-moveToLocal 功能:從hdfs剪切粘貼到本地 示例:hadoop fs - moveToLocal /aaa/bbb/cc/dd /home/hadoop/a.txt
--appendToFile 功能:追加一個文件到已經存在的文件末尾 示例:hadoop fs -appendToFile ./hello.txt hdfs://hadoop-server01:9000/hello.txt 可以簡寫爲: hadoop fs -appendToFile ./hello.txt /hello.txt
-cat 功能:顯示文件內容 示例:hadoop fs -cat /hello.txt
-tail 功能:顯示一個文件的末尾 示例:hadoop fs -tail /weblog/access_log.1
-text 功能:以字符形式打印一個文件的內容 示例:hadoop fs -text /weblog/access_log.1
-chgrp -chmod -chown 功能:linux文件系統中的用法一樣,對文件所屬權限 示例: hadoop fs -chmod 666 /hello.txt hadoop fs -chown someuser:somegrp /hello.txt
-copyFromLocal 功能:從本地文件系統中拷貝文件到hdfs路徑去 示例:hadoop fs -copyFromLocal ./jdk.tar.gz /aaa/
-copyToLocal 功能:從hdfs拷貝到本地 示例:hadoop fs -copyToLocal /aaa/jdk.tar.gz
-cp 功能:從hdfs的一個路徑拷貝hdfs的另一個路徑 示例: hadoop fs -cp /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2
-mv 功能:在hdfs目錄中移動文件 示例: hadoop fs -mv /aaa/jdk.tar.gz /
-get 功能:等同於copyToLocal,就是從hdfs下載文件到本地 示例:hadoop fs -get /aaa/jdk.tar.gz
-getmerge 功能:合併下載多個文件 示例:比如hdfs的目錄 /aaa/下有多個文件:log.1, log.2,log.3,... hadoop fs -getmerge /aaa/log.* ./log.sum
-put 功能:等同於copyFromLocal 示例:hadoop fs -put /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2
-rm 功能:刪除文件或文件夾 示例:hadoop fs -rm -r /aaa/bbb/
-rmdir 功能:刪除空目錄 示例:hadoop fs -rmdir /aaa/bbb/ccc
-df 功能:統計文件系統的可用空間信息 示例:hadoop fs -df -h /
-du 功能:統計文件夾的大小信息 示例: hadoop fs -du -s -h /aaa/*
-count 功能:統計一個指定目錄下的文件節點數量 示例:hadoop fs -count /aaa/
-setrep 功能:設置hdfs中文件的副本數量 示例:hadoop fs -setrep 3 /aaa/jdk.tar.gz