Namenode
是整個文件系統的管理節點。它維護著整個文件系統的文件目錄樹,文件/目錄的元信息metadate和每個文件對應的數據塊列表。
功能:接收用戶的操作請求。
metadate信息包括:
1、文件的owership和permission。
2、文件包含哪些block塊
3、block保存在哪個DataNode(由DataNode啟動時上報)
metadate存儲到磁盤文件名為“fsimage”。
warn:block的位置信息不回保存到fsimage上。在DataNode啟動時上報,存在內存里。
文件位置:
?hdfs-default.xml的dfs.namenode.name.dir 屬性(hadoop-hdfs-2.7.2.jar ?/ ?hdfs-default.xml)
<property><name>dfs.namenode.name.dir</name><value>file://${hadoop.tmp.dir}/dfs/name</value><description>Determines where on the local filesystem the DFS name nodeshould store the name table(fsimage). If this is a comma-delimited listof directories then the name table is replicated in all of thedirectories, for redundancy. </description>
</property>
${hadoop.tmp.dir} 配置在 ?core-site.xml?中
<property><name>hadoop.tmp.dir</name><value>/home/hadoop_data</value>
</property>
metadate信息保存磁盤包含:
1、fsimage:元數據鏡像文件。存儲某一時段NameNode內存元數據信息,無block位置信息。
2、edits:metadate操作日志文件
3、fstime:保存最近一次checkpoint的時間。
查看NameNode內容
方式一:webhdfs查看
命令:hdfs oiv -i xxx -o?
Usage: bin/hdfs oiv [OPTIONS] -i INPUTFILE -o OUTPUTFILE
Offline Image Viewer
View a Hadoop fsimage INPUTFILE using the specified PROCESSOR,
saving the results in OUTPUTFILE.The oiv utility will attempt to parse correctly formed image files
and will abort fail with mal-formed image files.The tool works offline and does not require a running cluster in
order to process an image file.The following image processors are available:* XML: This processor creates an XML document with all elements ofthe fsimage enumerated, suitable for further analysis by XMLtools.* FileDistribution: This processor analyzes the file sizedistribution in the image.-maxSize specifies the range [0, maxSize] of file sizes to beanalyzed (128GB by default).-step defines the granularity of the distribution. (2MB by default)* Web: Run a viewer to expose read-only WebHDFS API.-addr specifies the address to listen. (localhost:5978 by default)* Delimited (experimental): Generate a text file with all of the elements commonto both inodes and inodes-under-construction, separated by adelimiter. The default delimiter is \t, though this may bechanged via the -delimiter argument.Required command line arguments:
-i,--inputFile <arg> FSImage file to process.Optional command line arguments:
-o,--outputFile <arg> Name of output file. If the specifiedfile exists, it will be overwritten.(output to stdout by default)
-p,--processor <arg> Select which type of processor to applyagainst image file. (XML|FileDistribution|Web|Delimited)(Web by default)
-delimiter <arg> Delimiting string to use with Delimited processor.
-t,--temp <arg> Use temporary dir to cache intermediate result to generateDelimited outputs. If not set, Delimited processor constructsthe namespace in memory before outputting text.
-h,--help Display usage information and exit
實例:
?hdfs oiv -i fsimage_0000000000000000162 -o fsimage_000000000000000016_cat
16/08/12 18:46:54 INFO offlineImageViewer.FSImageHandler: Loading 2 strings
16/08/12 18:46:54 INFO offlineImageViewer.FSImageHandler: Loading 18 inodes.
16/08/12 18:46:54 INFO offlineImageViewer.FSImageHandler: Loading inode references
16/08/12 18:46:54 INFO offlineImageViewer.FSImageHandler: Loaded 0 inode references
16/08/12 18:46:54 INFO offlineImageViewer.FSImageHandler: Loading inode directory section
16/08/12 18:46:54 INFO offlineImageViewer.FSImageHandler: Loaded 11 directories
16/08/12 18:46:54 INFO offlineImageViewer.WebImageViewer: WebImageViewer started. Listening on /127.0.0.1:5978. Press Ctrl+C to stop the viewer.
hadoop會啟動內置的tomcat。監聽端口 127.0.0.1:5978
瀏覽器訪問webhdfs方式見博客:http://blog.csdn.net/zengmingen/article/details/52189857
SecureCRT ?clone session 執行:hdfs dfs -ls ?-R webhdfs://127.0.0.1:5978/
drwx------ - hadoop supergroup 0 2016-04-14 22:19 webhdfs://127.0.0.1:5978/tmp
drwx------ - hadoop supergroup 0 2016-04-14 22:19 webhdfs://127.0.0.1:5978/tmp/hadoop-yarn
drwx------ - hadoop supergroup 0 2016-04-14 22:19 webhdfs://127.0.0.1:5978/tmp/hadoop-yarn/staging
drwx------ - hadoop supergroup 0 2016-04-14 22:19 webhdfs://127.0.0.1:5978/tmp/hadoop-yarn/staging/hadoop
drwx------ - hadoop supergroup 0 2016-04-14 22:20 webhdfs://127.0.0.1:5978/tmp/hadoop-yarn/staging/hadoop/.staging
drwxr-xr-x - hadoop supergroup 0 2016-04-14 22:19 webhdfs://127.0.0.1:5978/tmp/hadoop-yarn/staging/history
drwxrwxrwt - hadoop supergroup 0 2016-04-14 22:19 webhdfs://127.0.0.1:5978/tmp/hadoop-yarn/staging/history/done_intermediate
drwxrwx--- - hadoop supergroup 0 2016-04-14 22:20 webhdfs://127.0.0.1:5978/tmp/hadoop-yarn/staging/history/done_intermediate/hadoop
-rwxrwx--- 1 hadoop supergroup 33303 2016-04-14 22:20 webhdfs://127.0.0.1:5978/tmp/hadoop-yarn/staging/history/done_intermediate/hadoop/job_1460643564332_0001-1460643581404-hadoop-wcount.jar-1460643608082-1-1-SUCCEEDED-default-1460643592087.jhist
-rwxrwx--- 1 hadoop supergroup 349 2016-04-14 22:20 webhdfs://127.0.0.1:5978/tmp/hadoop-yarn/staging/history/done_intermediate/hadoop/job_1460643564332_0001.summary
-rwxrwx--- 1 hadoop supergroup 115449 2016-04-14 22:20 webhdfs://127.0.0.1:5978/tmp/hadoop-yarn/staging/history/done_intermediate/hadoop/job_1460643564332_0001_conf.xml
drwxr-xr-x - hadoop supergroup 0 2016-04-14 22:19 webhdfs://127.0.0.1:5978/wc
drwxr-xr-x - hadoop supergroup 0 2016-04-14 22:20 webhdfs://127.0.0.1:5978/wc/output
-rw-r--r-- 1 hadoop supergroup 0 2016-04-14 22:20 webhdfs://127.0.0.1:5978/wc/output/_SUCCESS
-rw-r--r-- 1 hadoop supergroup 36 2016-04-14 22:20 webhdfs://127.0.0.1:5978/wc/output/part-r-00000
drwxr-xr-x - hadoop supergroup 0 2016-04-14 00:58 webhdfs://127.0.0.1:5978/wc/srcdata
-rw-r--r-- 1 hadoop supergroup 44 2016-04-14 00:58 webhdfs://127.0.0.1:5978/wc/srcdata/word.log
方式二:導出到xml(其他文件)查看
命令:hdfs oiv -p XML -i xxxx -o xxxx.xml(XML 必須大寫)
實例:hdfs oiv -p XML -i fsimage_0000000000000000162 -o fsimage_0000000000000000162.xml
命令:?cat fsimage_0000000000000000162.xml 就能查看內容了。
查看edtis內容
方式與查看fsimage不同
命令:hdfs oev -i xxxx ?-o xxx.xml ? (default xml ?file)
實例:hdfs oev -i edits_0000000000000000163-0000000000000000163 -o edits_0000000000000000163-0000000000000000163.xml
命令:?cat edits_0000000000000000163-0000000000000000163.xml
<?xml version="1.0" encoding="UTF-8"?>
<EDITS><EDITS_VERSION>-63</EDITS_VERSION><RECORD><OPCODE>OP_START_LOG_SEGMENT</OPCODE><DATA><TXID>163</TXID></DATA></RECORD>
</EDITS>
SecondaryNameNode(SNN)
-當數據很多時,NN的metadate也會很大,當matedate寫入磁盤時,會帶來NN機子的IO使用較高,給NN增加壓力
因而分配一個助手。http://blog.csdn.net/zengmingen/article/details/51115802
Datanode
提供真實文件數據的存儲服務。
1、文件塊(block):最基本的存儲單元。對于文件內容而言,一個文件的長度大小是size,那么從文件的0偏移開始,按照固定的大小,順序對文件進行劃分并編號,劃分好的每一個塊稱為一個block,hdfs默認block大小是128MB,一個256MB文件,共有256/128=2個block。
不同于普通文件系統的是,HDFS中,如果一個文件小于一個數據塊的大小,并不占用整個數據塊存儲空間。
hdfs有append追加功能,但一般都不用,追加會改變block的數量,block又有副本,成本太高。
2、Replication。多復本。默認是三個。
在hdfs-site.xml的dfs.replication屬性
<configuration><property><name>dfs.replication</name><value>1</value>
</property></configuration>
warn
1、如果副本數設置為3,但datanode機器只有2臺,那整個hadoop是不能工作存不了數據的。一個datanode節點不能有兩個相同內容的block。
2、啟動DataNode線程時會向NameNode匯報block信息。
3、通過向NameNode發送心跳保持與其聯系(3秒一次),如果NameNode 10分鐘沒有收到DataNode心跳,則認為其已經lost,并copy其上的block(其他DataNode的相同副本)到其他DataNode。
Block的副本放置策略
第一個副本:放置在上傳文件的DataNode上。
如果是集群外提交,則隨機選擇一臺磁盤不太滿,cpu不太忙的機子。
第二個副本:放置在第一個副本不同的機架的機子上。
第三個副本:放置在與第二個副本相同機架不同機子上。
更多副本:隨機節點。
數據存儲:staging
數據存儲:讀文件解析
步驟解析:
1、首先調用FileSystem對象的open方法,其實是一個DistributedFileSystem的實例。
2、DistributedFileSystem通過RPC獲得文件的第一批block的locations,同一block按照重復數(replication)會返回多個locations,這些locations按照hadoop拓撲結構排序,距離客戶端近的排在前面。
3、前兩步會返回一個FSDataInputStream對象,該對象會被封裝成DFSInputStream對象,DFSInputStream可以方便的管理datanode和namenode數據流。客戶端調用read方法,DFSInputStream最會找出離客戶端最近的datanode并連接。
4、數據從datanode源源不斷的流向客戶端。
5、如果第一塊的數據讀完了,就會關閉指向第一塊的datanode連接,接著讀取下一塊。這些操作對客戶端來說是透明的,客戶端的角度看來只是讀一個持續不斷的流。
6、如果第一批block都讀完了,DFSInputStream就會去namenode拿下一批blocks的location,然后繼續讀,如果所有的塊都讀完,這時就會關閉掉所有的流。
warn:
1、如果在讀數據的時候,DFSInputStream和datanode的通訊發生異常,就會嘗試正在讀的block的排第二近的datanode,并且會記錄哪個datanode發生錯誤,剩余的blocks讀的時候就會直接跳過該datanode。DFSInputStream也會檢查block數據校驗,如果發現一個壞的block,就會先報告到namenode節點,然后DFSInputStream在其他的datanode上讀該block的鏡像。
2、該設計的方向就是客戶端直接連接datanode來檢索數據并且namenode來負責為每一個block提供最優的datanode,namenode僅僅處理block location的請求,這些信息都加載在namenode的內存中,hdfs通過datanode集群可以承受大量客戶端的并發訪問。
數據存儲:寫文件解析
步驟解析:
1.客戶端通過調用DistributedFileSystem的create方法創建新文件。
2.DistributedFileSystem通過RPC調用namenode去創建一個沒有blocks關聯的新文件,創建前,namenode會做各種校驗,比如文件是否存在,客戶端有無權限去創建等。如果校驗通過,namenode就會記錄下新文件,否則就會拋出IO異常。
3.前兩步結束后會返回FSDataOutputStream的對象,與讀文件的時候相似,FSDataOutputStream被封裝成DFSOutputStream.DFSOutputStream可以協調namenode和datanode。客戶端開始寫數據到DFSOutputStream,DFSOutputStream會把數據切成一個個小packet,然后排成隊列data quene。
4.DataStreamer會去處理接受data quene,他先問詢namenode這個新的block最適合存儲的在哪幾個datanode里(參考第二小節),比如重復數是3,那么就找到3個最適合的datanode,把他們排成一個pipeline.DataStreamer把packet按隊列輸出到管道的第一個datanode中,第一個datanode又把packet輸出到第二個datanode中,以此類推。
5.DFSOutputStream還有一個對列叫ack quene,也是有packet組成,等待datanode的收到響應,當pipeline中的所有datanode都表示已經收到的時候,這時akc quene才會把對應的packet包移除掉。
6.客戶端完成寫數據后調用close方法關閉寫入流。
7.DataStreamer把剩余得包都刷到pipeline里然后等待ack信息,收到最后一個ack后,通知datanode把文件標示為已完成。
warn:
如果在寫的過程中某個datanode發生錯誤,會采取以下幾步:
1) pipeline被關閉掉;
2)為了防止防止丟包ack quene里的packet會同步到data quene里;
3)把產生錯誤的datanode上當前在寫但未完成的block刪掉;
4)block剩下的部分被寫到剩下的兩個正常的datanode中;
5)namenode找到另外的datanode去創建這個塊的復制。當然,這些操作對客戶端來說是無感知的。
warn:
另外要注意得一點,客戶端執行write操作后,寫完得block才是可見的,正在寫的block對客戶端是不可見的,只有調用sync方法,客戶端才確保該文件被寫操作已經全部完成,當客戶端調用close方法時會默認調用sync方法。是否需要手動調用取決你根據程序需要在數據健壯性和吞吐率之間的權衡。