mapreduce工作流程:
1、client提交數據到DFS,然后被分為多個split,然后通過inputformatter以key-value傳給jobTraker。jobTraker分配工作給多個map(taskTraker)。project師重寫map,在各個taskTraker上分別運行代碼任務。做到數據不動,代碼動(改革之中的一個)。真正實現代碼分布式。
2、tasktraker運行完代碼后,將結果通過上下文收集起來,再傳給reduce(也是taskTraker)。經過排序等操作,再運行project師重寫的reduce方法,終於將結果通過outputFormatter寫到DFS。
怎么理解分布式?
分布式是將資源分布存儲或者分布計算的統稱,分布式是指資源不再單一的再單獨的服務器上進行存儲或者計算,而是把一個數據拆分成小塊進行存儲,把多個節點一塊進行計算
hadoop 的組成部分
HDFS 分布式文件存儲系統
管理者:NameNode
工作者:DataNode
輔助者:SecondayNameNode
MapReduce 分布式離線存儲框架
Yarn Hadoop資源調度器
管理者:ResourceManager
工作者:NodeManager
HDFS副本存放機制
第1個副本存放在客戶端,如果客戶端不在集群內,就在集群內隨機挑選一個合適的節點進行存放;
第2個副本存放在與第1個副本同機架且不同節點,按照一定的規則挑選一個合適的節點進行存放;
第3個副本存放在與第1、2個副本不同機架且距第1個副本邏輯距離最短的機架,按照一定的規則挑選一個合適的節點進行存放;
Namenode作用
一:管理文件系統的元數據/名字空間/目錄樹
二:管理DataNode匯報的心跳日志/報告
三:管理數據與節點之間的映射關系(管理文件系統中每個文件/目錄的block塊信息)
DataNode作用
一:負責數據的讀寫操作
二:周期性的向NameNode匯報心跳日志/報告
三:執行數據流水線的復制
什么是機架感知?
通俗的來說就是nameNode通過讀取我們的配置來配置各個節點所在的機架信息
什么時候會用到機架感知?
數據的流水線復制和HDFS復制副本時
HDFS數據寫入流程?
一:client 發起文件上傳請求,通過 RPC 與 NameNode 建立通訊,NameNode檢查目標文件是否已存在,父目錄是否存在,返回是否可以上傳;
二:client 請求第一個 block 該傳輸到哪些 DataNode 服務器上;
三:NameNode 根據配置文件中指定的備份數量及副本放置策略進行文件分配,返回可用的 DataNode 的地址,如:A,B,C
四:client 請求 3 台 DataNode 中的一台 A 上傳數據(本質上是一個 RPC 調用,建立 pipeline),A 收到請求會繼續調用 B,然后 B 調用 C,將整個pipeline 建立完成,后逐級返回 client;
五:client 開始往 A 上傳第一個 block(先從磁盤讀取數據放到一個本地內存緩存),以 packet 為單位(默認 64K),A 收到一個 packet 就會傳給 B,B 傳給 C;A 每傳一個 packet 會放入一個應答隊列等待應答
六:數據被分割成一個個 packet 數據包在 pipeline 上依次傳輸,在pipeline 反方向上,逐個發送 ack(命令正確應答),最終由 pipeline中第一個 DataNode 節點 A 將 pipeline ack 發送給 client;
七:當一個 block 傳輸完成之后,client 再次請求 NameNode 上傳第二個block 到服務器
HDFS數據讀取流程?
一:client 發起文件讀取請求通過RPC與NameNode建立通訊,nameNode檢查文件位置,來確定請求文件 block 所在的位置
二:NameNode會視情況返回文件的部分或者全部block列表,對於每個block,NameNode 都會返回含有該 block 副本的 DataNode 地址;
三:這些返回的 DN 地址,會按照集群拓撲結構得出 DataNode 與客戶端的距離,然后進行排序,排序兩個規則:網絡拓撲結構中距離 Client 近的排靠前;心跳機制中超時匯報的 DN 狀態為 STALE,這樣的排靠后;
四:Client 選取排序靠前的 DataNode 來讀取 block,如果客戶端本身就是DataNode,那么將從本地直接獲取數據
五:底層上本質是建立 Socket Stream(FSDataInputStream),重復的調用父類 DataInputStream 的 read 方法,直到這個塊上的數據讀取完畢;
六:當讀完列表的 block 后,若文件讀取還沒有結束,客戶端會繼續向NameNode 獲取下一批的 block 列表;
七:讀取完一個 block 都會進行 checksum 驗證,如果讀取 DataNode 時出現錯誤,客戶端會通知 NameNode,然后再從下一個擁有該 block 副本的DataNode 繼續讀。
八:read 方法是並行的讀取 block 信息,不是一塊一塊的讀取;NameNode 只是返回Client請求包含塊的DataNode地址,並不是返回請求塊的數據;最終讀取來所有的 block 會合並成一個完整的最終文件。
HDFS數據完整性如何保證?
nameNode與DataNode會定期通過文件的校驗和檢查文件的完整性,如果發現某節點上的某文件校驗和不一致,會從其他節點上恢復損失的文件,從而保證數據的完整性
HDFS 特性?
優點
1、 存儲海量數據:HDFS可橫向擴展,其存儲的文件可以支持PB級數據
2、容錯性高:數據保存多個副本,副本丟失后自動恢復。
可構建在廉價(與小型機大型機對比)的機器上,實現線性擴展。(隨着節點數量的增加,集群的性能-計算性能和
存儲性能都會有所增加)
當集群增加新節點之后,namenode也可以感知,進行負載均衡,將數據分發和備份數據均衡到新的節點上。(負
載均衡:集群可將原本使用容量較高的節點上的數據自動寫入新的節點上,達到所有節點容量均勻)每個節點磁盤使
用容量百分比的差異可以人工設置。
3、大文件存儲: 數據分塊存儲,將一個大塊的數據切分成多個小塊的數據。
缺點
1、不能做到低延遲數據訪問:HDFS針對一次性獲取大量的數據做了優化,犧牲了小數據量快速查詢的性能。
2、多次寫入,一次讀取(擅長:HDFS適合一次寫入,多次讀取的場景。)
3、不支持多用戶的並行寫
4、不適合大量的小文件存儲
A: 由於namenode將文件系統的元數據存儲在內存中,因此該文件系統所能存儲的文件總數受限於namenode的內
存容量。
B: 元數據信息中每個文件、目錄和數據塊的存儲信息大約占150字節。(1G 數據存儲的元數據信息占用150字節 ,
1M的數據元數據信息占用150字節)
受限於內存,元數據信息的存儲機制導致無論數據多大,元數據信息中描述這個數據的信息都是150字節。
什么時候進入安全模式?
在集群重啟(二次啟動)的時候
安全模式有什么特點?
安全模式中只能讀取數據,不能修改數據
在安全模式下集群在做什么?
在安全模式下集群在進行恢復元數據,即在合並fsimage和edits log,並且接受datanode的心跳信息,
恢復block的位置信息,將集群恢復到上次關機前的狀態
如何進入/退出安全模式?
進入:hdfs dfsadmin -safemode enter
退出:hdfs dfsadmin -safemode leave
Fsimage 和 Edits 的多用是什么?
fsimage存儲的是系統最近一次關機前的集群狀態,edits是HDFS文件系統的所有操作日志
什么時候會使用Fsimage Edits?
1.在集群二次啟動時,會使用fsimage和edits合並進行恢復元數據
2.SecondayNameNode周期性的拉取fsimage和edits進行合並生成新的fsimage
SecondaryNamenode 的工作機制是什么?
使用httpGet從NameNode節點拷貝Fsimage和Edits文件---->將兩個文件導入內存進行合並操作生成一個新的Fsimage.ckpt文件----->
使用HttpPost將Fsimage.ckpt發送到NameNode節點----->重命名為Fsimage替換原先的Fsimage---------->原先的Edits生成Edits.new文件—>
將Edits替換為新的Edits.new
SecondaryNamenode存在的意義是什么?
一:進行Fsimage和Edits的合並操作,減少edits日志大小,加快集群的啟動速度
二:將Fsimage與Edits進行備份,防止丟失
SecondaryNamenode工作的觸發因素有哪些?
1.時間維度,默認一小時觸發一次 dfs.namenode.checkpoint.period :3600
2.次數維度,默認100萬次觸發一次 dfs.namenode.checkpoint.txns : 1000000
3.60秒檢查一次是否到達100萬
使用SNN的FSimage和Edits還原Namenode流程是什么?
進入到SNN的數據存儲文件夾----->將最新版本的Fsimage以及Edits拷貝至nameNode節點----->重啟集群
集群擴容
配置Hadoop 新節點需要做哪些准備?
1.配置JDK
2.配置SSH免密鑰
3.關閉防火牆
4.關閉selinux
5.修改主機名
6.修改hosts
集群添加一個節點的流程?
配置新增節點的Hosts
在配置文件目錄添加dfs.hosts白名單文件,文件中加入包括新增節點在內的所有節點
在hdfs.site.xml中配置白名單文件生效
<property> <name>dfs.hosts</name> <value>/export/install/hadoop-2.6.0-cdh5.14.0/etc/hadoop/dfs.hosts</value> </property>
配置slaves文件,將新增節點加入
刷新hdfs和yarn
hdfs dfsadmin -refreshNodes
yarn rmadmin -refreshNodes
如何合並小文件?
如果是下載:hadoop fs -getmerge 小文件目錄 下載的目錄
如果是追加一個文件到已經存在的文件末尾就是 hdfs dfs -appendToFile 文件 要追加末尾的文件
設置 開啟權限控制的key是什么?
dfs.permissions
使用java API 在hdfs創建一個全新的目錄的過程是?
//實例化Configuration
Configuration configuration = new Configuration();
//實例化Filesystem
FileSystem fileSystem = FileSystem.get(new URI(“hdfs://192.168.100.88:8082”),configuration);
//調用相應的API
boolean mkdirs = fileSystem.mkdirs(new Path(“目錄路徑”));