zoukankan      html  css  js  c++  java
  • hadoop5--mapreduce设计模式

    运行结果附图

    本节课程主要内容为学习MapReduc设计模式,并编写java程序对日志文件进行处理。

    课本上介绍的MapReduce的设计模式主要包含:计数(Counting),分类(Classification),过滤处理(Filtering),排序(Sorting),去重计数(Distinct Counting),相关计数(Cross-Correlation).

    本次作业选取了其中两个设计模式进行练习:排序(Sorting) ,去重计数(Distinct Counting)

    1. 排序(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代码截图如下:

      2015-04-26 17:21:41 的屏幕截图

      2015-04-26 17:22:24 的屏幕截图

      (5) 运行结果如下:

      st

      st2

      st3

    2. 去重计数(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的设置和连接

      2015-04-26 19:02:47 的屏幕截图

      2015-04-26 19:03:12 的屏幕截图

      2015-04-26 19:04:05 的屏幕截图

      2015-04-26 19:25:40 的屏幕截图

      (5)运行结果如下:

      newcd

      newcd1

      newcd2

      newcd3

    问题记录

    在第二个设计模式的实现过程中因为涉及到两个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

  • 相关阅读:
    .java中如何实现序列化,有什么意义
    缓存穿透
    缓存击穿
    缓存雪崩
    redis缓存预热
    Docket 的常用命令
    数据库优化方法
    servlet和jsp的区别:
    6原则1法则
    学习IntelliJ IDEA(二)模块
  • 原文地址:https://www.cnblogs.com/ivywenyuan/p/4579372.html
Copyright © 2011-2022 走看看