利用MapReduce框架,编程实现数据去重与排序。

利用MapReduce框架,编程实现数据去重与排序。

  1. 熟练掌握map-reduce工作流程;

核心思想:分而治之,把大的数据集分成许多小数据块,在多台机器上并行处理。

  1. 透彻理解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修改了一下,配置成功!

利用MapReduce框架,编程实现数据去重与排序。

利用MapReduce框架,编程实现数据去重与排序。

问题2:eclipse无法启动,查看日志发现java.lang.NoClassDefFoundError: javax/annotation/PreDestroy

原因:修改了jdk的版本,所以无法启动,网上的解决办法是修改eclipse.ini文件,添加--add-modules=ALL-SYSTEM还是无法启动,重新装eclipse

问题3The compiler compliance specified is 1.5 but a JRE 10 is used

解决:右键项目>Properties>Java Compiler>将Compiler compliance level改为10

问题4jdk的tools.jar导入问题,我的jdk的版本是12.0.1,修改pom.xml的时候一直有错误,<version>1.7</version> 怎么改都不行,最后把<systemPath>改成绝对路径<systemPath>D:\Java\jdk1.7.0_75\lib\tools.jar</systemPath>才可以。

利用MapReduce框架,编程实现数据去重与排序。

在dos命令下进入项目,执行mvn clean package

利用MapReduce框架,编程实现数据去重与排序。

得到jar包:

利用MapReduce框架,编程实现数据去重与排序。

(让其他Maven项目运用这个jar,执行命令:mvn clean install)

将做好的jar传输到master中,执行。

问题5Exception in thread “main" java.lang.UnsupportedClassVersionError,如下:

利用MapReduce框架,编程实现数据去重与排序。

原因:我的虚拟机Java版本是1.8的,而生成jar包用的java版本是12.0.2的。

重新尝试一下,把jdk换成了1.7.0_75,生成jar包,还是错误,最后发现是jre版本是10.0.2,将jre版本改成1.7.0_75

问题6master与slave1和slave2时间不同步,导致出错。

利用MapReduce框架,编程实现数据去重与排序。

修改时间后,再次尝试多遍:

利用MapReduce框架,编程实现数据去重与排序。

利用MapReduce框架,编程实现数据去重与排序。

 

最后:运行成功!(可喜可贺~)

错误的原因真的是有很多,大部分错误在网上都可以查到,查不到的根据翻译也能大概清楚哪里错了,再一步步调试和改正,在这次实验中,我认为较难的应该是pom.xml的配置和Maven项目打成jar包。一开始真的是一头雾水,不断的添加配置文件,不断的运行调试,多次测试MapReduce数据集。好在不断的尝试终于运行出来了。