MapReduce详解(1)

简介: MapReduce详解

第1章 MapReduce入门

1.1 MapReduce定义

Mapreduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架。


Mapreduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个hadoop集群上。


1.2 MapReduce优缺点

1.2.1 优点

1.MapReduce 易于编程


它简单的实现一些接口,就可以完成一个分布式程序,这个分布式程序可以分布到大量廉价的PC机器上运行。就是因为这个特点使得MapReduce编程变得非常流行。


2.良好的扩展性


当计算资源不能得到满足的时候,可以通过简单的增加机器来扩展它的计算能力。


3.高容错性


MapReduce设计的初衷就是使程序能够部署在廉价的PC机器上,这就要求它具有很高的容错性。比如其中一台机器挂了,它可以把上面的计算任务转移到另外一个节点上运行,不至于这个任务运行失败,而且这个过程不需要人工参与,而完全是由Hadoop内部完成的。


4.适合PB级以上海量数据的离线处理


它适合离线处理而不适合在线处理。比如像毫秒级别的返回一个结果,MapReduce很难做到。


1.2.2 缺点

MapReduce不擅长做实时计算、流式计算、DAG(有向图)计算。


1. 实时计算


MapReduce无法像Mysql一样,在毫秒或者秒级内返回结果。


2. 流式计算


流式计算的输入数据是动态的,而MapReduce的输入数据集是静态的,不能动态变化。这是因为MapReduce自身的设计特点决定了数据源必须是静态的。


3. DAG(有向图)计算


多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出。在这种情况下,MapReduce并不是不能做,而是使用后,每个MapReduce作业的输出结果都会写入到磁盘,会造成大量的磁盘IO,导致性能非常的低下。


1.3 MapReduce核心思想

MapReduce核心思想,如图



去.png


1)分布式的运算程序往往需要分成至少2个阶段。


2)第一个阶段的maptask并发实例,完全并行运行,互不相干。


3)第二个阶段的reduce task并发实例互不相干,但是他们的数据依赖于上一个阶段的所有maptask并发实例的输出。


4)MapReduce编程模型只能包含一个map阶段和一个reduce阶段,如果用户的业务逻辑非常复杂,那就只能多个mapreduce程序,串行运行。


1.4 MapReduce进程(MR)

一个完整的mapreduce程序在分布式运行时有三类实例进程:


1)MrAppMaster:负责整个程序的过程调度及状态协调。


2)MapTask:负责map阶段的整个数据处理流程。


3)ReduceTask:负责reduce阶段的整个数据处理流程。


1.5 MapReduce编程规范

用户编写的程序分成三个部分:Mapper、Reducer和Driver。


1.Mapper阶段


(1)用户自定义的Mapper继承Mapper


(2)Mapper的输入数据是KV对的形式(KV的类型可自定义)


(3)Mapper中的业务逻辑写在map()方法中


(4)Mapper的输出数据是KV对的形式(KV的类型可自定义)


(5)map()方法(maptask进程)对每一个调用一次


2.Reducer阶段


(1)用户自定义的Reducer继承Reducer


(2)Reducer的输入数据类型对应Mapper的输出数据类型,也是KV


(3)Reducer的业务逻辑写在reduce()方法中


(4)Reducetask进程对每一组相同k的组调用一次reduce()方法


3.Driver阶段(关联Mapper和Reducer,并且提交任务到集群)


相当于yarn集群的客户端,用于提交我们整个程序到yarn集群,提交的是封装了mapreduce程序相关运行参数的job对象


第2章 Hadoop序列化

2.1 序列化概述

2.1.1 什么是序列化

序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储(持久化)和网络传输。


反序列化就是将收到字节序列(或其他数据传输协议)或者是硬盘的持久化数据,转换成内存中的对象。


2.1.2 为什么要序列化

       一般来说,“活的”对象只生存在内存里,关机断电就没有了。而且“活的”对象只能由本地的进程使用,不能被发送到网络上的另外一台计算机。 然而序列化可以存储“活的”对象,可以将“活的”对象发送到远程计算机。


2.1.3 为什么不用Java的序列化 serilazable

Java的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额外的信息(各种校验信息,header,继承体系等),不便于在网络中高效传输。所以,hadoop自己开发了一套序列化机制(Writable),特点如下:


1.紧凑


紧凑的格式能让我们充分利用网络带宽,而带宽是数据中心最稀缺的资源


2.快速


进程通信形成了分布式系统的骨架,所以需要尽量减少序列化和反序列化的性能开销,这是基本的;


3.可扩展


协议为了满足新的需求变化,所以控制客户端和服务器过程中,需要直接引进相应的协议,这些是新协议,原序列化方式能支持新的协议报文;


4.互操作


能支持不同语言写的客户端和服务端进行交互;


2.2 常用数据序列化类型

表4-1 常用的数据类型对应的hadoop数据序列化类型

Java类型

Hadoop Writable类型

boolean

BooleanWritable

byte

ByteWritable

int

IntWritable

float

FloatWritable

long

LongWritable

double

DoubleWritable

String

Text

map

MapWritable

array

ArrayWritable


2.3 自定义bean对象实现序列化接口(Writable)

自定义bean对象要想序列化传输,必须实现序列化接口,需要注意以下7项。


(1)必须实现Writable接口


(2)反序列化时,需要反射调用空参构造函数,所以必须有空参构造

public FlowBean() {
super();
}

(3)重写序列化方法

@Override
public void write(DataOutput out) throws IOException {
out.writeLong(upFlow);
out.writeLong(downFlow);
out.writeLong(sumFlow);
}


(4)重写反序列化方法


@Override
public void readFields(DataInput in) throws IOException {
upFlow = in.readLong();
downFlow = in.readLong();
sumFlow = in.readLong();
}


(5)注意反序列化的顺序和序列化的顺序完全一致


(6)要想把结果显示在文件中,需要重写toString(),可用”\t”分开,方便后续用。


第3章 MapReduce框架原理

3.1 MapReduce工作流程

1.流程示意图,如图所示


请.png


2.流程详解


上面的流程是整个mapreduce工作流程,但是shuffle过程只是从第7步开始到第16步结束,具体shuffle过程详解,如下:


1)maptask收集我们的map()方法输出的kv对,放到内存缓冲区中


2)从内存缓冲区不断溢出本地磁盘文件,可能会溢出多个文件


3)多个溢出文件会被合并成大的溢出文件


4)在溢出过程中,及合并的过程中,都要调用partitioner进行分区和针对key进行排序


5)reducetask根据自己的分区号,去各个maptask机器上取相应的结果分区数据


6)reducetask会取到同一个分区的来自不同maptask的结果文件,reducetask会将这些文件再进行合并(归并排序)


7)合并成大文件后,shuffle的过程也就结束了,后面进入reducetask的逻辑运算过程(从文件中取出一个一个的键值对group,调用用户自定义的reduce()方法)


3.注意


Shuffle中的缓冲区大小会影响到mapreduce程序的执行效率,原则上说,缓冲区越大,磁盘io的次数越少,执行速度就越快。


缓冲区的大小可以通过参数调整,参数:io.sort.mb  默认100M。



相关文章
|
消息中间件 搜索推荐 算法
数据仓库常见规范
数据仓库常见规范
数据仓库常见规范
|
存储 SQL Java
Java8 stream 中利用 groupingBy 进行多字段分组求和
Java8 stream 中利用 groupingBy 进行多字段分组求和
|
数据采集 Web App开发 监控
捕获抖音截图:如何用Puppeteer保存页面状态
随着抖音直播的兴起,实时动态和互动元素吸引了大量用户。为了捕获直播页面的实时信息,本文介绍了如何使用 Puppeteer 和代理 IP 服务,解决页面动态加载、反爬虫机制等问题,实现自动化抓取和截图保存。通过安装 Puppeteer、配置代理 IP 和编写简单脚本,可以高效地捕获抖音直播页面的状态。
495 51
|
JavaScript
成功解决:Failed to resolve directive: mode
这篇文章介绍了如何解决Vue中遇到的"Failed to resolve directive: mode"错误的两个常见原因及其解决办法:确保指令的单词拼写正确,以及在创建Vue实例之前注册全局指令。
成功解决:Failed to resolve directive: mode
|
缓存 NoSQL Java
Java一分钟之-Spring Data Redis:使用Redis做缓存
【6月更文挑战第10天】Spring Data Redis是Spring框架的一部分,简化了Java应用与Redis的集成,支持多种数据结构操作。本文介绍了其基本使用,包括添加依赖、配置Redis连接及使用RedisTemplate。还讨论了常见问题,如序列化、缓存穿透和雪崩,并提供解决方案。通过实战示例展示了缓存与数据库读写分离的实现,强调了Spring Data Redis在提升系统性能中的作用。
512 0
|
机器学习/深度学习 算法
基于RBF神经网络的自适应控制器simulink建模与仿真
使用MATLAB2022a,开发了一个基于RBF神经网络的自适应控制器Simulink S函数,进行了控制仿真。核心程序展示了RBF网络的权重和参数调整。测试结果显示了控制效果。RBF网络是一种三层前馈网络,利用高斯函数处理非线性系统。自适应控制器通过在线调整参数应对系统变化。网络学习分为自组织和有导师两个阶段,通过误差信号调整权重,确保系统稳定性。
|
分布式计算 资源调度 Hadoop
Hadoop 1 与 Hadoop 2 的区别详解
【8月更文挑战第31天】
456 0
|
运维 容灾 Cloud Native
我们如何实现“业务 100% 云原生化,让阿里中间件全面升级到公共云架构”?
在今年的天猫双 11 中,中间件支撑了 5403 亿的交易量,并全面升级到了公共云架构。 此次的架构升级,是以开源为内核、以公共云为基础、以 OpenAPI 进行解偶扩展,在架构上,对开源、自研、商业化进行统一。通过采用和反哺开源、推动社区建设,通过阿里巴巴丰富的业务场景、打磨技术的性能和可用性,通过云上商业化服务更多企业、打造更好的用户体验,全方位锤炼云上产品的竞争力。
1103 83
我们如何实现“业务 100% 云原生化,让阿里中间件全面升级到公共云架构”?
|
关系型数据库 MySQL Java
MySQL的问题
MySQL的问题
300 0
|
SQL XML 分布式计算
MaxCompute异常问题之请求头异常如何解决
MaxCompute异常涉及到在使用阿里云MaxCompute大数据计算服务时遇到的各种错误和问题;本合集将提供针对MaxCompute异常的分析和解决方案,帮助用户处理数据处理、分析任务中的异常情况。