一 、shuffle簡介
什麼是shuffle
一句話:Reducer端擷取Mapper端的資料的過程
二、shuffle工作流程
1.Map讀取輸入檔案
------>進行map計算
------>Mapper将資料寫入到環形緩沖區
注意:1.一個Mapper對應一個環形緩沖區
2.環形緩沖區存在于記憶體中,預設100M,mappered-site.xml中可以配置值
------>當環形緩沖區中内容超過80%(預設門檻值時0.8)時,背景線程開始把内容寫向磁盤的小檔案中(spill過程)
------>當一個小檔案滿了之後,開始寫向下一個小檔案
注意:寫向磁盤的小檔案之前會對Mapper中資料進行Partitioner分區(HashPartitioner)
---> 小檔案中對每個分區按照分區号進行排序'
--->再對小檔案中每個分區中的内容按鍵(key)進行内排序,
---> 如果有combiner(combiner可有可無),則會在排序後進行combiner運算
------>然後将所有小檔案合并成一個大檔案,相同分區号的進行合并
------>合并成一個大檔案後再次進行排序
最終得到一個分區且排序的大檔案,Mapper的任務完成
2.每個Reducer對應一個分區号,(0号Reducer對應0号分區的内容,1号Reducer對應1号分區的内容......)
------> Ruducer從大檔案中去讀取相應分區的檔案
------>(每個Mapper會産生一個大檔案,故讀取後會到很多檔案)然後進行合并
------>排序
------>給Reducer計算
------>輸出
三 、shuffle拉取資料過程
在上文中提到“Ruducer從大檔案中去讀取相應分區的檔案”,那麼問題來了,那麼多map産生的檔案,reducer如何知道去哪一個map中的哪一個分區中去拉取資料呢?
ResourceManager會告訴NodeManager開始工作
------>NodeManager此時啟動子程序yarnChild
------>ResourceManager會與MrAppMaster進行RPC通信,(MrAppMaster會配置設定到其中一個yarnChild所在的機器上)ResourceManager要求MrAppMaster啟動任務監控程序
------>MrAppMaster會向ResourceManager申請資源
------>MrAppMaster會啟動yarnChild子程序開始進行工作
------>執行Map任務的yarnChild會向MrAppMaster彙報輸出資訊(如Mapper完成後的資料存儲在哪台機器,哪個分區,每個分區的偏移量等映射關系)
------>其他機器的Reducer會向MrAppMaster詢問這種映射關系
------>根據映射關系,Reducer知道去哪台機器,哪個分區,哪個偏移量中擷取資料
------>開始去相應的分區中下載下傳資料,進行Reducer計算