1、概述
hdfs文件系統主要設計為了存儲大文件的文件系統;如果有個TB級別的文件,我們該怎么存儲呢?分布式文件系統未出現的時候,一個文件只能存儲在個服務器上,可想而知,單個服務器根本就存儲不了這么大的文件;退而求其次,就算一個服務器可以存儲這么大的文件,你如果想打開這個文件,效率會高嗎
hdfs的出現就是為了解決上面的問題
hdfs為了滿足大文件的存儲和可讀性,對數據進行切成多個小塊進行存儲,同時為了保證數據的可靠性,又對每個小塊數據做復制,然后分別存儲到多個節點中
hdfs2.7.3后,默認每個塊的大小是128MB,在hdfs1.0的時候,默認每個塊的大小是64MB
可以通過修改hdfs的配置文件自定義塊大小
hdfs-site.xml文件中的dfs.blocksize
默認每個塊的副本數是3,可以通過修改hdfs的配置文件自定義副本數
hdfs-site.xml的dfs.replication
二、hdfs的結構體系
hdfs是一個分布式的文件系統,采用主從(master/slave)的結構體系,一個hdfs集群由NameNode和多個datanode組成,其中namenode作為主節點,DataNode為從節點
Namenode簡稱NN
DataNode簡稱DN
NN的作用
a、存儲元數據信息
b、元數據存儲兩份,一份在內存中,一份在硬盤中
c、保存文件、block、datanode的映射關系
DN的作用
a、存儲block信息
b、block存儲在硬盤中
c、維護block和文件的映射關系
數據存儲在內存中是為了讀取性能,保證效率,數據存儲在硬盤中,為了持久化數據,保證數據不丟失
三、hdfs的優缺點
1、hdfs的優點
a、支持超大文件
支持超大文件,這里的超大文件幾百MB,幾百GB,甚至TB級別大小的文件,一般來說hadoop的文件系統會存儲TB級別或者 PB級別的數據,所以在企業節點中,數據節點可能有上千個
b、檢測和快速 應對 硬件故障
在集群中 環境中,硬件故障是常見的問題,因為 有上千台服務器,這樣會導致高故障率,因此故障檢測和自動 恢復 是hdfs文件系統 的一個設計目標
c、流式數據訪問
Hdfs的數據處理規模比較大,應用一次要 訪問大量的 數據,同時這些應用一般都是批量處理,而不是用戶交互式 處理,應用程序能以流的形式訪問數據集,主要是數據的吞吐量,而不是訪問速度;適合做離線數據的處理
d、簡化的一致性模型
大部分 hdfs操作文件時,需要一次 寫入,多次讀取,在 hdfs文件系統中,一個文件塊一旦經過 創建,寫入,關閉后就不允許 修改了,在hdfs2.7后 ,才允許對block進行追加修改,但是不能改變已有的數據,這樣簡單的一致性模型,保證數據操作的簡單化
e、高容錯性
數據自動保存多個 副本,副本丟失自動恢復
f、可構建在廉價的機器上
構建在廉價的機器上,可以啟動通過擴展機器 個數里線性提高存儲能力
2、hdfs的缺點
a、低延遲數據訪問
低延遲數據 ,如果用戶進行交互的應用,比如京東,需要數據在毫秒后者秒級范圍內得到響應,由於 hadoop對高吞吐 模型 做了優化,犧牲了獲取數據的延遲,所以對於低延時的應用,不適合 用hadoop,而且hdfs的數據也不是結構化的數據
b、不適合大量小文件
Hdfs支持超大的文件,是通過數據分別在不同的數據節點,數據的元數據保存在namenode上,namenode的內存大小決定了hdfs可以保存的文件數量,雖然現在 內存已經很大,但是大量的 小文件還是會 影響namenode的節點性能,每個block會占用一片內存空間
c、不支持多次寫入文件,修改文件
為了保證吞吐量,設計為這樣
四、hdfs的技術細節
1、Block
數據塊(block)是hdfs存儲文件的基本單位
在hdfs中,有一個特別重要的概念,數據塊(block),前面介紹過,在hdfs存儲的文件都是超大數據的文件,我們可以把這個超大規模的文件以一個標准切分成幾塊,分別存儲到不同的磁盤上,這個標准就是block
a、為了存儲大文件,一個服務器很難存儲超大型的文件,拆分的話,文件塊可以保存在不同的磁盤,在hdfs文件系統中,一個文件可以分成不同的block存儲在不同的磁盤上
b、簡化存儲系統,這樣就不需要管理文件,而是直接管理文件塊就可以了
c、有利於數據的復制,在hdfs系統中,一個block塊一般會復制三份(可以修改),比如復制一個1TB的數據和復制多個128MB的文件復制哪個更快?
對於一個文件而言,一個block id從0開始,按照固定的大小,順序對文件進行划分和編號,划分好的每一塊稱一個block。Hdfs默認的block的大小是128MB,所以一個256MB的文件,共有256/128=2個塊
不同於普通的文件系統(比如ext4或者ntfs),hdfs中,如果一個文件小於一個數據塊的大小,並不用占用整個數據存儲空間,而是僅僅會占用文件實際大小的空間
2、Namenode
Namenode是維護hdfs中的元信息,包括文件和block之間的映射關系,block數量的信息,block和datanode之間的關系信息,數據格式參照入下
Filename replicas block-ids id2host
/test/log,3,{b1,b2},{b1:[host0,host1,host2]} ,{b2:[host3,host4,host5]}
Namenode中的元數據信息存儲在內存/磁盤中,內存中為實時信息,磁盤中為數據的持久化存儲使用使用
在磁盤中存儲的信息主要下面兩個
fsimage:元數據的鏡像文件,存儲namenode元數據信息
edit:操作日志文件(比如你上次,追加內容,這里只有寫操作的日志,讀操作不會記錄)
下面重點講一下這2個文件流程
上面的流程如果明白了,就會發現有2個問題
a、一般namenode會持續運行,不會被啟動,那么edit文件會增長很大,這個時候就不好管理
b、如果edit文件增長到很大,那么每次namenode啟動合並edit文件和fsimage就會很久,那namenode啟動就會很慢
這個時候就有了SNN(second NameNode)
聽名字,大家以為SNN是NN的熱備份,其實SNN是NN的協助者,幫助進行元數據合並的
a、SNN會定時通過http的get方法從NN獲取最新的edit和fsimage文件
b、然后NN會生成一個空的edit文件,該文件繼續接受client的i寫請求操作日志
c、SNN拿到最新的edit文件和fsimage文件,進行合並,生成最新的fsimage文件
d、SNN通過http的post方法把最新的fsimage文件發送到NN
e、這樣就把上面那2個文件解決了
觸發checkpoint的條件有3個
a、默認是3600s合並一次,可以通過修改fs.checkpoint.period自定義
b、根據edit.log文件的大小觸發合並,默認是64MB會觸發合並,可以通過修改fs.checkpoint.size自定義
3、Datanode
在hadoop中,數據是存放在datanode上面的,是以block的形式存儲的,datanode節點會不斷的向namenode節點發送心跳報告,初始化,每個數據節點將當前存儲的數據告知namenode節點,通過向namenode主動發送心跳保持聯系,3s會發送一次
Datanode節點在工作的過程中,數據節點仍會不斷的更新namenode節點與之對應的元數據信息,並接受來自namenode節點的指令,創建,移動或者刪除本地磁盤上的數據塊
如果10min都沒有收到nd的心跳,則認為其已經掛了,並copy其上的block到其他dn
五、hdfs的執行流程
1、讀數據流程
a、client向遠程namenode發起讀請求
b、NN會視情況返回文件的部分或者全部block列表,對於每個block,namenode都會返回該block的地址和副本的DN的地址
c、客戶端會選取最接近的DN來讀取block
d、讀取完當前的block的數據后,關閉與當前的DN的連接,並為讀取下一個block尋找最佳的DN
e、當讀完列表的block后,且文件讀取還沒有結束,客戶端會繼續向NN獲取下一批的block列表
f、讀取完一個block都會進行checksum驗證,如果讀取的時候出現錯誤,client會通知NN,然后在從下一個擁有該block塊的DN繼續讀取數據
2、寫數據流程
a、client向namenode發起寫請求
b、NN會檢查路徑是否存在、權限是否正確、文件是否存在
c、條件滿足后,client開始寫入文件,首先開發庫會將文件拆分成多個packets,並在內部以數據隊列的形式來管理這些packet,並向NN申請新的blocks,獲取用來存儲block和副本的DN的列表,
d、開始已經pipiline(管道)的形式將packet寫入到第一個DN中,當第一個DN寫入成功后,在將其傳遞給下一個DN,直到最后一個DN存儲完成
e、然后開始上傳下一個packet
3、刪除流程
a、現在NN上執行節點名字的刪除
b、當NN上執行delete方式時,他這是標記操作涉及需要被刪除的數據塊,而不是主動聯系這些數據塊所在的DN節點
c、當保存這些數據庫的DN節點向NN節點發送心跳時,在心跳應答里,NN會向DN發出指令,從而把數據刪除
d、所以在執行delete方法后一段時間內,數據塊才會被刪除掉
六、hdfs常見命令
1、查看當前的目錄信息
[root@abdi1 current]# hdfs dfs -ls / Found 9 items drwxrwxrwt - yarn hadoop 0 2019-12-03 09:59 /app-logs drwxr-xr-x - yarn hadoop 0 2019-12-03 09:56 /ats drwxr-xr-x - hdfs hdfs 0 2019-12-03 09:57 /atsv2 drwxr-xr-x - hdfs hdfs 0 2019-12-03 09:56 /hdp drwxr-xr-x - mapred hdfs 0 2019-12-03 09:56 /mapred drwxrwxrwx - mapred hadoop 0 2019-12-03 09:58 /mr-history drwxr-xr-x - hdfs hdfs 0 2019-12-03 09:57 /services drwxrwxrwx - hdfs hdfs 0 2019-12-03 09:56 /tmp drwxr-xr-x - hdfs hdfs 0 2019-12-03 09:57 /user
2、創建目錄
[root@abdi1 current]# hdfs dfs -mkdir /test [root@abdi1 current]# hdfs dfs -ls / Found 10 items drwxrwxrwt - yarn hadoop 0 2019-12-03 09:59 /app-logs drwxr-xr-x - yarn hadoop 0 2019-12-03 09:56 /ats drwxr-xr-x - hdfs hdfs 0 2019-12-03 09:57 /atsv2 drwxr-xr-x - hdfs hdfs 0 2019-12-03 09:56 /hdp drwxr-xr-x - mapred hdfs 0 2019-12-03 09:56 /mapred drwxrwxrwx - mapred hadoop 0 2019-12-03 09:58 /mr-history drwxr-xr-x - hdfs hdfs 0 2019-12-03 09:57 /services drwxr-xr-x - root hdfs 0 2019-12-09 16:31 /test drwxrwxrwx - hdfs hdfs 0 2019-12-03 09:56 /tmp drwxr-xr-x - hdfs hdfs 0 2019-12-03 09:57 /user
3、上傳文件到hdfs
[root@abdi1 current]# hdfs dfs -put ./aaaaaaaa /test [root@abdi1 current]# hdfs dfs -ls /test Found 1 items -rw-r--r-- 3 root hdfs 0 2019-12-09 16:32 /test/aaaaaaaa
4、下載文件到本地文件系統
[root@abdi1 current]# hdfs dfs -get /test/aaaaaaaa / [root@abdi1 current]# ls / aaaaaaaa bin boot cgroups_test dev etc home lib lib64 lost+found media mnt opt proc root run sangfor sbin srv sys tmp usr var
5、刪除hdfs的文件,默認會把文件放到回收站中
[root@abdi1 current]# hdfs dfs -rm /test/aaaaaaaa 19/12/09 16:35:18 INFO fs.TrashPolicyDefault: Moved: 'hdfs://abdi1/test/aaaaaaaa' to trash at: hdfs://abdi1/user/root/.Trash/Current/test/aaaaaaaa [root@abdi1 current]# hdfs dfs -ls /test
6、從hdfs的一個目錄拷貝到另外一個目錄
[root@abdi1 current]# hdfs dfs -put ./aaaaaaaa /test [root@abdi1 current]# hdfs dfs -mkdir /test1 [root@abdi1 current]# hdfs dfs -ls /test1 [root@abdi1 current]# hdfs dfs -ls /test Found 1 items -rw-r--r-- 3 root hdfs 0 2019-12-09 16:36 /test/aaaaaaaa [root@abdi1 current]# hdfs dfs -cp /test/aaaaaaaa /test1 [root@abdi1 current]# hdfs dfs -ls /test1 Found 1 items -rw-r--r-- 3 root hdfs 0 2019-12-09 16:37 /test1/aaaaaaaa [root@abdi1 current]#
7、查看文件內容
[root@abdi1 current]# echo aaaa >> c.txt [root@abdi1 current]# cat c.txt aaaa [root@abdi1 current]# hdfs dfs -put ./c.txt /test [root@abdi1 current]# hdfs dfs -cat /test/c.txt aaaa