1、map到reduce中間的一個過程
洗牌,打亂(打亂我們傳遞的所有元素)(流程:input->map->reduce->output)
2、map()->shuffle->reduce()
map()接收數據,以wc為例,其中數據可是為<key,value> 在map()中獲取每一行文本內容使用String.split或其他分隔方法分隔文本內容,如<0,hadoop spark hdfs hadoop> 分隔之后:<hadoop,1><spark,1><hdfs,1><hadoop,1> 從map()輸出數據到reduce()接收數據進入shuffle階段 經過shuffle到達reduce() 數據格式與map()輸出格式一致 對數據value進行累加<hadoop,2><spark,1><hdfs,1>... 輸出格式key文本內容分隔體,value出現的次數 輸出到文本上的key與value以制表符\t分隔
3、shuffle過程
map()輸出結果->內存(環形緩沖區,當內存大小達到指定數值,如80%,開始溢寫到本地磁盤) 溢寫之前,進行了分區partition操作,分區的目的在於數據的reduce指向,分區后進行二次排序,第一次是對partitions進行排序,第二次對各個partition中的數據進行排序,之后如果設置了combine,就會執行類似reduce的合並操作,還可以再進行壓縮,因為reduce在拷貝文件時消耗的資源與文件大小成正比 內存在達到一定比例時,開始溢寫到磁盤上 當文件數據達到一定大小時,本地磁盤上會有很多溢寫文件,需要再進行合並merge成一個文件 reduce拷貝copy這些文件,然后進行歸並排序(再次merge),合並為一個文件作為reduce的輸入數據
