利用MapReduce框架,編程實現數據去重與排序。
- 熟練掌握map-reduce工作流程;
核心思想:分而治之,把大的數據集分成許多小數據塊,在多臺機器上並行處理。
- 透徹理解map-reduce工作流程中每個“節點”的功能。
Input: 輸入文件的存儲位置
Split: 大數據集拆分成小數據集。
Mapper:<1> 把輸入目錄下的文件進行邏輯切片,每個切片由一個MapTask處理。
<2> 將切片解析成<key,value>對。
<3> 調用map方法。上階段每解析出來一個<k,v>,調用一次map方法。
<4> 按照規則對第三階段輸出的鍵值對進行分區。分區的數量就是Reducer任務運行的數量。(默認一個Reducer任務)
<5> 對每個分區的鍵值對進行排序。
<6> 對數據進行局部聚合處理。
Shuffle: 分區、排序、合併交給Reduce.
Reducer:<1> Reducer任務主動複製Mapper任務輸出的鍵值對。
<2> 把複製到Reducer的本地數據全部進行合併,再排序。
<3> 調用reduce方法。(將輸出的鍵值對寫入到HDFS文件中)
Result: 上述產生一系列<k,v>對,最終寫入HDFS。
安裝maven:
問題1:Please set the JAVA_HOME variable in your environment to match the location。
原因:DK配置文件中JAVA_HOME路徑設置和實際JDK路徑不符合,造成該原因可能是重複安裝了不同版本的JDK。
解決:將JAVA_HOME、CLASSPATH、Path修改了一下,配置成功!
問題2:eclipse無法啓動,查看日誌發現java.lang.NoClassDefFoundError: javax/annotation/PreDestroy
原因:修改了jdk的版本,所以無法啓動,網上的解決辦法是修改eclipse.ini文件,添加--add-modules=ALL-SYSTEM還是無法啓動,重新裝eclipse
問題3:The compiler compliance specified is 1.5 but a JRE 10 is used
解決:右鍵項目>Properties>Java Compiler>將Compiler compliance level改爲10
問題4:jdk的tools.jar導入問題,我的jdk的版本是12.0.1,修改pom.xml的時候一直有錯誤,<version>1.7</version> 怎麼改都不行,最後把<systemPath>改成絕對路徑<systemPath>D:\Java\jdk1.7.0_75\lib\tools.jar</systemPath>纔可以。
在dos命令下進入項目,執行mvn clean package
得到jar包:
(讓其他Maven項目運用這個jar,執行命令:mvn clean install)
將做好的jar傳輸到master中,執行。
問題5:Exception in thread “main" java.lang.UnsupportedClassVersionError,如下:
原因:我的虛擬機Java版本是1.8的,而生成jar包用的java版本是12.0.2的。
重新嘗試一下,把jdk換成了1.7.0_75,生成jar包,還是錯誤,最後發現是jre版本是10.0.2,將jre版本改成1.7.0_75
問題6:master與slave1和slave2時間不同步,導致出錯。
修改時間後,再次嘗試多遍:
最後:運行成功!(可喜可賀~)
錯誤的原因真的是有很多,大部分錯誤在網上都可以查到,查不到的根據翻譯也能大概清楚哪裏錯了,再一步步調試和改正,在這次實驗中,我認爲較難的應該是pom.xml的配置和Maven項目打成jar包。一開始真的是一頭霧水,不斷的添加配置文件,不斷的運行調試,多次測試MapReduce數據集。好在不斷的嘗試終於運行出來了。