浅谈MapReduce编程模型

以Wordcount程序为例,简单描述MapReduce程序的编程模型。

MapReduce程序组成

MapReduce程序一般分成三个部分:

  • 一个程序主引导部分;
  • 一个Map程序部分;
  • 一个Reduce部分。

主引导部分用来设置MapReduce(以下简称 “ MR” )程序的一些非业务逻辑属性,例如最终生成jar包时指定MR框架执行该程序的入口、MR程序的map和reduce部分是哪个(一个jar包中可能封装了多个程序)、map和reduce部分的输出参数类型、输入数据的来源(路径)和输出数据的路径等。

Map程序部分和Reduce程序部分就是业务逻辑部分,只要按照MR框架要求的格式编写。对于这两个部分,分别有map( )和reduce( )两个关键的函数,这两个函数要么是重写继承其父类Mapper和Reducer的成员函数,要么是实现其所实现接口内定义的具体函数。

map( )和reduce( )方法

Mapper类和Reducer类在继承时要分别提供4个参数,分别代表当前模块的输入、输出数据的类型。在实现map、reduce方法时会用到输入参数(key-value)的类型。而这里的类型并不是Java自身的数据类型,而是hadoop自己的一套数据标准。

在hadoop中,由于要考虑对象序列化,而Java自带的对象序列化机制添加了大量的冗余——少量数据为保证网络传输的正确,冗余的占比已经很多。对于hadoop中的海量数据而言,如果仍采用Java自带的序列化机制,添加的冗余数据的量更大,不利于集群之间频繁且大量的网络通信,因此hadoop有自己的一套序列化标准。

主引导方法

最后用一个job类指定本次作业的其余设置。job中指定:

1. getInstance()获得job实例。

2. 设置主类即main函数所在jar包的位置,找到这个主函数后,hadoop才能知道到相应的类的依赖关系(即要告诉classload我的jar包中每个程序的主类在哪,紧跟着才能根据主类找到相应的map和reduce类)。

3. 设置map和reduce方法所在的类。

4. 设置map和reduce方法的输出参数的类型。

5. 设置源数据的路径。

6. 设置输出数据的目录地址路径。

7. 设置job提交给集群,waitforcompletion(true),布尔值表示执行过程是否展示在屏幕上,还是在后台运行。

Wordcount程序示例

package mapreduce.wordcount;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.io.LongWritable;

import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapreduce.Job;

import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;

import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class Wordcount {

public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {

Configuration conf = new Configuration();

Job job = Job.getInstance(conf);

/*

*指定jar包中job的起始入口

*/

job.setJarByClass(Wordcount.class);

/*

* 设置map和reduce方法所在的类

*/

job.setMapperClass(WordcountMapper.class);

job.setReducerClass(WordcountReducer.class);

/*

* reduce 没有相应的setReduceOutputKey这样的方法。故应先用整体的对map和reduce设置相同的参数

* 再对map进行输出参数的特定指定

*/

job.setOutputKeyClass(Text.class);

job.setOutputValueClass(LongWritable.class);

job.setMapOutputKeyClass(Text.class);

job.setMapOutputValueClass(LongWritable.class);

/*

* 输入输出路径设置,当然也可以从main函数参数输入

*/

FileInputFormat.setInputPaths(job, new Path("/wordcount_Test/input"));

FileOutputFormat.setOutputPath(job, new Path("/wordcount_Test/output2"));

/*

* 设置是否在shell中显示执行过程

* 同时该方法会调用启动yarn资源管理框架的方法

*/

job.waitForCompletion(true);

}

}

____________________________________________________________________

package mapreduce.wordcount;

import java.io.IOException;

import org.apache.hadoop.io.LongWritable;

import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapreduce.Mapper;

import org.apache.hadoop.util.StringUtils;

public class WordcountMapper extends Mapper<LongWritable, Text, Text, LongWritable>{

/*

* 其中key是map程序所读文件的每读一行的文件偏移量,而非业务逻辑上的数据所需的对应key-value

* 而四个参数的后两个则描述处理后的标准key-value结果,经map程序处理后形成序列化的类型数据,输出到reduce模块。

* 程序执行时map方法根据数据的特点,可能执行多次

* 但无论执行多少次。都要等全部输入数据被map处理完,在整体发送给reduce模块

*/

protected void map(LongWritable value, Text key, Context context)

throws IOException, InterruptedException {

//得到文本中的一行

String string = value.toString();

//这里可以用Java自带的分割方法,推荐用Hadoop提供的工具方法

String[] words = StringUtils.split(string, ‘ ‘);

//遍历的方式提交,缓存起来

for(String word:words){

context.write(new Text(word), new LongWritable(1));

}

}

}

____________________________________________________________________

package mapreduce.wordcount;

import java.io.IOException;

import org.apache.hadoop.io.LongWritable;

import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapreduce.Reducer;

public class WordcountReducer extends Reducer<Text, LongWritable, Text, LongWritable>{

/*

* Reducer后面的四个泛型参数中的前两个必须要和Mapper后面最后两个泛型类型一致

*/

protected void reduce(Text key, Iterable<LongWritable> values,Context context)

throws IOException, InterruptedException {

long count = 0;

for(LongWritable value:values){

count = count + value.get();

}

//reduce的结果仍输出给mapreduce框架

context.write(key, new LongWritable(count));

}

}

原文地址:https://www.cnblogs.com/fusiji/p/11409925.html

时间: 2024-10-13 22:24:54

浅谈MapReduce编程模型的相关文章

浅谈结对编程

浅谈结对编程 结对编程 结对编程,是一种敏捷软件开发的方法,极限编程的组成部分.结对编程技术是指两位程序员肩并肩地坐在同一台电脑前合作完成同一个设计.同一个算法.同一段代码或同一组测试.一人充当“执行”角色,只负责编程.另外则负责“观察者”(或“导航”),检测bug和把控整体设计.两个程序员具有相同的缺点和盲点的可能性很小,所以当我们采用结对编程的时候会获得一个强大的解决方案.而这个解决方案恰恰是其它软件工程方法学中所没有的. 由于自己长时间都习惯了一个人编程,所以在这次结对编程的初期在做项目的

浅谈mapreduce程序部署

尽管我们在虚拟机client上能非常快通过shell命令,进行运行一些已经封装好实例程序,可是在应用中还是是自己敲代码,然后部署到server中去,以下,我通过程序进行浅谈一个程序的部署过程. 在启动Hadoop之后,然后把程序达成可运行的jar包,并把对应的第三方jar包 包括进去.运行hadoop    jar   XXX. +驱动名称. package com.mapred; import java.io.IOException; import java.io.PrintStream; i

MapReduce编程模型及优化技巧

(一)MapReduce 编程模型 (备注:如果你已经了解MapReduce 编程模型请直接进入第二部分MapReduce 的优化讲解) 在学习MapReduce 优化之前我们先来了解一下MapReduce 编程模型是怎样的? 下图中红色的标注表示没有加入Combiner和Partitioner来进行优化. 上图的流程大概分为以下几步. 第一步:假设一个文件有三行英文单词作为 MapReduce 的Input(输入),这里经过 Splitting 过程把文件分割为3块.分割后的3块数据就可以并行

MapReduce 编程模型概述

MapReduce 编程模型给出了其分布式编程方法, 共分 5 个步骤:1) 迭代(iteration).遍历输入数据, 并将之解析成 key/value 对.2) 将输入 key/value 对映射(map) 成另外一些 key/value 对.3) 依据 key 对中间数据进行分组(grouping).4) 以组为单位对数据进行归约(reduce).5) 迭代. 将最终产生的 key/value 对保存到输出文件中.MapReduce 将计算过程分解成以上 5 个步骤带来的最大好处是组件化与

MapReduce编程模型及其在Hadoop上的实现

转自:https://www.zybuluo.com/frank-shaw/note/206604 MapReduce基本过程 关于MapReduce中数据流的传输过程,下图是一个经典演示:  关于上图,可以做出以下逐步分析: 输入数据(待处理)首先会被切割分片,每一个分片都会复制多份到HDFS中.上图默认的是分片已经存在于HDFS中. Hadoop会在存储有输入数据分片(HDFS中的数据)的节点上运行map任务,可以获得最佳性能(数据TaskTracker优化,节省带宽). 在运行完map任务

浅谈CSS盒子模型

[摘要]盒子模型是CSS中的一个重要概念,虽然CSS中没有盒子这个单独的属性对象,但它却是CSS中无处不在的一个重要组成部分.掌握盒子模型的原理和使用方法可以极大地丰富HTML元素的表现效果,同时对于整个HTML文档的布局也会产生很大的帮助和促进.本文尝试在介绍CSS盒子模型基本概念和组成元素属性的基础上,结合个人学习经验对其在网页制作中的实际应用谈一谈自己浅显的观点和看法.[关键词]盒子模型:表现效果:网页布局: CSS是Cascading Style Sheets的缩写,中文意思是层叠样式表

【MapReduce】二、MapReduce编程模型

??通过前面的实例,可以基本了解MapReduce对于少量输入数据是如何工作的,但是MapReduce主要用于面向大规模数据集的并行计算.所以,还需要重点了解MapReduce的并行编程模型和运行机制. ??我们知道,MapReduce计算模型主要由三个阶段构成:Map.shuffle.Reduce.Map和Reduce操作需要我们自己定义相应Map类和Reduce类.而shuffle则是系统自动帮我们实现的,是MapReduce的"心脏",是奇迹发生的地方.是其主要流程基本如下图所示

MapReduce编程模型

Map:-------分割 Reduce:---合并 ==== Batch,ESB: Splite:----分割 Aggert:---合并 Channel----管道 BPM Join fork task ========================================== 都是基于Job—Task的多线程编程模型实现,不同的仅仅是单一的文件系统存储还是分布式集群存储的文件系统(数据统一存储,数据分块存储在不同的机器里面,单一机器里面的数据不能单独使用,因为数据不全,而统一存储的

浅谈Java内存模型

Java内存模型虽说是一个老生常谈的问题 ,也是大厂面试中绕不过的,甚至初级面试也会问到.但是真正要理解起来,还是相当困难,主要这个东西看不见,摸不着.网上已经有大量的博客,但是人家的终究是人家的,自己也要好好的去理解,去消化.今天我也来班门弄斧,说下Java内存模型. 说到Java内存模型,不得不说到 计算机硬件方面的知识. 计算机硬件体系 我们都知道CPU 和 内存是计算机中比较核心的两个东西,它们之间会频繁的交互,随着CPU发展越来越快,内存的读写的速度远远不如CPU的处理速度,所以CPU