利用MapReduce框架,编程实现数据去重与排序。
利用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数据集。好在不断的尝试终于运行出来了。