hdfs學習筆記

Hadoop總結

一、hadoop概述

1.谷歌的三篇論文:《bigtable》 《GFS》 《Mapreduce》
2.hadoop是一個分佈式存儲和分析計算框架
3.hadoop組成部分:
	1)hadoop common
	2)hdfs
	3) mapreduce
	4) yarn

二、hdfs設計思想

1.設計思想:
	1)分塊存儲,默認是128MB
	塊的大小:
		1.最小化尋址開銷時間 塊大小的選擇參考一秒鐘的傳輸速率 磁盤尋址時間在5~15ml 最優尋址時間是'一秒的百分之一'
    	2.節省內存的使用率 一個塊的元數據大約150字節。無論存儲的文件多大,都是佔用相同的內存,所以hdfs不適合存儲小文件
2.hdfs的優點:
	-高容錯性:副本冗餘策略
	-流式數據訪問:一次寫入,多次讀取,保證數據一致性
	-構建成本低
	-適合大數據集
3.hdfs的缺點:
	-高延遲
	-不適合存儲小文件
	-不適合併發寫入,文件隨即修改:目前僅支持一個寫者進行append操作。

三、hdfs的體系結構

1.hdfs採用的是master/slave主從架構,主要有四個部分組成:
								client 
								namenode 
								datanode 
								secondaryNamenode
2.namenode:中心服務器:
				-管理文件系統的命名空間和客戶端的訪問 並以fsimage 和editlog進行持久到本地
				-在內存中維護數據塊的映射信息,不會持久化到本地 block map
				-實現副本冗餘策略
				-處理客戶端的請求
3.datanode:
				-存儲數據
				-執行數據的讀寫操作
				-心跳機制 默認是3-block report
4.secondaryNamenode:
				-進行 fsimage 和 editlog 的合併
				-不能實時同步,不能作爲備份節點
5.client接口:
				-與namenode進行交互,獲取文件的存儲位置(讀/寫兩種操作)
				-與datanode進行交互,寫入或者讀取數據
				-上傳文件是分塊存儲,讀取是分片進行讀取  一個分片是一個maptask
6.fsimage:
				-命名空間鏡像,是文件系統元數據的永久檢查點,內部維護的是最近一次檢查點的文件系統樹和整棵樹內所有的所有文件和目錄的元數據。
7.editlog:		-編輯日誌文件:當hdfs文件系統進行操作產生的信息都會持久化到該文件中

三、hdfs的工作機制

1.開機啓動過程
	將fsimage加載到內存中->執行editlog中的操作->創建新的fsimage和editlog(hdfs的所有更新操作都會卸	 載editlog中)->等待datanode的 blockreport  就是 產生blockmap
2.安全模式
	namenode在開機啓動過程中,會進入安全模式,namenode的文件系統對於客戶端只是可讀的,不能進行其他操作。
	namenode在啓動後,等待datanode的blockreport 只有當namenode接收到該報告後,客戶端才能進行讀
3.心跳機制 heartbeat
	master啓動時開啓一個IPC服務,等待slave連接
	slave啓動後會主動連接ipc服務,每個三秒連接一次,並且彙報自己的信息
	master收到slave發送的信息,並通過心跳機制下發命令
	如果master長時間沒收到slave的信息就認爲slave掛掉了
	超時時間計算:2*recheck+10*heartbeat 默認是的是 10分30秒
4.檢查點機制
	secondarynamenode合併fsimage和editlog兩個文件的合併週期成爲檢查點機制
	過程:
		secondarynamenode請求namenode停止正在編輯的editlog,namenode會創建新的editlog,同時更新seed_txid文件。
		secondarynamenode通過http協議拿到namenode上方的fsimage和editlogh文件	
		secondarynamenode進行合併寫入新的文件 fsimage_x.ckpt文件中
		secondarynamenode將新文件發送給namenode
		namenode進行更名操作
5.機架感知
	網絡拓撲:在進行冗餘策略時,需要考慮網絡帶寬。存儲副本需要存儲在哪個工作節點,哪個機架?
	將網絡看成一棵樹,兩個節點之間的距離就是他們距離最近共同祖先的距離總和
	機架感知策略:第一個副本存放在client所處的節點上
				第二個與第一個不同機架,隨機選一個
				第三個與第二個相同機架,不同節點

四、hdfs的寫流程

1.client發送上傳請求到namenode
2.namenode收到請求,檢查元數據,目錄是否存在,檢查文件是否存在
3.檢查通過返回客戶端,否則拋出異常
4.客戶端收到結果開始分塊。客戶端向namenode請求上傳第一塊
5.namenode檢查節點的負載均衡情況,找到三臺機器 返回一組有序的節點信息 機架感知策略
6.客戶端與datanode1建立連接 三個節點之間互相建立連接 並返回信息 是否建立成功
7.客戶端收到建立成功的信息,開始寫日誌
8.將一塊的數據讀到內存中,按照packet的形式進行讀取,發送到datanode1,1發送到22發送到3
9.返回是否上傳成功的狀態
10.上傳成功,開始第二塊,循環2-911.上傳成功,客戶端通知namenode,更新元數據(將日誌在元數據中操作一遍)
細節:
1.如果在上傳過程中,dn3掛了怎麼處理? 	不處理,namenode等待區塊報告,最後進行備份策略 
2.dn3又啓動了,怎麼處理? 	dn3首先會向namenode註冊,發送區塊報告,namenode對比之前的數據,發現這是廢數據,直接刪除
3.要上傳第一個塊,在建立通道時,dn3掛了,怎麼處理? 這一次的分配無效,namenode重新分配三臺機器
4.在傳輸過程中,出現了丟包之類的怎麼處理?重傳(次數是有限制的,如果一直失敗則整個過程失敗)
具體處理:客戶端有兩個隊列,一個是待調度隊列,一個是調度隊列,packet在調度隊列中發送給待調度隊列和datanode1,當失敗時,會將等待隊列中的包拿過來重新進行發送,會有次數限制。如果發送成功,收到了成功信號,則等待隊列會刪除隊列中的packet.
5.如果block1,block2上傳成功了,到block3時失敗了,怎麼辦?在區塊報告時,刪除廢數據,namenode重新分配三個節點。
6.如果block1 block2 上傳成功了,但是block3上傳時,如果客戶端掛了,怎麼處理?namenode等待消息超時,判斷文件上傳失敗,清除廢文件。
1. 客戶端通過對DistributedFileSystem對象調用create()方法來新建文件
2. DistributedFileSystem對namenode創建一個RPC調用,在文件系統的命名空間中新建一個文件,此時該文件中還沒有相應的數據塊
3. namenode執行各種不同的檢查,以確保這個文件不存在以及客戶端有新建該文件的權限。如果檢查通過,namenode就會爲創建新文件記錄一條事務記錄(否則,文件創建失敗並向客戶端拋出一個IOException異常)。DistributedFileSystem向客戶端返回一個FSDataOuputStream對象,由此客戶端可以開始寫入數據,
4. 在客戶端寫入數據時,FSOutputStream將它分成一個個的數據包(packet),並寫入一個內部隊列,這個隊列稱爲“數據隊列”(data queue)。DataStreamer線程負責處理數據隊列,它的責任是挑選出合適存儲數據複本的一組datanode,並以此來要求namenode分配新的數據塊。這一組datanode將構成一個管道,以默認複本3個爲例,所以該管道中有3個節點.DataStreamer將數據包流式傳輸到管道中第一個datanode,該datanode存儲數據包並將它發送到管道中的第2個datanode,同樣,第2個datanode存儲該數據包並且發送給管道中的第三個datanode。DataStreamer在將一個個packet流式傳輸到第一個Datanode節點後,還會將此packet從數據隊列移動到另一個隊列確認隊列(ack queue)中。
5. datanode寫入數據成功之後,會爲ResponseProcessor線程發送一個寫入成功的信息回執,當收到管道中所有的datanode確認信息後,ResponseProcessoer線程會將該數據包從確認隊列中刪除。

五、hdfs的讀流程

1.客戶端請求下載數據  namenode
2.namenode 檢查元數據 ,數據存儲在哪些節點上面  返回的文件的元數據信息(塊順序 和位置)
3.客戶端與datanode建立連接  機架感知 就近原則 
4.下載塊數據
5循環3 4

六、檢查點流程

檢查點步驟
1.secondary申請checkpoint 
2.namenode收到請求後進行日誌回滾
3.secondary拉取 fsimage edits 進行合併(加載鏡像和日誌文件到內存中稱爲內存元數據)生成fsimage.checkpoint
4.將文件上傳到namenode。
5.namenode進行數據的校驗
6.將fsimage.checkpoint 改名 爲 fsimage.xxx
如果nemenode磁盤損壞,元數據是否能夠恢復?是否能完整恢復?
部分恢復:拿到secondary的fsimage
完整恢復:策略:一個主機上掛載了多個磁盤時。在配置文件中間將namenode元數據存儲的路徑設爲多個,採用的是
複製的策略,將fsimage和edits放到多個磁盤下 datanode的存儲路徑是擴展存儲空間

七、YARN

概念:yarn是hadoop的集羣資源管理系統。爲了改善mapreduce的實現,但是因爲有足夠的通用性,同樣支持其他的分佈式計算模式。
設計思想:將資源管理和作業監控/調度功能劃分成單獨的守護進程。其思想是擁有一個全局的ResourceManager和每個應用程序的ApplicationMaster。應用程序可以是單個作業,也可以是一組作業。
ResourceManager和NodeManager是yarn的兩個長期運行的守護進程。提供核心服務
1.ResourceManager:管理整個集羣上的所有資源分配,內部含有一個Scheduler(資源調度器)
2.NodeManager:是每臺機器的資源管理器,負責啓動和監視容器(container)的資源使用情況並向ResourceManager及其Scheduler報告使用情況
3.container:即集羣上可使用資源,包含cpu 內存,磁盤
4.ApplicationMaster:與ResourceManager協商資源,並與NodeManager一起執行和監視任務
a) yarn運行應用的過程
1.首先,客戶端聯繫ResourceManager,要求它運行一個aplicationMaster進程
2.ResourceManager找到一個能夠在容器中啓動applicationMaster的節點管理器
	2.1 找到一個NodeManager,該節點啓動一個Container
3.applicationMaster通過心跳機制向ResourceManager請求更多的容器資源
4.applicationMaster運行起來之後需要做什麼依賴於客戶端傳遞的應用
	-簡單的運算後直接返回結果給客戶端
	-請求更多容器進行分佈式計算

八、MapReduce

概念:Hadoop MapReruce是對Google提出的《Mapreduce》論文的開源實現。以可靠,容錯的方式運行在分佈式文件系統HDFS上的並行處理數據的編程模型。
核心思想:分而治之,移動計算不移動數據

MapTask的執行流程:
1.maptask調用FileInputFormat的getRecordReader讀取分片數據
2.每次得到kv對, k是行偏移量 v是一行的數據 每次的kv調用一次map函數 然後調用context.write()
3.寫出的數據交給收集器OutputCollector.collection()處理
4.將數據寫入環形緩衝區,並記錄起始位置,終止偏移量
5.當環形緩衝區內存達到80%,會進行溢寫操作,溢寫到磁盤中,溢寫過程中數據繼續寫入到剩餘的20%
6.在溢寫前要進行分區,然後在分區中進行排序 分區規則是 key.hash % reduceNumber 排序是快排
7.當有多個溢寫文件時,會兩兩進行合併 歸併排序

ReduceTask的執行流程:
1.數據按照分區規則發送到reduceTask
2.reducetask將多個maptask的數據進行合併 歸併排序
3.將key相同的進行分組
4.每一組調用一次reduce方法
5.reduceTask調用FileOutputFormat的write方法將數據寫出

shuffle流程:就是數據從map寫數據到環形緩衝區到reduce讀取數據合併

combiner函數:在不影響結果的前提下,減少網絡傳輸和磁盤IO.在map任務的輸出指定一個combiner函數,其實就是運行在map端的一個reduce函數。 注意:在不影響結果的前提下才可以使用 平均值之類的不合適

partitioner
1.分區器是在map輸出結果後 因此泛型是 k2,v2的類型
2.繼承 partitioner類型 

自定義分組器:WritableComparator  注意與自定義類型繼承的接口 WritableComparable compareTo
1.重寫compare方法

九、分片機制

概念:Hadoop將MapReduce的輸入數據分成等長的小數據塊 稱爲 分片
hadoop爲每一個分片構建一個單獨的map任務。
分片和塊的區別:分片是邏輯上的,分塊是物理上的
分片大小的選擇:
1.最佳分片大小應該和hdfs的塊大小一致
2.分片不能過大或者過小。
創建分片的過程:
1.獲取文件的大小和位置
2.判斷文件是否可以分片(壓縮格式有的可以進行分片,有的不可以)
3.獲取分片的大小
4.剩餘文件的大小/分片大小>1.1時,循環執行封裝分片信息
分片規則:
第一個分片讀到行尾再多讀一行
既不是第一個分行也不是最後一個分片第一行數據捨棄,末尾多讀一行
最後一個分片捨棄第一行,末尾多讀一行

十、Hadoop序列化機制

1.序列化:對象轉化成二進制字節流  反序列化:字節流轉換爲對象
2.序列化的兩個領域:永久存儲  和 進程間通信
3.java序列化機制有很多冗餘信息,在傳輸中佔用大量的資源,導致有效信息傳輸效率降低,因此hadoop單獨設計了一套序列化機制:Writable
4.Mapreduce的key和value都是可序列的化,針對key而言,還需要進行排序,所以還要提供比較接口 WritbaleComparable
5.自定義類型:實現writableComparable接口 並實現序列化反序列化方法 比較方法 compareTo

十一、Job的提交

1.MR運行時,有五個獨立的進程
	-YarnRunner:用於提交作業的客戶端程序
	-ResourceManager:yarn資源管理器,負責協調集羣上計算機資源的分配
	-NodeManager:yarn節點管理器,負責啓動和監視集羣中機器上的計算機容器(container)
	-Application Master:負責協調運行MapReduce作業的任務,它和任務都在容器中運行,這些容器有ResourceManager分配,並由NodeManager管理
	-hdfs:共享作業所需要的文件
2.job的提交流程
	1.客戶端向resourcemanager提交作業
	2.rm生成一個jobid和文件存儲路徑(路徑就是id名),返回給客戶端
	3.客戶端上傳文件到hdfs對應的該路徑下 並向rm彙報上傳成功
	4.rm將jobid放入到job調度隊列中
	5.rm調度job,首先rm分配一個資源(container) 其實就是找到一個nodemanager1
	6.nm1到hdfs上拉取資源,例如jar包
	7.nm1詢問客戶端啓動命令是什麼
	8.客戶端返回啓動命令,例如 java -cp appmater
	9.nm1啓動appmaster (它知道job需要多少的資源)
	10.appmaster向rm申請分配資源
	11.被分配任務的節點到hdfs上拉取資源
	12.任務節點與appmaster進行交互,申請啓動命令 am會監控每一個maptask
	13.當第一個maptask執行完成,reducetask可以啓動 進行拉取數據 準備工作
	14.am繼續向rm申請分配資源,開始reducetask
思考問題:
1.被分配的節點怎麼知道自己的任務是什麼?
通過心跳機制,nodemanager向rm發送心跳機制,rm讀取調度隊列,rm會在調度隊列中放入人物列表。 然後再返回命令中下達命令 任務列表信息
2.appmaster向rm申請資源,資源是多少呢?
分片機制:是由客戶端來分配任務的,決定要多大的並行度
map階段並行度:客戶端首先確定待處理的目錄下的數據量
			 循環遍歷文件,並且對每一個文件執行 確定有多少塊
			 將每一個block數量累加到計數器
返回一個任務列表的描述文件job.split

十二、job的三種調度器

1.調度器的概念:Scheduler 根據容量,隊列等限制條件(如每個隊列分配一定的資源,最多執行一定量的作業等),將系統中的資源分配給各個正在運行的應用程序。
2.yarn中的三種調度器
	1)FIFO Scheduler:先進先出,調度器將應用放入一個隊列中,按照先後順序進行運行應用。缺點:不適合共享集羣,因爲大的應用會佔用集羣的所有資源,所有應用都必須等待知道輪到自己
	2)Capacity Scheduler 容量調度器
	允許多個組織共享一個hadoop集羣,一個獨立的專門隊列保證小作業一提交就可以運行
	就是整個集羣專門給小作業留了一部分資源,就算只有一個任務,也無法爲它分配所有的資源,形成了資源浪費等
	缺點:以整個集羣的利用率爲代價,大作業的執行時間要長上一些
	3)Fair Scheduler 公平調度器
	爲所有運行的應用公平分配資源,使用公平調度器時,不需要預留資源,因爲調度器會在所有運行的作業之間動態平衡資源。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章