本節並不大算為大家講接什么是hadoop,或者hadoop的基礎知識因為這些知識在網上有很多詳細的介紹,在這里想說的是關於hdfs的相關內容。或許大家都知道hdfs是hadoop底層存儲模塊,專門用於存放數據,那么在進行文件上傳的時候hdfs是如何進行的呢?我們按照宏觀和微觀來進行相關解析工作。
首先需要向大家解釋如下幾個概念:
(1) secondaryNamenode: 其實起初我對SN的理解也和大部分人相同,認為SN是NN(nameNode)的一個實時熱備份實現HA,並且在一次筆試的過程中還寫錯了,尷尬,后台經過查看相關的書籍發現其實並不是這么一回事,SN主要是完成的Edits和fsImage的合並工作,以減少NN的工作壓力。對於錯誤的理解其實並不是沒有道理,現在版本的hadoop支持進行HA的實時備份。后面的章節后說。
(2) fsImage和edits: 雖然說不希望在這講一些概念,但是該說的還是得說。簡單的解釋: fsimage包含Hadoop文件系統中的所有目錄和文件idnode的序列化信息,其中對於文件包含了文件的修改時間、訪問時間、塊大小和組成一個文件塊信息等。對於文件夾而言包含的信息主要有修改時間、訪問控制權限等信息。而Edits文件主要是進行客戶端對文件操作的記錄,比如上傳新文件等。並且edits文件會定期與fsimage文件進行合並操作。
宏觀的寫入過程:
具體的流程如下:
1.首先是客戶端將文件進行分塊,分塊的大小標准按照配置文件中給定的大小。
2.然后客戶端通知namenode即將上傳文件,namenode創建制定目錄,並根據配置文件中指定的備份數量及機架感知原理進行文件分配,比如備份數量3由機架感知將3分文件分別存儲在機架1的host2,機架2的host1和host3中。
3. 客戶端與指定的datanode建立流傳輸通道,並向機架1中的host2進行文件傳輸,傳輸完成之后host2向機架2中的host1進行文件備份。host2備份完成之后將數據塊拷貝到同一個機架的host3中。
4.3台機器都完成這個過程之后host2,host1,host3分別向namenode發起通知說文件已經存儲完成。同時host2向客戶端發起通知。
5.客戶端收到host2返回的請求之后向namenode發起通知---已經完成數據寫入。則整個流程運行完成。