摘要:\u003C\u002Fp\u003E\u003Cp\u003E• MapReduce中,map和reduce函數遵循如下常規格式:\u003C\u002Fp\u003E\u003Cp\u003E map: (K1, V1) → list(K2, V2)\u003C\u002Fp\u003E\u003Cp\u003Ereduce: (K2, list(V2)) → list(K3, V3)\u003C\u002Fp\u003E\u003Cp\u003E• Mapper的接口:\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003Eprotected\u003C\u002Fstrong\u003E void map(KEY key, VALUE value, Context context) \u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003Ethrows\u003C\u002Fstrong\u003E IOException, InterruptedException { \u003C\u002Fp\u003E\u003Cp\u003E}\u003C\u002Fp\u003E\u003Cp\u003E• Reduce的接口:\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003Eprotected\u003C\u002Fstrong\u003E void reduce(KEY key, Iterable values,\u003C\u002Fp\u003E\u003Cp\u003E Context context) \u003Cstrong\u003Ethrows\u003C\u002Fstrong\u003E IOException, InterruptedException { \u003C\u002Fp\u003E\u003Cp\u003E}\u003C\u002Fp\u003E\u003Cp\u003E• Mapreduce程序代碼基本結構\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002F007e6e66f2bf4de6be5d21dbb9eccc05\" img_width=\"596\" img_height=\"435\" alt=\"好程序員大數據教程路線分享marpreduce快速入門\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E\u003Cstrong\u003E maprecue實例開發\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cem\u003E2.1 編程步驟\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E用戶編寫的程序分成三個部分:Mapper,Reducer,Driver(提交運行mr程序的客戶端)\u003C\u002Fp\u003E\u003Cp\u003EMapper的輸入數據是KV對的形式(KV的類型可自定義)\u003C\u002Fp\u003E\u003Cp\u003EMapper的輸出數據是KV對的形式(KV的類型可自定義)\u003C\u002Fp\u003E\u003Cp\u003EMapper中的業務邏輯寫在map()方法中\u003C\u002Fp\u003E\u003Cp\u003Emap()方法(maptask進程)對每一個調用一次\u003C\u002Fp\u003E\u003Cp\u003EReducer的輸入數據類型對應Mapper的輸出數據類型,也是KV\u003C\u002Fp\u003E\u003Cp\u003EReducer的業務邏輯寫在reduce()方法中\u003C\u002Fp\u003E\u003Cp\u003EReducetask進程對每一組相同k的組調用一次reduce()方法\u003C\u002Fp\u003E\u003Cp\u003E用戶自定義的Mapper和Reducer都要繼承各自的父類\u003C\u002Fp\u003E\u003Cp\u003E整個程序需要一個Drvier來進行提交,提交的是一個描述了各種必要信息的job對象\u003C\u002Fp\u003E\u003Cp\u003E\u003Cem\u003E2.2 經典的wordcount程序編寫\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E需求:有一批文件(規模爲TB級或者PB級),如何統計這些文件中所有單詞出現次數\u003C\u002Fp\u003E\u003Cp\u003E 如有三個文件,文件名是qf\u003Cem\u003Ecourse.txt、qf\u003C\u002Fem\u003Estu.txt 和 qf_teacher\u003C\u002Fp\u003E\u003Cp\u003E qf_course.txt內容:\u003C\u002Fp\u003E\u003Cp\u003E php java linux\u003C\u002Fp\u003E\u003Cp\u003Ebigdata VR\u003C\u002Fp\u003E\u003Cp\u003EC C++ java web\u003C\u002Fp\u003E\u003Cp\u003Elinux shell\u003C\u002Fp\u003E\u003Cp\u003E qf_stu.txt內容:\u003C\u002Fp\u003E\u003Cp\u003E tom jim lucy\u003C\u002Fp\u003E\u003Cp\u003Elily sally\u003C\u002Fp\u003E\u003Cp\u003Eandy\u003C\u002Fp\u003E\u003Cp\u003Etom jim sally\u003C\u002Fp\u003E\u003Cp\u003E qf_teacher內容:\u003C\u002Fp\u003E\u003Cp\u003E jerry Lucy tom\u003C\u002Fp\u003E\u003Cp\u003Ejim\u003C\u002Fp\u003E\u003Cp\u003E方案\u003C\u002Fp\u003E\u003Cp\u003E– 分別統計每個文件中單詞出現次數 - map()\u003C\u002Fp\u003E\u003Cp\u003E– 累加不同文件中同一個單詞出現次數 - reduce()\u003C\u002Fp\u003E\u003Cp\u003E實現代碼\u003C\u002Fp\u003E\u003Cp\u003E– 創建一個簡單的maven項目\u003C\u002Fp\u003E\u003Cp\u003E– 添加hadoop client依賴的jar,pom.xml主要內容如下:\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003E\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003E\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003E\u003C\u002Fstrong\u003Eorg.apache.hadoop\u003Cstrong\u003E\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003E\u003C\u002Fstrong\u003Ehadoop-client\u003Cstrong\u003E\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003E\u003C\u002Fstrong\u003E2.7.1\u003Cstrong\u003E\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003E\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003E\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003E\u003C\u002Fstrong\u003Ejunit\u003Cstrong\u003E\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003E\u003C\u002Fstrong\u003Ejunit\u003Cstrong\u003E\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003E\u003C\u002Fstrong\u003E4.11\u003Cstrong\u003E\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003E\u003C\u002Fstrong\u003Etest\u003Cstrong\u003E\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003E\u003C\u002Fstrong\u003E \u003C\u002Fp\u003E\u003Cp\u003E\u003Cstrong\u003E\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E– 編寫代碼\u003C\u002Fp\u003E\u003Cp\u003E– 自定義一個mapper類\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003Eimport\u003C\u002Fstrong\u003E java.io.IOException。\u003C\u002Fp\u003E\u003Cp\u003E• Task又分爲如下三種類型的任務:\u003C\u002Fp\u003E\u003Cp\u003E– Map:負責map階段的整個數據處理流程\u003C\u002Fp\u003E\u003Cp\u003E– Reduce:負責reduce階段的整個數據處理流程\u003C\u002Fp\u003E\u003Cp\u003E– MRAppMaster:負責整個程序的過程調度及狀態協調\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002F4cd92c27fe9d49d6bc1ed960dfe3b901\" img_width=\"720\" img_height=\"390\" alt=\"好程序員大數據教程路線分享marpreduce快速入門\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E\u003Cem\u003E1.4 mapreduce程序運行流程\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002Fa3ac0051e84240418766bc9c25e49832\" img_width=\"720\" img_height=\"427\" alt=\"好程序員大數據教程路線分享marpreduce快速入門\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E具體流程說明:\u003C\u002Fp\u003E\u003Cp\u003E一個mr程序啓動的時候,最先啓動的是MRAppMaster,MRAppMaster啓動後根據本次job的描述信息,計算出需要的maptask實例數量,然後向集羣申請機器啓動相應數量的maptask進程\u003C\u002Fp\u003E\u003Cp\u003Emaptask進程啓動之後,根據給定的數據切片範圍進行數據處理,主體流程爲:\u003C\u002Fp\u003E\u003Cp\u003E– 利用客戶指定的inputformat來獲取RecordReader讀取數據,形成輸入KV對。

"\u003Cdiv\u003E\u003Cp\u003E好程序員大數據教程路線分享marpreduce快速入門,mapreduce:分佈式並行離線計算框架,是一個分佈式運算程序的編程框架,是用戶開發“基於hadoop的數據分析應用”的核心框架;Mapreduce核心功能是將用戶編寫的業務邏輯代碼和自帶默認組件整合成一個完整的分佈式運算程序,併發運行在一個hadoop集羣上;\u003C\u002Fp\u003E\u003Cp\u003E• 與HDFS解決問題的原理類似,HDFS是將大的文件切分成若干小文件,然後將它們分別存儲到集羣中各個主機中。\u003C\u002Fp\u003E\u003Cp\u003E• 同樣原理,mapreduce是將一個複雜的運算切分成若個子運算,然後將它們分別交給集羣中各個主機,由各個主機並行運算。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cem\u003E1.1 mapreduce產生的背景\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E• 海量數據在單機上處理因爲硬件資源限制,無法勝任。\u003C\u002Fp\u003E\u003Cp\u003E• 而一旦將單機版程序擴展到集羣來分佈式運行,將極大增加程序的複雜度和開發難度。\u003C\u002Fp\u003E\u003Cp\u003E• 引入mapreduce框架後,開發人員可以將絕大部分工作集中在業務邏輯的開發上,而將分佈式計算中的複雜性交由框架來處理。\u003C\u002Fp\u003E\u003Cp\u003E\u003Cem\u003E1.2 mapreduce編程模型\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E• 一種分佈式計算模型。\u003C\u002Fp\u003E\u003Cp\u003E• MapReduce將這個並行計算過程抽象到兩個函數。\u003C\u002Fp\u003E\u003Cp\u003E– Map(映射):對一些獨立元素組成的列表的每一個元素進行指定的操作,可以高度並行。\u003C\u002Fp\u003E\u003Cp\u003E– Reduce(化簡 歸約):對一個列表的元素進行合併。\u003C\u002Fp\u003E\u003Cp\u003E• 一個簡單的MapReduce程序只需要指定map()、reduce()、input和output,剩下的事由框架完成。\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002F26fb7dfbdaa1440ba491d5918e660737\" img_width=\"720\" img_height=\"466\" alt=\"好程序員大數據教程路線分享marpreduce快速入門\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002F69ac6c8faa804ee38c4ae275b2b518a7\" img_width=\"715\" img_height=\"483\" alt=\"好程序員大數據教程路線分享marpreduce快速入門\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E\u003Cem\u003EMapreduce的幾個關鍵名詞\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E• Job :用戶的每一個計算請求稱爲一個作業。\u003C\u002Fp\u003E\u003Cp\u003E• Task:每一個作業,都需要拆分開了,交由多個主機來完成,拆分出來的執行單位就是任務。\u003C\u002Fp\u003E\u003Cp\u003E• Task又分爲如下三種類型的任務:\u003C\u002Fp\u003E\u003Cp\u003E– Map:負責map階段的整個數據處理流程\u003C\u002Fp\u003E\u003Cp\u003E– Reduce:負責reduce階段的整個數據處理流程\u003C\u002Fp\u003E\u003Cp\u003E– MRAppMaster:負責整個程序的過程調度及狀態協調\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002F4cd92c27fe9d49d6bc1ed960dfe3b901\" img_width=\"720\" img_height=\"390\" alt=\"好程序員大數據教程路線分享marpreduce快速入門\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E\u003Cem\u003E1.4 mapreduce程序運行流程\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002Fa3ac0051e84240418766bc9c25e49832\" img_width=\"720\" img_height=\"427\" alt=\"好程序員大數據教程路線分享marpreduce快速入門\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E具體流程說明:\u003C\u002Fp\u003E\u003Cp\u003E一個mr程序啓動的時候,最先啓動的是MRAppMaster,MRAppMaster啓動後根據本次job的描述信息,計算出需要的maptask實例數量,然後向集羣申請機器啓動相應數量的maptask進程\u003C\u002Fp\u003E\u003Cp\u003Emaptask進程啓動之後,根據給定的數據切片範圍進行數據處理,主體流程爲:\u003C\u002Fp\u003E\u003Cp\u003E– 利用客戶指定的inputformat來獲取RecordReader讀取數據,形成輸入KV對。\u003C\u002Fp\u003E\u003Cp\u003E– 將輸入KV(k是文件的行號,v是文件一行的數據)對傳遞給客戶定義的map()方法,做邏輯運算,並將map()方法輸出的KV對收集到緩存。\u003C\u002Fp\u003E\u003Cp\u003E– 將緩存中的KV對按照K分區排序後不斷溢寫到磁盤文件\u003C\u002Fp\u003E\u003Cp\u003EMRAppMaster監控到所有maptask進程任務完成之後,會根據客戶指定的參數啓動相應數量的reducetask進程,並告知reducetask進程要處理的數據範圍(數據分區)\u003C\u002Fp\u003E\u003Cp\u003EReducetask進程啓動之後,根據MRAppMaster告知的待處理數據所在位置,從若干臺maptask運行所在機器上獲取到若干個maptask輸出結果文件,並在本地進行重新歸併排序,然後按照相同key的KV爲一個組,調用客戶定義的reduce()方法進行邏輯運算,並收集運算輸出的結果KV,然後調用客戶指定的outputformat將結果數據輸出到外部存儲\u003C\u002Fp\u003E\u003Cp\u003E\u003Cem\u003E1.5 編寫MapReduce程序\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E• 基於MapReduce 計算模型編寫分佈式並行程序非常簡單,程序員的主要編碼工作就是實現Map 和Reduce函數。\u003C\u002Fp\u003E\u003Cp\u003E• 其它的並行編程中的種種複雜問題,如分佈式存儲,工作調度,負載平衡,容錯處理,網絡通信等,均由YARN框架負責處理。\u003C\u002Fp\u003E\u003Cp\u003E• MapReduce中,map和reduce函數遵循如下常規格式:\u003C\u002Fp\u003E\u003Cp\u003E map: (K1, V1) → list(K2, V2)\u003C\u002Fp\u003E\u003Cp\u003Ereduce: (K2, list(V2)) → list(K3, V3)\u003C\u002Fp\u003E\u003Cp\u003E• Mapper的接口:\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003Eprotected\u003C\u002Fstrong\u003E void map(KEY key, VALUE value, Context context) \u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003Ethrows\u003C\u002Fstrong\u003E IOException, InterruptedException { \u003C\u002Fp\u003E\u003Cp\u003E}\u003C\u002Fp\u003E\u003Cp\u003E• Reduce的接口:\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003Eprotected\u003C\u002Fstrong\u003E void reduce(KEY key, Iterable<VALUE> values,\u003C\u002Fp\u003E\u003Cp\u003E Context context) \u003Cstrong\u003Ethrows\u003C\u002Fstrong\u003E IOException, InterruptedException { \u003C\u002Fp\u003E\u003Cp\u003E}\u003C\u002Fp\u003E\u003Cp\u003E• Mapreduce程序代碼基本結構\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002F007e6e66f2bf4de6be5d21dbb9eccc05\" img_width=\"596\" img_height=\"435\" alt=\"好程序員大數據教程路線分享marpreduce快速入門\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E\u003Cstrong\u003E maprecue實例開發\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E\u003Cem\u003E2.1 編程步驟\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E用戶編寫的程序分成三個部分:Mapper,Reducer,Driver(提交運行mr程序的客戶端)\u003C\u002Fp\u003E\u003Cp\u003EMapper的輸入數據是KV對的形式(KV的類型可自定義)\u003C\u002Fp\u003E\u003Cp\u003EMapper的輸出數據是KV對的形式(KV的類型可自定義)\u003C\u002Fp\u003E\u003Cp\u003EMapper中的業務邏輯寫在map()方法中\u003C\u002Fp\u003E\u003Cp\u003Emap()方法(maptask進程)對每一個<K,V>調用一次\u003C\u002Fp\u003E\u003Cp\u003EReducer的輸入數據類型對應Mapper的輸出數據類型,也是KV\u003C\u002Fp\u003E\u003Cp\u003EReducer的業務邏輯寫在reduce()方法中\u003C\u002Fp\u003E\u003Cp\u003EReducetask進程對每一組相同k的<k,v>組調用一次reduce()方法\u003C\u002Fp\u003E\u003Cp\u003E用戶自定義的Mapper和Reducer都要繼承各自的父類\u003C\u002Fp\u003E\u003Cp\u003E整個程序需要一個Drvier來進行提交,提交的是一個描述了各種必要信息的job對象\u003C\u002Fp\u003E\u003Cp\u003E\u003Cem\u003E2.2 經典的wordcount程序編寫\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E需求:有一批文件(規模爲TB級或者PB級),如何統計這些文件中所有單詞出現次數\u003C\u002Fp\u003E\u003Cp\u003E 如有三個文件,文件名是qf\u003Cem\u003Ecourse.txt、qf\u003C\u002Fem\u003Estu.txt 和 qf_teacher\u003C\u002Fp\u003E\u003Cp\u003E qf_course.txt內容:\u003C\u002Fp\u003E\u003Cp\u003E php java linux\u003C\u002Fp\u003E\u003Cp\u003Ebigdata VR\u003C\u002Fp\u003E\u003Cp\u003EC C++ java web\u003C\u002Fp\u003E\u003Cp\u003Elinux shell\u003C\u002Fp\u003E\u003Cp\u003E qf_stu.txt內容:\u003C\u002Fp\u003E\u003Cp\u003E tom jim lucy\u003C\u002Fp\u003E\u003Cp\u003Elily sally\u003C\u002Fp\u003E\u003Cp\u003Eandy\u003C\u002Fp\u003E\u003Cp\u003Etom jim sally\u003C\u002Fp\u003E\u003Cp\u003E qf_teacher內容:\u003C\u002Fp\u003E\u003Cp\u003E jerry Lucy tom\u003C\u002Fp\u003E\u003Cp\u003Ejim\u003C\u002Fp\u003E\u003Cp\u003E方案\u003C\u002Fp\u003E\u003Cp\u003E– 分別統計每個文件中單詞出現次數 - map()\u003C\u002Fp\u003E\u003Cp\u003E– 累加不同文件中同一個單詞出現次數 - reduce()\u003C\u002Fp\u003E\u003Cp\u003E實現代碼\u003C\u002Fp\u003E\u003Cp\u003E– 創建一個簡單的maven項目\u003C\u002Fp\u003E\u003Cp\u003E– 添加hadoop client依賴的jar,pom.xml主要內容如下:\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003E<dependencies>\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003E<dependency>\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003E<groupId>\u003C\u002Fstrong\u003Eorg.apache.hadoop\u003Cstrong\u003E<\u002FgroupId>\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003E<artifactId>\u003C\u002Fstrong\u003Ehadoop-client\u003Cstrong\u003E<\u002FartifactId>\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003E<version>\u003C\u002Fstrong\u003E2.7.1\u003Cstrong\u003E<\u002Fversion>\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003E<\u002Fdependency>\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003E<dependency>\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003E<groupId>\u003C\u002Fstrong\u003Ejunit\u003Cstrong\u003E<\u002FgroupId>\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003E<artifactId>\u003C\u002Fstrong\u003Ejunit\u003Cstrong\u003E<\u002FartifactId>\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003E<version>\u003C\u002Fstrong\u003E4.11\u003Cstrong\u003E<\u002Fversion>\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003E<scope>\u003C\u002Fstrong\u003Etest\u003Cstrong\u003E<\u002Fscope>\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003E<\u002Fdependency>\u003C\u002Fstrong\u003E \u003C\u002Fp\u003E\u003Cp\u003E\u003Cstrong\u003E<\u002Fdependencies>\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E– 編寫代碼\u003C\u002Fp\u003E\u003Cp\u003E– 自定義一個mapper類\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003Eimport\u003C\u002Fstrong\u003E java.io.IOException;\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003Eimport\u003C\u002Fstrong\u003E org.apache.hadoop.io.IntWritable;\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003Eimport\u003C\u002Fstrong\u003E org.apache.hadoop.io.LongWritable;\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003Eimport\u003C\u002Fstrong\u003E org.apache.hadoop.io.Text;\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003Eimport\u003C\u002Fstrong\u003E org.apache.hadoop.mapreduce.Mapper;\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E\u002F**\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E Maper裏面的泛型的四個類型從左到右依次是:\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E \u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E LongWritable KEYIN\u003Cem\u003E:\u003C\u002Fem\u003E 默認情況下,是mr框架所讀到的一行文本的起始偏移量,Long\u003Cem\u003E,\u003C\u002Fem\u003E 類似於行號但是在hadoop中有自己的更精簡的序列化接口,所以不直接用Long,而用LongWritable \u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E Text VALUEIN\u003Cem\u003E:\u003C\u002Fem\u003E默認情況下,是mr框架所讀到的一行文本的內容,String,同上,用Text\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E Text KEYOUT:是用戶自定義邏輯處理完成之後輸出數據中的key,在此處是單詞,String,同上,用Text\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E IntWritable VALUEOUT:是用戶自定義邏輯處理完成之後輸出數據中的value,在此處是單詞次數,Integer,同上,用IntWritable\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u002F\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003Epublic\u003C\u002Fstrong\u003E \u003Cstrong\u003Eclass\u003C\u002Fstrong\u003E WordcountMapper \u003Cstrong\u003Eextends\u003C\u002Fstrong\u003E Mapper<LongWritable, Text, Text, IntWritable>{\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E\u002F**\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E map階段的業務邏輯就寫在自定義的map\u003Cem\u003E()\u003C\u002Fem\u003E方法中\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E maptask會對每一行輸入數據調用一次我們自定義的map\u003Cem\u003E()\u003C\u002Fem\u003E方法\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u002F\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E @Override\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003Eprotected\u003C\u002Fstrong\u003E void map(LongWritable key, Text value, Context context) \u003Cstrong\u003Ethrows\u003C\u002Fstrong\u003E IOException, InterruptedException {\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E\u002F\u002F將maptask傳給我們的一行的文本內容先轉換成String\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E String line = value.toString();\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E\u002F\u002F根據空格將這一行切分成單詞\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E String[] words = line.split(\" \");\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E\u002F**\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E將單詞輸出爲\u003Cstrong\u003E<\u003C\u002Fstrong\u003E單詞,1\u003Cem\u003E>\u003C\u002Fem\u003E \u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E如\u003Cstrong\u003E<lily,1>\u003C\u002Fstrong\u003E \u003Cstrong\u003E<lucy,1>\u003C\u002Fstrong\u003E \u003Cstrong\u003E<c,1>\u003C\u002Fstrong\u003E \u003Cstrong\u003E<c++,1>\u003C\u002Fstrong\u003E \u003Cstrong\u003E<tom,1>\u003C\u002Fstrong\u003E \u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u002F\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003Efor\u003C\u002Fstrong\u003E(String word:words){\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E\u002F\u002F將單詞作爲key,將次數1作爲value,以便於後續的數據分發,可以根據單詞分發,以便於相同單詞會到相同的reduce task\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E context.write(\u003Cstrong\u003Enew\u003C\u002Fstrong\u003E Text(word), \u003Cstrong\u003Enew\u003C\u002Fstrong\u003E IntWritable(1));\u003C\u002Fp\u003E\u003Cp\u003E }\u003C\u002Fp\u003E\u003Cp\u003E }\u003C\u002Fp\u003E\u003Cp\u003E }\u003C\u002Fp\u003E\u003Cp\u003E– 自定義一個reduce類\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003Eimport\u003C\u002Fstrong\u003E java.io.IOException;\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003Eimport\u003C\u002Fstrong\u003E org.apache.hadoop.io.IntWritable;\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003Eimport\u003C\u002Fstrong\u003E org.apache.hadoop.io.Text;\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003Eimport\u003C\u002Fstrong\u003E org.apache.hadoop.mapreduce.Reducer;\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E\u002F**\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E Reducer裏面的泛型的四個類型從左到右依次是:\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E Text KEYIN\u003Cem\u003E:\u003C\u002Fem\u003E 對應mapper輸出的KEYOUT\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E IntWritable VALUEIN\u003Cem\u003E:\u003C\u002Fem\u003E 對應mapper輸出的VALUEOUT\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E \u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E KEYOUT\u003Cem\u003E,\u003C\u002Fem\u003E 是單詞\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E VALUEOUT 是自定義reduce邏輯處理結果的輸出數據類型,是總次數\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u002F\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003Epublic\u003C\u002Fstrong\u003E \u003Cstrong\u003Eclass\u003C\u002Fstrong\u003E WordcountReducer \u003Cstrong\u003Eextends\u003C\u002Fstrong\u003E Reducer<Text, IntWritable, Text, IntWritable>{\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E\u002F**\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E \u003Cstrong\u003E<tom,1>\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E \u003Cstrong\u003E<tom,1>\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E \u003Cstrong\u003E<linux,1>\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E \u003Cstrong\u003E<banana,1>\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E \u003Cstrong\u003E<banana,1>\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E \u003Cstrong\u003E<banana,1>\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E 入參key,是一組相同單詞kv對的key\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E values是若干相同key的value集合\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E 如 \u003Cstrong\u003E<tom,[1,1]>\u003C\u002Fstrong\u003E \u003Cstrong\u003E<linux,[1]>\u003C\u002Fstrong\u003E \u003Cstrong\u003E<banana,[1,1,1]>\u003C\u002Fstrong\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u002F\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E @Override\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003Eprotected\u003C\u002Fstrong\u003E void reduce(Text key, Iterable<IntWritable> values, Context context) \u003Cstrong\u003Ethrows\u003C\u002Fstrong\u003E IOException, InterruptedException {\u003C\u002Fp\u003E\u003Cp\u003E int count=0; \u003Cem\u003E\u002F\u002F累加單詞的出現的次數\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003Efor\u003C\u002Fstrong\u003E(IntWritable value:values){\u003C\u002Fp\u003E\u003Cp\u003E count += value.get();\u003C\u002Fp\u003E\u003Cp\u003E }\u003C\u002Fp\u003E\u003Cp\u003E context.write(key, \u003Cstrong\u003Enew\u003C\u002Fstrong\u003E IntWritable(count)); \u003C\u002Fp\u003E\u003Cp\u003E } \u003C\u002Fp\u003E\u003Cp\u003E }\u003C\u002Fp\u003E\u003Cp\u003E– 編寫一個Driver類\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003Eimport\u003C\u002Fstrong\u003E org.apache.hadoop.conf.Configuration;\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003Eimport\u003C\u002Fstrong\u003E org.apache.hadoop.fs.Path;\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003Eimport\u003C\u002Fstrong\u003E org.apache.hadoop.io.IntWritable;\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003Eimport\u003C\u002Fstrong\u003E org.apache.hadoop.io.Text;\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003Eimport\u003C\u002Fstrong\u003E org.apache.hadoop.mapreduce.Job;\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003Eimport\u003C\u002Fstrong\u003E org.apache.hadoop.mapreduce.lib.input.FileInputFormat;\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003Eimport\u003C\u002Fstrong\u003E org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E\u002F**\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E 相當於一個yarn集羣的客戶端\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E 需要在此封裝我們的mr程序的相關運行參數,指定jar包\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E 最後提交給yarn\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u002F\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003Epublic\u003C\u002Fstrong\u003E \u003Cstrong\u003Eclass\u003C\u002Fstrong\u003E WordcountDriver {\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E\u002F**\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E 該類是運行在hadoop客戶端的,main一運行,yarn客戶端就啓動起來了,與yarn服務器端通信\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E yarn服務器端負責啓動mapreduce程序並使用WordcountMapper和WordcountReducer類\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u002F\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003Epublic\u003C\u002Fstrong\u003E static void main(String[] args) \u003Cstrong\u003Ethrows\u003C\u002Fstrong\u003E Exception {\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E\u002F\u002F此代碼需要兩個輸入參數 第一個參數支持要處理的源文件;第二個參數是處理結果的輸出路徑\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cstrong\u003Eif\u003C\u002Fstrong\u003E (args == \u003Cstrong\u003Enull\u003C\u002Fstrong\u003E || args.length == 0) {\u003C\u002Fp\u003E\u003Cp\u003E args = \u003Cstrong\u003Enew\u003C\u002Fstrong\u003E String[2];\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E\u002F\u002F路徑都是 hdfs系統的文件路徑\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E args[0] = \"hdfs:\u002F\u002F192.168.18.64:9000\u002Fwordcount\u002Finput\u002F\";\u003C\u002Fp\u003E\u003Cp\u003E args[1] = \"hdfs:\u002F\u002F192.168.18.64:9000\u002Fwordcount\u002Foutput\";\u003C\u002Fp\u003E\u003Cp\u003E }\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E\u002F**\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E 什麼也不設置時,如果在安裝了hadoop的機器上運行時,自動讀取\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E \u003Cem\u003E\u002F\u003C\u002Fem\u003Ehome\u003Cem\u003E\u002F\u003C\u002Fem\u003Ehadoop\u003Cem\u003E\u002F\u003C\u002Fem\u003Eapp\u003Cem\u003E\u002F\u003C\u002Fem\u003Ehadoop\u003Cem\u003E-2.7.1\u002F\u003C\u002Fem\u003Eetc\u003Cem\u003E\u002F\u003C\u002Fem\u003Ehadoop\u003Cem\u003E\u002F\u003C\u002Fem\u003Ecore\u003Cem\u003E-\u003C\u002Fem\u003Esite\u003Cem\u003E.\u003C\u002Fem\u003Exml\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u003C\u002Fem\u003E 文件放入Configuration中\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E*\u002F\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E Configuration conf = \u003Cstrong\u003Enew\u003C\u002Fstrong\u003E Configuration();\u003C\u002Fp\u003E\u003Cp\u003E Job job = Job.getInstance(conf);\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E\u002F\u002F指定本程序的jar包所在的本地路徑\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E job.setJarByClass(WordcountDriver.class);\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E\u002F\u002F指定本業務job要使用的mapper業務類\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E job.setMapperClass(WordcountMapper.class);\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E\u002F\u002F指定mapper輸出數據的kv類型\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E job.setMapOutputKeyClass(Text.class);\u003C\u002Fp\u003E\u003Cp\u003E job.setMapOutputValueClass(IntWritable.class);\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E\u002F\u002F指定本業務job要使用的Reducer業務類\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E job.setReducerClass(WordcountReducer.class);\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E\u002F\u002F指定最終輸出的數據的kv類型\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E job.setOutputKeyClass(Text.class);\u003C\u002Fp\u003E\u003Cp\u003E job.setOutputValueClass(IntWritable.class);\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E\u002F\u002F指定job的輸入原始文件所在目錄\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E FileInputFormat.setInputPaths(job, \u003Cstrong\u003Enew\u003C\u002Fstrong\u003E Path(args[0]));\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E\u002F\u002F指定job的輸出結果所在目錄\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E FileOutputFormat.setOutputPath(job, \u003Cstrong\u003Enew\u003C\u002Fstrong\u003E Path(args[1]));\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E\u002F\u002F將job中配置的相關參數,以及job所用的java類所在的jar包,提交給yarn去運行\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E \u003Cem\u003E\u002F*job.submit();*\u002F\u003C\u002Fem\u003E\u003C\u002Fp\u003E\u003Cp\u003E boolean res = job.waitForCompletion(\u003Cstrong\u003Etrue\u003C\u002Fstrong\u003E);\u003C\u002Fp\u003E\u003Cp\u003E System.exit(res?0:1); \u003C\u002Fp\u003E\u003Cp\u003E }\u003C\u002Fp\u003E\u003Cp\u003E }\u003C\u002Fp\u003E\u003Cp\u003Ewordcount處理過程\u003C\u002Fp\u003E\u003Cp\u003E將文件拆分成splits,由於測試用的文件較小,所以每個文件爲一個split,並將文件按行分割形成<key,value>對,下圖所示。這一步由MapReduce框架自動完成,其中偏移量(即key值)包括了回車所佔的字符數(Windows\u002FLinux環境不同)。\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp3.pstatp.com\u002Flarge\u002Fpgc-image\u002F7202a4293a3140308ebfde795d0effd0\" img_width=\"470\" img_height=\"235\" alt=\"好程序員大數據教程路線分享marpreduce快速入門\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E將分割好的<key,value>對交給用戶定義的map方法進行處理,生成新的<key,value>對,下圖所示。\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002F9afd257d64e24cc18178f4ac39fb8a1d\" img_width=\"720\" img_height=\"416\" alt=\"好程序員大數據教程路線分享marpreduce快速入門\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E得到map方法輸出的<key,value>對後,Mapper會將它們按照key值進行排序,並執行Combine過程,將key至相同value值累加,得到Mapper的最終輸出結果。下圖所示。\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp3.pstatp.com\u002Flarge\u002Fpgc-image\u002F73510b174eb544c2bdb1e391ba706a08\" img_width=\"720\" img_height=\"333\" alt=\"好程序員大數據教程路線分享marpreduce快速入門\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003Cp\u003EReducer先對從Mapper接收的數據進行排序,再交由用戶自定義的reduce方法進行處理,得到新的<key,value>對,並作爲WordCount的輸出結果,下圖所示。\u003C\u002Fp\u003E\u003Cdiv class=\"pgc-img\"\u003E\u003Cimg src=\"http:\u002F\u002Fp1.pstatp.com\u002Flarge\u002Fpgc-image\u002Fc1001066e3ca4b52a18fd85748d98bc5\" img_width=\"720\" img_height=\"297\" alt=\"好程序員大數據教程路線分享marpreduce快速入門\" inline=\"0\"\u003E\u003Cp class=\"pgc-img-caption\"\u003E\u003C\u002Fp\u003E\u003C\u002Fdiv\u003E\u003C\u002Fdiv\u003E"'.slice(6, -6), groupId: '6717855600551657991
相關文章