MapReduce之幺半群

首先先简单介绍一些概念

幺元

幺元即单位元,是集合里的一种特别的元,与该集合里的运算有关。当它和其他元素结合时,并不会改变那些元素。

幺半群

幺半群是一个存在幺元的半群

幺半群具有以下性质:

  • 闭包:对于S中的所有a和b,运算aooob的结果也在S中
  • 结合律:对于S中所有的a,b和c满足以下等式: (a∘b)∘c=(a∘(b∘c)(a \circ b)\circ c=(a\circ(b\circ c)(a∘b)∘c=(a∘(b∘c)
  • 单位元:∃eϵS:∀aϵS:e∘a=a∘e=a{\exists}e\epsilon S: {\forall}a\epsilon S: e \circ a=a \circ e=a∃eϵS:∀aϵS:e∘a=a∘e=a
    此外,幺半群还具有幂等性和交换律等特性。

因为在之前的Mapeduce学习过程中并没有怎么使用Mapeduce的组合器,因此,在这次学习的过程中通过将不具有结合性的MapReduce运算转化为可结合的运算,对于充分利用组合起和提升MapReduce作业的性能具有重要作用。

幺半群和非幺半群示例

整数集最大值

集合S={0,1,2,…}上的求最大值运算定义了一个满足交换律的幺半群,其单位元为0:
MAX(a,MAX(b,c))=MAX(MAX(a,b),c)
MAX(a,0)=MAX(0,a)=a
MAX(a,b) ∈\in∈ S

整数集减法

整数集上的减法运算不能构成一个幺半群,因为不满足结合律:
(1-2)-3 ≠\ne​= 1-(2-3)
(1-2)-3=-4
1-(2-3)=2
同理,整数集的加法和乘法可以构成一个可交换的幺半群,整数集均值和中位数并不能满足幺半群。

在这篇博客中,以计算均值为例,通过使用组合起与幺半群来提升计算性能。

整数集的均值

整数集的计算过程如下
MEAN(1,2,3,4,5)≠\ne​=MEAN(MEAN(1,2,3),MEAN(4,5))
MEAN(1,2,3,4,5)=1+2+3+4+55\frac{1+2+3+4+5}{5}51+2+3+4+5​=3
MEAN(MEAN(1,2,3),MEAN(4,5))=MEAN(2,4.5)=2+4.52\frac{2+4.5}{2}22+4.5​=3.25
这个结果当然有问题啊,所以可以这样修改
MEAN(MEAN(1,2,3),MEAN(4,5))=MEAN(MEAN(6,3),MEAN(9,2)=MEAN(15,5)=3

其中MEAN(6,3)表示 1+2+3=6,总共3个数字

样例数据

key1,1
key1,2
key1,3
key1,4
key1,5
key2,2
key2,4
key2,6
key2,8
key2,10
key3,3
key3,6
key3,9
key3,12
key3,15
key4,4
key4,8
key4,12
key4,16
key4,20
key5,5
key5,10
key5,15
key5,20
key5,25
通过MapReduce,来实现对不同的key求其均值

mapper阶段任务

该阶段主要是将不同的key及其对应的值提取出来,并记录每个不同的key出现的次数

mapper阶段编码

public class MeanMonoizedMapper extends Mapper<LongWritable,Text,Text,PairOfLongInt> {private final static PairOfLongInt reduceV=new PairOfLongInt();private final static Text reduceK=new Text();@Overridepublic void map(LongWritable key,Text value,Context context){String[] lines=value.toString().split(",");try{reduceK.set(lines[0]);reduceV.set(Long.parseLong(lines[1]),1);context.write(reduceK,reduceV);} catch (InterruptedException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}

其中PairOfLongInt设计如下

public class PairOfLongInt implements WritableComparable<PairOfLongInt> {private long left;private int right;public PairOfLongInt(){}public PairOfLongInt(long left,int right){set(left,right);}public void set(long left,int right){this.left=left;this.right=right;}public long getLeft() {return left;}public void setLeft(long left) {this.left = left;}public int getRight() {return right;}public void setRight(int right) {this.right = right;}public int compareTo(PairOfLongInt o) {if(left==o.getLeft()){if(right<o.getRight()){return -1;}if(right>o.getRight()){return 1;}return 0;}if(left<o.getLeft()){return -1;}return 1;}public void write(DataOutput dataOutput) throws IOException {dataOutput.writeLong(left);dataOutput.writeInt(right);}public void readFields(DataInput dataInput) throws IOException {left=dataInput.readLong();right=dataInput.readInt();}
}

combiner阶段任务

主要是统计在该mapper下的和及每个key的个数

combiner阶段编码

public class MeanMonoizedCombiner extends Reducer<Text,PairOfLongInt, Text,PairOfLongInt> {@Overridepublic void reduce(Text key,Iterable<PairOfLongInt> values,Context contexxt){long sum=0;int count=0;for(PairOfLongInt pair:values){sum+=pair.getLeft();count+=pair.getRight();}try{contexxt.write(key,new PairOfLongInt(sum,count));} catch (InterruptedException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}

reducer阶段任务

该阶段求最终的结果

reducer阶段编码

public class MeanMonoizedReducer extends Reducer<Text,PairOfLongInt, Text, DoubleWritable> {@Overridepublic void reduce(Text key,Iterable<PairOfLongInt> values,Context context){long sum=0;int count=0;for(PairOfLongInt pair:values){sum+=pair.getLeft();count+=pair.getRight();}try{context.write(key,new DoubleWritable(sum/count));} catch (InterruptedException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}

驱动程序如下

public class Driver {public static void main(String[] args) throws Exception{Configuration conf=new Configuration();String[] otherArgs=new String[]{"input/MeanMonoized.txt","output"};Job job=new Job(conf,"MeanMonoized");job.setJarByClass(Driver.class);job.setMapperClass(MeanMonoizedMapper.class);job.setCombinerClass(MeanMonoizedCombiner.class);job.setReducerClass(MeanMonoizedReducer.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(PairOfLongInt.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(DoubleWritable.class);FileInputFormat.addInputPath(job,new Path(otherArgs[0]));FileOutputFormat.setOutputPath(job,new Path(otherArgs[1]));System.exit(job.waitForCompletion(true)?0:1);}
}

最终结果如下

MapReduce之幺半群相关推荐

  1. spark的数三角形算法_数据算法 Hadoop Spark大数据处理技巧 PDF 下载

    相关截图: 资料简介: 本书介绍了很多基本设计模式.优化技术和数据挖掘及机器学习解决方案,以解决生物信息学.基因组学.统计和社交网络分析等领域的很多问题.这本书还概要介绍了MapReduce.Hado ...

  2. mapreduce理解_大数据

    map:对不同的数据进行同种操作 reduce:按keys 把数据规约到一起 看这篇文章请出去跑两圈,然后泡一壶茶,边喝茶,边看,看完你就对hadoop 与MapReduce的整体有所了解了. [前言 ...

  3. 2021年大数据Hadoop(二十二):MapReduce的自定义分组

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 MapReduce的自定义分组 需求 分析 实现 第一步: ...

  4. 第2节 mapreduce深入学习:4, 5

    第2节 mapreduce深入学习:4.mapreduce的序列化以及自定义排序 序列化(Serialization)是指把结构化对象转化为字节流. 反序列化(Deserialization)是序列化 ...

  5. 第一个MapReduce程序

    计算文件中每个单词的频数 wordcount 程序调用 wordmap 和 wordreduce 程序. 1 import org.apache.hadoop.conf.Configuration; ...

  6. hadoop程序MapReduce之SingletonTableJoin

    需求:单表关联问题.从文件中孩子和父母的关系挖掘出孙子和爷奶关系 样板:child-parent.txt xiaoming daxiong daxiong alice daxiong jack 输出: ...

  7. 初学Hadoop之图解MapReduce与WordCount示例分析

    Hadoop的框架最核心的设计就是:HDFS和MapReduce.HDFS为海量的数据提供了存储,MapReduce则为海量的数据提供了计算. HDFS是Google File System(GFS) ...

  8. MapReduce编程初体验

    需求:在给定的文本文件中统计输出每一个单词出现的总次数 第一步: 准备一个aaa.txt文本文档 第二步: 在文本文档中随便写入一些测试数据,这里我写入的是 hello,world,hadoop he ...

  9. [MaxCompute MapReduce实践]通过简单瘦身,解决Dataworks 10M文件限制问题

    用户在DataWorks上执行MapReduce作业的时候,文件大于10M的JAR和资源文件不能上传到Dataworks,导致无法使用调度去定期执行MapReduce作业. 解决方案: 第一步:大于1 ...

  10. mapreduce作业reduce被大量kill掉

    之前有一段时间.我们的hadoop2.4集群压力非常大.导致提交的job出现大量的reduce被kill掉.同样的job执行时间比在hadoop0.20.203上面长了非常多.这个问题事实上是redu ...

最新文章

  1. LeeCode-Majority Element
  2. MSVCR80D.dll not found 问题(转)
  3. LVS的简单示例(一)
  4. Android 开发技能图谱
  5. RabbitMQ死信实战(生产者)
  6. linux启动java包脚本
  7. 学成在线--14.使用RabbitMQ完成页面发布
  8. php比例算法,图片比例转换算法
  9. Redis基础(十)——性能监控和监视器
  10. 博文视点大讲堂25期——2天玩转单反相机
  11. (转)水晶报表横向打印BUG处理
  12. VB6程序实现XP或者WIN7风格
  13. 开关电源中的电感电容
  14. java系统化基础-day01-基础语法知识
  15. 新年贺卡php,PS设计2016猴年大吉新年贺卡
  16. 功率电感的两个额定电流 Isat 与 Irms
  17. 灯饰展厅装修设计需要注意什么问题
  18. linux开启telnet服务(总结)
  19. 中国十大可行性研究报告公司
  20. L1-057 PTA使我精神焕发 (5 分)

热门文章

  1. Rstudio图片保存方式
  2. SQL 中的昨天、今天和明天
  3. Springboot整合Hibernate入门
  4. SICP练习题1.14
  5. 家用路由器及NAT协议
  6. Unity手游优化总概
  7. 天载配资关注这个转折点机会
  8. LeetCode简单题之三除数
  9. 【转】Power System 中基于 VIOS 的虚拟以太网实现
  10. ubuntu16.04无法调节屏幕亮度