运行结果附图
本节课程主要内容为学习MapReduc设计模式,并编写java程序对日志文件进行处理。
课本上介绍的MapReduce的设计模式主要包含:计数(Counting),分类(Classification),过滤处理(Filtering),排序(Sorting),去重计数(Distinct Counting),相关计数(Cross-Correlation).
本次作业选取了其中两个设计模式进行练习:排序(Sorting) ,去重计数(Distinct Counting)
-
排序(Sorting)
(1) 设计模式思想:
map对每条记录的排序属性进行计算,得出排序属性的值
reduce对同一分组下的记录按照排序属性值进行排序(2) 目标问题:
对access.log中的每个用户的每条记录的总数据流量(上行流量+下行流量)按照从小到大的顺序输出
(3) java代码主要思路:
问题中的排序属性值为数据总流量,故在map阶段计算出每条数据的总流量,又因为是要对每个用户的总流量进行排序,
故map的输出key为userid,value为原始数据记录以及排序属性(即总流量)
reduce阶段就是对同一用户的所有记录按照其总流量进行排序,java代码中具体实现是将同一用户的所有带有总流量的记录存放到一个ArrayList中,
然后使用Collections.sort(list,comparactor)进行排序,在comparactor中override的compare方法中依据总流量进行了升序排序(4) java代码截图如下:
(5) 运行结果如下:
-
去重计数(Distinct Counting)
(1) 设计模式思想:
分为两个步骤,步骤一中map输出属性组合为key,计数1为value的结果,reduce仅输出属性组合,相当于完成了去重工作
步骤二中map对属性组合中的一个属性进行1的计数,reduce阶段将计数累加,完成了计数工作
(2) 目标问题:
对access.log文件中的网址的不同用户访问数进行计数
(3) java代码主要思路:
使用了两个job实现的,每一个job中一个map一个reduce.
第一阶段的map输出以userid与hostname组成的属性组合为key,计数1为value;reduce输出的就是属性组合
第二阶段的map输出以hostname为key,计数1为value;reduce对每个hostname下的计数1累加完成计数
(4) java代码截图如下:
因为使用了两个job完成任务,所以在main函数中有一系列配置工作完成连个job的设置和连接
(5)运行结果如下:
问题记录
在第二个设计模式的实现过程中因为涉及到两个job,所以要完成一系列的配置工作,通过上网查找学习
基本的配置步骤如下:
(1)分别创建两个Job对象job1,job2 为两个job配置好相应的Map类,Reduce类,输出类型,以及输入路径和输出路径,注意job2的输入路径为job1的输出路径,即job2直接处理job1的结果
(2)分别创建两个ControlledJob对象ctrljob1和ctrljob2,利用setJob()方法设置其job分别为job1和job2
(3)设置ctrljob1和ctrljob2的依赖关系,保证job2的启动依赖与job1的完成
ctrljob2.addDependingJob(ctrljob1);
(4)创建主控制JobControl对象 jobCtrl,并将ctrljob1,ctrljob2加入进去
jobCtrl.addJob(ctrljob1);
jobCtrl.addJob(ctrljob2);
(5)创建线程,执行jobCtrl,直至jobCtrl完成所有任务,停止jobCtrl