一、基礎知識(里面的內容包含大部分的Hadoop的內容,耐心的看完,肯定有收獲,如有不同可留言或者上某度)
1、Hadoop生態系統介紹
(1)HBase
Nosql 數據庫,key-value存儲
最大化利用內存
(2)HDFS
簡介:Hadoop distribute file system 分布式文件系統
最大化利用磁盤
HDFS的設計原則:
文件以塊(block)方式存儲,默認塊(64M)(如果一個文件沒有64M,仍然占用一個block,但是物理內存可能沒有沒有64M),也可以自定義
通過副本機提高可靠度和讀取吞吐量
每個區塊至少分到三台DataNode上
單一master(NameNode)來協調存儲元數據(metadata)單點故障? 一般是standby nameNode 或者采用NFS服務避免單點故障
客戶端對文件沒有緩存機制(No data caching)
NameNode主要功能提供名稱查詢服務,它是一個jetty服務器
NameNode保存metadata信息包括
(I)文件owership 和Permissions
(II)文件包含哪些塊
(III)Block保存在哪個DataNode(由DataNode啟動時上報)
NameNode的metadata信息在啟動后會加載到內存
metadata存儲在磁盤文件名為"fsimage" 和Block 的位置信息不會保存到fsimage中(hdfs/namenode/current fsimage)
DataNode(DN):保存block,啟動DataNode線程的時候會向NN(NameNode)匯報block信息
通過向NN發送心跳保持與其聯系(3秒一次),如果NN 10分鍾沒有收到DN(DataNode)的心跳,則認為其已經lost,則copy其他的block 過來
Block的副本放置策略:
一般情況是保存三份:
第一份副本:放置在上傳文件的DN,如果是集群外提交,則隨機挑選一台磁盤不太滿,CPU不太忙的節點
第二份副本:放置在於第一個副本不同的機架的節點上
第三份副本:放置在和第二份副本同一個機架的另一個節點上(ps:一個NameNode帶動4000節點)
Block大小和副本數由Client端上傳文件HDFS時設置,其中副本數可以變更,Block是不可以再上傳后變更的
數據損壞處理(可靠性):
當DN讀取block的時候,它會計算checksum,如果計算后的checksum與block創建時值不一樣,說明該block已經損壞的
Client讀取其它DN上的block;NN標記該塊已經損壞,然后復制block達到預期設置的文件備份數
DN在其文件創建后三周驗證其checksum
SecondNameNode(SNN):(企業內很少使用,可以了解原理)(重點是fsimage和edits的機制)
將本地fsimage導入
是namenode的冷備份(無法做到自動的切換)
修改cluster所有的DN的NameNode地址
修改client端NameNode地址
or修改SNN IP為原NNIP
它的工作時幫助NN合並edits log 減少NN啟動的時間
fsimage和edits(面試經常問到的問題):
當edits文件很大的時候,NameNode在啟動的時候需要逐一每條的執行這些edits文件,這就嚴重影響到了整個HDFS的啟動時間,這問題在SecondaryNameNode機制將edits文件合並到fsimage中,使其得到解決,SecondaryNameNode的工作流程(fsimage和edits log):
1、SNN在一個checkpoint時間點和NameNode進行通信,請求NameNode停止使用edits文件記錄相關操作而是暫時將新的writes操作寫到新的文件edit.new來
2、SNN從NN上copy fsimage and edits ,通過HTTP Get的方式從NameNode中將fsimage和edits文件下載回來本地目錄中
3、SNN中合並edits和fsimage,SNN將從NameNode中下載回來的fsimage加載到內存中,然后逐條執行edits文件中的各個操作項,使得加載到內存中的fsimage中包含edites中的操作,這個過程就是所謂的合並了。
4、在SNN中合並完fsimage和edites文件后,需要將新的fsimage回傳到NameNode上,這個是通過HTTP Post方式進行的
5、NameNode將從SNN接受到的新的fsimage替換掉舊的fsimage,了,同時edites.new文件轉換了通常的edites文件,這樣edites文件的大小就得到了減少,SNN整個合並以及和NameNode
安全模式:
NameNode啟動的時候,首先將映像文件(fsimage)載入內存,並執行編輯日志(edits)中的各項操作
一旦在內存中成功建立文件系統元數據的映射,則創建一個新的fsimage文件,這個操作不需要secondaryNameNode和一個空的編輯日志
NameNode開始監聽RPC和Http請求
此刻namenode運行在安全模式,即namenode的文件系統對於客戶端來說是只讀的
系統中數據塊位置並不是有namenode維護的,而是以塊列表形式存儲在datanode中
查看namenode處於哪個狀態
Hadoop dfsadmin -safemode get
進入到安全模式(Hadoop)啟動的時候是在安全模式
hadoop dfsadmin -safemode enter
退出安全模式;
hadoop dfsadmin -safemode leave
HDFS的讀寫過程(Hadoop 學習的精髓部分,編程開發必備前提知識,沒有理由,必須學好^_^!):
(1)客戶端(client)用FileSystem的open()函數打開文件
(2)DisbutedFileSystem用RPC調用元數據節點,得到文件的數據塊信息
(3)對於每一個數據塊,元數據節點返回保存數據塊的數據節點的地址
(4)DistributedFileSystem返回FSDataInputStream給客戶端,用來讀取數據
(5)客戶端調用Stream的read()函數開始讀取數據
(6)DFSInputStream 連接保存此文件第一個數據塊的最近的數據節點
(7)Data從數據節點讀取到客戶端(client)
(8)當此數據塊讀取完畢時,DFSInputStream關閉和此數據節點的鏈接,然后連接此文件下一個數據最近的節點
(9)當客戶端讀取完畢數據的時候,調用FSDataInputStream的close函數
(10)在讀取數據的過程中,如果客戶端在於數據節點通信出現錯誤,則嘗試連接包含此數據庫的下一個數據節點
失敗的數據節點將被記錄,以后不再連接
寫文件的過程:
(1)客戶端調用creat()來創建文件
(2)DistributedFileSystem用RPC調用元數據節點,在文件系統的命名空間中創建一個新的文件
(3)元數據節點首先確定文件原來不存在,並且客戶端有創建文件的權限,然后創建新文件
(4)DistributedFileSystem返回DFSOutStream,客戶端用於寫數據
(5)客戶端開始寫入數據,DFSOutStream 將數據分成塊,寫入data queue
(6)Data Stream 將數據塊寫入pipeline中的第一個數據節點,第一個數據節點將數據塊發送給第二個數據節點,第二個數據節點將數據發送給第三個數據節點
(7)DFSOutStream為發出去的數據塊保存了ack queue,等待pipeline中的數據節點告知數據已經寫入
如果數據節點在寫入的過程中失敗:
關閉pipeline,將ack queue中的數據塊放入data queue的開始
當前的數據塊在已經寫入的數據節點中被元數據節點賦予新的標示,則錯誤節點重啟后能夠察覺其數據塊已經過時
,會被刪除
失敗的數據節點從pipeline中移除,另外的數據塊則寫入pipeline中的另外兩個數據節點
元數據節點則被通知此數據塊是復制塊數不足,將來會再創建第三份備份
當客戶端結束寫入數據,則調用stream的close函數,此操作將所有的數據塊寫入pipeline中的數據節點,並等待ack queue返回成功。最后通知元數據節點寫入完畢。
HDFS開發常用的命令(類shell語言):
創建一個文件夾:
Hadoop fs -mkdir 文件夾
eg:Hadoop fs -mkdir /usr/hadoop/myfile
(文件夾)
上傳一個文件:
Hadoop fs -put 文件 Hadoop的文件夾
eg:Hadoop fs -put /wordcount.jar /usr/hadoop/myfile
刪除文件
Hadoop fs -rm 文件
查看一個文件夾里面有哪些內容文件?
Hadoop fs -ls 文件
查看文件的內容
Hadoop fs -text/ 文件
Hadoop管理員常用命令:
Hadoop job -list 列出正在運行的job
hadoop job -kill<job_id> kill job
Hadoop fsck 檢查HDFS塊狀態,是否損壞
Hadoop dfsadmin -report 檢查HDFS塊狀態,包括DN信息
Hadoop distcp hsfs:/// hdfs:// 並行拷貝
(3)MapReduce
(1)編程模型,主要用來做數據的分析
(2)最大化利用CPU