HDFS原理概念掃盲


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM