MapReduce整體流程

2021-08-03 13:23:11 字數 1445 閱讀 6388

由於map是並行地對輸入的檔案集進行操作,所以它的第一步(filesplit) 就是把檔案集分割成一些子集.如果乙個單個的檔案大到它已影響到查詢效率時,它會被分割成一些小的分割體。要指出的是分割這個一步是不知道輸入檔案的內部邏輯結構的,比如,以行為邏輯分割的文字檔案會被以任意的位元組界限分割,所以這個具體分割要自己去指定也可以用hadoop已經定義的幾個簡單分割。然後每個檔案分割體都會對應地有乙個新的map任務。

當單個map任務開始時,它會對每個配置過的reduce任務開啟乙個新的輸出書寫器(writer).緊接著它(writer)會用從指定的特定inputformat裡得到的recordreader去讀它的檔案分割體。inputformat類分析輸入檔案並產生key-value鍵值對.同時inputformat必需要處理在以檔案分割時邊界處的記錄。比如textinputformat會讀取分割邊界的檔案分割體有最後一行,如果當讀取的分割體不是第乙個時,textinputformat會忽略第一行的內容。

inputformat類並不需要產生一些對有意義的鍵值對。比如textinputformat類的預設輸出是以輸入文字的行內容為value,以行偏移量為key--大多數應用只用到而很少用到偏移量。

當map操作輸出它的鍵值對時他們已經在記憶體中存在了。為了效能和效率的考慮,有時候提供乙個擁有reduce功能的合成器是有好處的。如果有合成器,那麼map的鍵值對就不會被馬上寫入到輸出裡,他們會被收集在list裡,乙個key值乙個list,當寫入一定數量的鍵值對時,這部分緩衝會被送進合成器,每個key都的所有value都會被送進合成器的reduce方法裡並且就像原先map輸出的鍵值對一樣。

比如,hadoop案例中的wordcount程式,它的map操作輸出是(word,1)鍵值對,在輸入中的詞的計數可以用合成器來加速這個操作。乙個合成操作會在記憶體中收集處理lists,乙個詞乙個list。當一定數量的鍵值對輸出到記憶體中時,就呼叫合成操作的reduce方法,每次都以乙個唯一的詞為key,values是list的迭代器。然後合成器輸出(word,count-in-this-part-of-the-input)鍵值對。從reduce操作的觀點來說合成器也擁有map輸出中相同的資訊,但是這樣會比原先遠遠減少硬碟的讀寫。

當乙個reduce任務開始時,它的輸入是分散在各個節點上的map的輸出檔案裡。如果在分布式的模式下,他們需要先在拷貝步驟裡拷貝到本地檔案系統上。詳細可以檢視reducetaskrunner類

一旦所有的資料都在本地有效時,它會在新增步驟裡加到乙個檔案裡。然後這個檔案會被合併分類這樣相同的key的鍵值對就可以排在一起(分類步驟)。這樣可以使真正的reduce操作變得簡單,這個檔案會被順序地讀入,值(values)會從輸入檔案裡用乙個迭代器傳給reduce方法-直到下乙個key。詳細可以檢視reducetask類。

最後,輸出由每個reduce任務的輸出檔案組成。面他們的格式可以由jobconf.setoutputformat類指定,如果用到jobconf.setoutputformat類,那麼輸出的key類和value類都要同時指定。

MapReduce的整體工作機

seven day second 學習了mapreduce的整體工作機制 經過做了幾個mapreduce練習,今兒再看看內部的核心工作機制 先學難的再回顧基礎 接下來分別了解一下map的yarn child和reduce的yarn child 起來以後是怎麼工作的 map 首先對要處理的檔案劃分任務...

MapReduce執行流程

mapreduce的大體流程是這樣的,如圖所示 由可以看到mapreduce執行下來主要包含這樣幾個步驟 1.首先對輸入資料來源進行切片 2.master排程worker執行map任務 3.worker讀取輸入源片段 4.worker執行map任務,將任務輸出儲存在本地 5.master排程work...

MapReduce執行流程

1.客戶端提交作業給yarn集群,rm接受客戶端所提交的作業。2.rm根據作業所要處理的檔案來決定map任務在哪些節點上執行,然後確定reduce任務在哪些節點 nn 上執行。3.rm分配map任務和reduce任務到相應的節點上。4.map任務開始執行,將執行結果臨時儲存到本地 執行過map任務的...