Hadoop的讀寫流程主要分為兩部分:HDFS的讀寫流程和MapReduce的讀寫流程。
1. HDFS的讀寫流程:
- 寫入流程:當(dāng)客戶端需要向HDFS寫入數(shù)據(jù)時(shí),首先會(huì)將數(shù)據(jù)劃分為塊(通常為128MB)并進(jìn)行復(fù)制,然后通過HDFS客戶端將數(shù)據(jù)塊傳輸給NameNode,NameNode會(huì)將數(shù)據(jù)塊的元數(shù)據(jù)信息記錄在EditLog日志中,并將數(shù)據(jù)塊的具體位置信息保存在BlockMap中。接著,客戶端會(huì)將數(shù)據(jù)塊傳輸給DataNode,DataNode將數(shù)據(jù)塊保存在本地磁盤上,并向NameNode發(fā)送確認(rèn)信息。最后,NameNode更新元數(shù)據(jù)信息并返回寫入結(jié)果給客戶端。
- 讀取流程:當(dāng)客戶端需要從HDFS讀取數(shù)據(jù)時(shí),首先向NameNode發(fā)送讀取請(qǐng)求,NameNode返回?cái)?shù)據(jù)塊的位置信息給客戶端。然后客戶端通過HDFS客戶端從DataNode讀取數(shù)據(jù)塊,并將數(shù)據(jù)塊合并成完整的文件。
2. MapReduce的讀寫流程:
- 寫入流程:在MapReduce任務(wù)中,輸入數(shù)據(jù)通常從HDFS中讀取。MapReduce作業(yè)首先從HDFS中讀取輸入數(shù)據(jù),然后將輸入數(shù)據(jù)劃分為InputSplit,每個(gè)InputSplit對(duì)應(yīng)一個(gè)Map任務(wù)的輸入數(shù)據(jù)。接著,MapReduce框架會(huì)將InputSplit分配給不同的Map任務(wù)并將任務(wù)發(fā)送到集群中的各個(gè)節(jié)點(diǎn)上執(zhí)行。
- 讀取流程:在MapReduce任務(wù)中,輸出數(shù)據(jù)通常會(huì)寫入HDFS中。每個(gè)Map任務(wù)會(huì)生成中間結(jié)果并將其寫入本地磁盤上的臨時(shí)文件中,而Reduce任務(wù)則會(huì)從各個(gè)Map任務(wù)的臨時(shí)文件中讀取中間結(jié)果并進(jìn)行合并。最后,Reduce任務(wù)將最終結(jié)果寫入HDFS中。
總的來說,Hadoop的讀寫流程可以簡(jiǎn)單概括為:數(shù)據(jù)寫入時(shí)先將數(shù)據(jù)劃分、復(fù)制并保存元數(shù)據(jù)信息,然后將數(shù)據(jù)塊保存在DataNode上;數(shù)據(jù)讀取時(shí)先獲取數(shù)據(jù)塊的位置信息,然后從DataNode讀取數(shù)據(jù)塊并進(jìn)行合并處理。