Hadoop實戰筆記


一、基礎知識(里面的內容包含大部分的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

 


免責聲明!

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



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