MapReduce原理及编程

文章目录

  • 一.关于MapReduce
    • (一)什么是MapReduce?
    • (二) MapReduce的设计思想
    • (三) MapReduce特点
    • (四)MapReduce实现WordCount
    • (五)MapReduce执行过程
    • (六)Key&Value类型
  • 二.MapReduce编程模型
    • (一)InputFormat接口
    • (二)Mapper类
    • (三)Combiner类
    • (四)Partitioner类
    • (五)Reducer类
    • (六)OutputFormat接口
    • (七)Job类执行任务,代码如下:

一.关于MapReduce

(一)什么是MapReduce?

MapReduce是一个分布式计算框架

  • 它将大型数据操作作业分解为可以跨服务器集群并行执行的单个任务。
  • 起源于Google,它是一个编程模型,用于大数据量的计算

适用于大规模数据处理场景

  • 每个节点处理存储在该节点的数据

每个job包含Map和Reduce两部分

(二) MapReduce的设计思想

分而治之

  • 简化并行计算的编程模型,即把对大规模数据集的操作分发给一个主节点管理下的各个子节点共同完成,然后整合各个子节点的中间结果,
  • 从而得到最终的计算结果

构建抽象模型:Map和Reduce

  • 开发人员专注于实现Mapper和Reducer函数

隐藏系统层细节

  • 开发人员专注于业务逻辑实现

(三) MapReduce特点

优点

  • 1)易于编程
  • MapReduce只需简单地实现一些接口,就可以完成一个分布式程序,这个分布式程序可以分布到大量廉价的PC机上运行
  • 2)良好的可扩展性
  • 当计算机资源得不到满足的时候,可以通过简单的增加机器来扩展它的计算能力
  • 3)高容错性
  • 比如一台机器挂了,可以把它上面的计算任务转移到另一个节点上运行,不至于整个任务运行失败,而且这个过程不需要人工干预,
  • 完全由hadoop内部完成
  • 4)高吞吐量
  • 能对PB量级以上海量数据进行离线处理.适合离线处理而不适合实时处理,比如要求毫秒级返回一个结果,会很难做到
    不适用领域
  • 难以实时计算
  • 不适合流式计算
  • DAG(有向图)计算

(四)MapReduce实现WordCount

在这里插入图片描述

(五)MapReduce执行过程

数据定义格式

  • map: (K1,V1) → list (K2,V2)
  • reduce: (K2,list(V2)) → list (K3,V3)

MapReduce执行过程

  • Mapper
  • Combiner
  • Partitioner
  • Shuffle and Sort
  • Reducer
    在这里插入图片描述

(六)Key&Value类型

必须可序列化(serializable hadoop实现的是Writable接口

  • 作用:网络传输以及持久化存储
  • IntWritable、LongWriteable、FloatWritable、Text、DoubleWritable, BooleanWritable、NullWritable等

都继承了Writable接口

  • 并实现write()和readFields()方法

Keys必须实现WritableComparable接口

  • Reduce阶段需要sort
  • keys需要可比较

二.MapReduce编程模型

在这里插入图片描述

(一)InputFormat接口

在这里插入图片描述
InputSplit(数据切片)

  • 1.找到你输入数据存储的目录
  • 2.开始遍历目录下每一个文件
  • 3.遍历第一个文件,wc.txt
  • 4.获取文件大小
  • 5.计算切片的大小,默认情况下切片大小会等于块大小
  • 6.开始切片(假设260M文件,0-128M,128-256M,256M-260M,判断剩下的部分是否大于块的1.1倍,如果不大于1.1,就直接划分为一个切片)

切片和数据块区别?

  • 切片:MapReduce中的逻辑概念,一个切片就是一个Mapper任务
  • 数据库Block:hdfs上的物理切割,是一个物理概念
  • 通常情况下切片的个数等于数据块的个数

定义了如何将数据读入Mapper

  • InputSplit[] getSplits
  • InputSplit表示由单个Mapper处理的数据
  • getSplits方法将一个大数据在逻辑上拆分为InputSplit
  • RecordReader<K,V> getRecordReader

常用InputFormat接口实现类

  • TextInputFormat
  • FileInputFormat
  • KeyValueInputFormat

(二)Mapper类

Mapper主要方法

  • void setup(Context context)
  • org.apache.hadoop.mapreduce.Mapper.Context
  • void map(KEY key, VALUE value, Context context)
  • 为输入分片中的每个键/值对调用一次
  • void cleanup(Context context)
  • void run(Context context)
  • 可通过重写该方法对Mapper进行更完整控制

代码示例如下:

public class WCMapper extends Mapper<LongWritable, Text, Text, IntWritable>
{
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();
    public void map(LongWritable key, Text value, Context ctx)
        throws IOException, InterruptedException
    {  
       StringTokenizer itr = new StringTokenizer( value.toString() );
        while ( itr.hasMoreTokens() )
        {  
	   word.set( itr.nextToken() );
            ctx.write( word, one);
        }
     } 
  }

(三)Combiner类

Combiner相当于本地化的Reduce操作

  • 在shuffle之前进行本地聚合
  • 用于性能优化,可选项
  • 输入和输出类型一致

Reducer可以被用作Combiner的条件

  • 符合交换律和结合律

实现Combiner

  • job.setCombinerClass(WCReducer.class)

(四)Partitioner类

用于在Map端对key进行分区

  • 默认使用的是HashPartitioner
  • 1)获取key的哈希值
  • 2)使用key的哈希值对Reduce任务数求模
  • 决定每条记录应该送到哪个Reducer处理

自定义Partitioner

  • 继承抽象类Partitioner,重写getPartition方法
  • job.setPartitionerClass(MyPartitioner.class)

(五)Reducer类

Reducer主要方法如下:

void setup(Context context)

  • org.apache.hadoop.mapreduce.Reducer.Context

void reduce(KEY key, Iterable values, Context context)

  • 为每个key调用一次

void cleanup(Context context)

void run(Context context)

  • 可通过重写该方法来控制reduce任务的工作方式

(六)OutputFormat接口

在这里插入图片描述
定义了如何将数据从Reducer进行输出

  • RecordWriter<K,V> getRecordWriter-->将Reducer的<key,value>写入到目标文件
  • checkOutputSpecs-->判断输出目录是否存在

常用OutputFormat接口实现类

  • TextOuputFormat
  • SequenceFileOuputFormat
  • MapFileOuputFormat

(七)Job类执行任务,代码如下:

//创建Job
Job job = Job.getInstance(getConf(), "WordCountMR" );
//设置jar一般为加载当前类
job.setJarByClass(类名.class);	
//设置输入
FileInputFormat.addInputPath(job,  new Path(args[0]) );
job.setInputFormatClass( TextInputFormat.class );	
//设置输出
FileOutputFormat.setOutputPath( job,  new Path(args[1]) );
job.setOutputFormatClass( TextOutputFormat.class );
//设置map
job.setMapperClass( WCMapper.class );
job.setMapOutputKeyClass( Text.class );
job.setMapOutputValueClass( IntWritable.class );
//设置reduce
job.setReducerClass( WCReducer.class );
job.setOutputKeyClass( Text.class );
job.setOutputValueClass( IntWritable.class );
//提交程序运行
boolean result = job.waitForCompletion(true);
System.exit(result?0:1);

热门文章

暂无图片
编程学习 ·

JavaScript-Promise的使用及详细解释

JavaScript-Promise的使用及详细解释案例使用多种方法实现以下案例第一种---setTimeout嵌套第二种---封装函数Promise详解小案例第三种---使用Promise来实现最开始的案例Promise---具体使用的案例第一版---点击按钮显示图片第二版---加载出第一张之后在加载其他,依次加载第三版…
暂无图片
编程学习 ·

后台开发核心技术(11):多线程

背景介绍 进程:以前,进程是最小的执行单位。进程是包含程序指令和相关资源的集合,每个进程和其他进程一起参与调度,竞争CPU、内存等资源。每次进程的切换,都存在着进程资源的保存和恢复动作,这称为上下文切换。 发现问题:比如一个简单的GUI程序,为了有更好的交互性,通…
暂无图片
编程学习 ·

常用的Python爬虫工具列表分享

今天扣丁学堂小编为你详细的总结了一下关于Python视频教程之Python爬虫的工具列表都有哪些呢,而这个列表包含与网页抓取和数据处理的Python库,下面我们一起来看一下吧。 ​ 网络 urllib-网络库(stdlib)。 requests-网络库。 grab–网络库(基于pycurl)。 pycurl–网络库(绑…
暂无图片
编程学习 ·

XML DOM摘要四(XMLHttpRequest 对象)

什么是 XMLHttpRequest 对象?XMLHttpRequest 对象提供了在网页加载后与服务器进行通信的方法。XMLHttpRequest 对象是开发者的梦想,因为您能够:在不重新加载页面的情况下更新网页在页面已加载后从服务器请求数据在页面已加载后从服务器接收数据在后台向服务器发送数据 所有现…
暂无图片
编程学习 ·

跟汤老师学Java笔记: 流有哪三种分类方式

跟汤老师学Java笔记: 流有哪三种分类方式 完成:第一遍 1… 流有哪三种分类方式? 三类: 按流的方向(按内存为中心)分类: 输入流:用于读取数据,比如从文件中读取数据到程序中,由InputStream和Reader作为父类 输出流:用于写出数据,比如将程序中的数据写出到文件中,由…
暂无图片
编程学习 ·

Zabbix简介

一、Zabbix介绍 Zabbix是一个企业级的、开源的、分布式的监控套件 Zabbix可以监控网络和服务的监控状况. Zabbix利用灵活的告警机制,允许用户对事件发送基于Email的告警. 这样可以保证快速的对问题作出响应. Zabbix可以利用存储数据提供杰出的报告及图形化方式. 这一特性将帮助…
暂无图片
编程学习 ·

本地项目提交到Github上

1.在个人github主页创建一个空仓库2.填写完相关资料后再项目文件中打开本地git客户端3.进入到刚刚的新建仓库中,如图操作3.依次在git客户端内输入以下命令,这部会用到上面复制到的地址 git initgit add .origin后面的地址是你刚刚自己复制的地址 git remote add origin https:/…
暂无图片
编程学习 ·

2.4-1、斐波那契数列

1、斐波那切数列 【问题描述】 斐波那切数列0,1,1,2,3,5,8,13,21,34,55……从第三项起,每一项都是紧挨着的前两项的和。写出计算斐波那切数列的任意一个数据项递归程序。 【输入格式】 输入所求的项数。 【输出格式】 输出数据项的值。 【输入样例】fbi.in 10 【输出…
暂无图片
编程学习 ·

SSM项目所需的配置文件

整合SSM框架或者用SSM写项目时所需要的文件 spring中的applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSc…
暂无图片
编程学习 ·

Leetcode刷题链表预备知识(C)

Leetcode里的head指针指向实实在在的链表第一个结点,该结点不是哨兵结点。 对链表处理完之后,链表成为空链表,则head指针赋值NULL。 写代码的时候,不要写出p->next->next这种东西,因为如果p->next==NULL,那程序运行就报错了。 用指针的时候,一定要判其是否为NU…
暂无图片
编程学习 ·

MySQL - 基础语法

MySQL - 基础语法 SQL Structured Query Language:结构化查询语言 定义了了操作所有关系型数据库的规则 SQL 通用语法SQL 语句可以单行或多行书写,以分号结尾 可使用空格和缩进来增强语句的可读性 MySQL 数据库的SQL语句不区分大小写,关键字建议大写 注释:单行注释:-- 注释…
暂无图片
编程学习 ·

matplotlib绘制折线图

绘制了折线图(plt.plot)设置了图片的大小和分辨率(plt.figure)实现了图片的保存(plt.savefig)设置了xy轴上的刻度和字符串(xticks)解决了刻度稀疏和密集的问题(xticks)设置了标题,xy轴的lable(title,xlable,ylable)设置了字体(font_manager. fontProperties,matplotlib.rc)在一…
暂无图片
编程学习 ·

css rgba/hsla知识点讲解及半透明边框

一、RGBA(R,G,B,A) 参数: R:红色值。正整数 | |百分数G:绿色值。正整数 | |百分数B:蓝色值。正整数 | |百分数A:Alpha透明度。取值0~1之间。说明:此色彩模式与RGB相同,只是在RGB模式上新增了Alpha透明度。 RGBA 颜色值得到以下浏览器的支持:IE9+、Firefox 3+、Chrome、S…
暂无图片
编程学习 ·

vue-element-admin(long类型转换json出现精度丢失)

官网:https://panjiachen.github.io/vue-element-admin-site/zh/guide/#%E5%8A%9F%E8%83%BD环境:vscodenode.js后台代码就是简单的基于springboot的增删改查 安装nodejs,在vscode工作空间目录命令行里安装依赖,启动 npm run dev修改框架路径:vue-admin-template-master\v…
暂无图片
编程学习 ·

python从小白到入门(6)

1、集合: >>> set_a = {1,2,3,1,a,b,c} >>> set_a {1, 2, 3, c, a, b} >>> #集合 >>> #集合没用顺序,没有重复,不能索引,hash 哈希类型2、 >>> set1 = {1,2,3} >>> set2 = {a,b,c} >>> set3 = {1, a, 2} &g…
暂无图片
编程学习 ·

计算机组成原理复习 --- 第四章 指令系统

文章目录4.1 指令概述4.2 指令格式(重点)4.3 寻址方式 4.1 指令概述 计算机的指令有微指令、机器指令和宏指令。微指令为微程序级的命令,主要面向硬件,宏指令是由若干机器指令组成的软件指令,它是面向软件的。机器指令主要处在微指令和宏指令之间。 指令系统:一台计算机中…
暂无图片
编程学习 ·

next()与nextLine()区别

next()与nextLine()区别 两种接收方式第一种import java.util.Scanner;public class Demo01 {public static void main(String[] args) {//创建一个扫描器对象,用于按收健盘数据Scanner sc = new Scanner(System.in);System.out.println("使用next方式接收");//为断…
暂无图片
编程学习 ·

红黑树之 删除

1.删除动作红黑树和二叉搜索树的删除类似,只不过加上颜色属性(这里的子节点均指非NULL节点):无子节点时,删除节点可能为红色或者黑色;1.1 如果为红色,直接删除即可,不会影响黑色节点的数量;1.2 如果为黑色,则需要进行删除平衡的操作了;只有一个子节点时,删除节点只…
暂无图片
编程学习 ·

618 大促背后的淘系前端技术体系

简介:2020年618大促已经过去,作为淘系每年重要的大促活动,淘系前端在其中扮演着什么样的角色,如何保证大促的平稳进行?又在其中应用了哪些新技术?淘系技术特此推出「618 系列|淘系前端技术分享」,为大家介绍 618 中的前端身影。本篇的作者是来自于营销活动团队的墨冥,为…
暂无图片
编程学习 ·

2020大数据面试题真题总结(附答案)

目录一.Hadoop1.hdfs写流程2.hdfs读流程3.hdfs的体系结构4.一个datanode 宕机,怎么一个流程恢复5.hadoop 的 namenode 宕机,怎么解决6.namenode对元数据的管理7.元数据的checkpoint8.yarn资源调度流程 9.hadoop中combiner和partition的作用10.用mapreduce怎么处理数据倾斜问题?…