深入浅出:HADOOP分布式计算框架

article/2025/10/20 4:06:54

hadoop分布式计算框架详解

1.1 分布式计算框架
1.1.1 编程模型
1. inputformat
在MapReduce 程序的开发过程中,往往需要用到FileInputFormat与TextInputFormat, 我们会发现TextInputFormat 这个类继承自FileInputFormat , FileInputFormat 这个类继承自InputFormat ,InputFormat 这个类会将文件file 按照逻辑进行划分,划分成的每一个split 切片将会被分配给一个Mapper 任务,文件先被切分成split 块,然后每一个split 切片对应一个Mapper 任务。FileInputFormat 的划分机制:
A. 简单地按照文件的内容长度进行切片
B. 切片大小,默认等于block 大小
C. 切片时不考虑数据集整体,而是逐个针对每一个文件单独切片
默认情况下, split size =block size,在hadoop 2.x 中为128M。注意:bytesRemaining/splitSize > 1.1 不满足的话,那么最后所有剩余的会作为一个切片。从而不会形成例如129M 文件规划成两个切片的局面。
2. MapTask 端的工作机制
inputFile 通过split 被逻辑切分为多个split 文件,通过Record按行读取内容给map(用户自己实现的)进行处理,数据被map 处
理结束之后交给OutputCollector 收集器,对其结果key 进行分区(默认使用hash 分区),然后写入buffer,每个map task 都有一个内存缓冲区,存储着map 的输出结果,当缓冲区快满的时候需要将缓冲区的数据以一个临时文件的方式存放到磁盘,当整个maptask 结束后再对磁盘中这个map task 产生的所有临时文件做合并,生成最终的正式输出文件,然后等待reduce task 来拉数据。Map端的输入的(k,v)分别是该行的起始偏移量,以及每一行的数据内容,map 端的输出(k,v)可以根据需求进行自定义,但是如果输出的是javabean 对象,需要对javabean 继承writable
3. shuffle 的过程
shuffle 的过程是:Map 产生输出开始到Reduce取得数据作为输入之前的过程称作shuffle.
1).Collect 阶段:将MapTask 的结果输出到默认大小为100M 的环形缓冲区,保存的是key/value,Partition 分区信息等。
2).Spill 阶段:当内存中的数据量达到一定的阀值的时候,就会将数据写入本地磁盘,在将数据写入磁盘之前需要对数据进行一次排序的操作,如果配置了combiner,还会将有相同分区号和key 的数据进行排序。
3).Merge 阶段:把所有溢出的临时文件进行一次合并操作,以确保一个MapTask 最终只产生一个中间数据文件。
4).Copy 阶段: ReduceTask 启动Fetcher 线程到已经完成MapTask 的节点上复制一份属于自己的数据,这些数据默认会保存在内存的缓冲区中,当内存的缓冲区达到一定的阀值的时候,就会将数据写到磁盘之上。
5).Merge 阶段:在ReduceTask 远程复制数据的同时,会在后台开启两个线程对内存到本地的数据文件进行合并操作。
6).Sort 阶段:在对数据进行合并的同时,会进行排序操作,由于MapTask 阶段已经对数据进行了局部的排序,ReduceTask 只需保证Copy 的数据的最终整体有效性即可。
Shuffle 中的缓冲区大小会影响到mapreduce 程序的执行效率,原则上说,缓冲区越大,磁盘io 的次数越少,执行速度就越快缓冲区的大小可以通过参数调整, 参数:io.sort.mb 默认100M
在这里插入图片描述4. reduceTask
reducer 将已经分好组的数据作为输入,依次为每个键对应分组执行reduce 函数。reduce 函数的输入是键以及包含与该键对应的所有值的迭代器。reduce 端的输入是map 端的输出,它输出的(k,v)根据需求进行自定义,reducetask 并行度同样影响整个job 的执行并发度和执行效率,与maptask的并发数由切片数决定不同,Reducetask 数量的决定是可以直接手动设置:job.setNumReduceTasks(4);如果数据分布不均匀,就有可能在reduce 阶段产生数据倾斜。默认的reduceTask 的是1
*Task 并行度经验之谈:
最好每个task 的执行时间至少一分钟。如果job 的每个map或者reduce task 的运行时间都只有30-40 秒钟,那么就减少该
job 的map 或者reduce 数,每一个task(map|reduce)的setup 和加入到调度器中进行调度,这个中间的过程可能都要花费几秒钟,所以如果每个task 都非常快就跑完了,就会在task 的开始和结束的时候浪费太多的时间。默认情况下,每一个task 都是一个新的JVM 实例,都需要开启和销毁的开销。在一些情况下,JVM 开启和销毁的时间可能会比实际处理数据的时间要消耗的长,配置task 的JVM 重用可以改善该问题:(mapred.job.reuse.jvm.num.tasks,默认是1,表示一个JVM 上最多可以顺序执行的task 数目(属于同一个Job)是1。也就是说一个task启动一个JVM),如果input 的文件非常的大,比如1TB,可以考虑将hdfs 上的每个blocksize 设大,比如设成256MB 或者512MB
5. outputformat
OutputFormat 主要用于描述输出数据的格式, 它能够将用户提供的key/value 对写入特定格式的文件中。Hadoop 自带了很多OutputFormat 的实现,它们与InputFormat 实现相对应,足够满足我们业务的需要。OutputFormat类的层次结构如下图所示
在这里插入图片描述OutputFormatOutputFormat 是MapReduce 输出的基类, 所有MapReduce 输出都实现了OutputFormat 接口,主要有:
TextInputFormat 、SequenceFileOutputFormat、MultipleOutputs、DBOutputFormat 等
1.1.2 特殊的组件partitioner 与combiner
1. partitioner 定义
partitioner 的作用是将mapper(如果使用了combiner 的话就是combiner)输出的key/value 拆分为分片(shard),每个reducer 对应一个分片。默认情况下,partitioner 先计算key 的散列值(通常为md5 值)。然后通过reducer 个数执行取模运算:key.hashCode%(reducer 个数)。这种方式不仅能够随机地将整个key空间平均分发给每个reducer,同时也能确保不同mapper 产生的相同key 能被分发到同一个reducer 。也可以自定义分区去继承partition<key,value>把不同的结果写入不同的文件中分区Partitioner 主要作用在于以下两点
(1)根据业务需要,产生多个输出文件;
(2)多个reduce 任务并发运行,提高整体job 的运行效率
适用范围:
需要非常注意的是:必须提前知道有多少个分区。比如自定义Partitioner 会返回5 个不同int 值,而reducer number 设置了小于5,那就会报错。所以我们可以通过运行分析任务来确定分区数。
2. map 端的combiner 组件
每一个map 都可能会产生大量的本地输出,Combiner 的作用就是对map 端的输出先做一次合并,以减少在map 和reduce 节点
之间的数据传输量,以提高网络IO 性能,是MapReduce 的一种优化手段之一。combiner 是MR 程序中Mapper 和Reducer 之外的一种组件,combiner 组件的父类就是Reducercombiner,它 和reducer 的区别在于运行的位置:combiner 是在每一个maptask 所在的节点运行,reducer 是接收全局所有Mapper 的输出结果;combiner 的意义就是对每一个maptask 的输出进行局部汇总,以减小网络传输量
具体实现步骤:
1)自定义一个combiner 继承Reducer,重写reduce 方法
2)设置: job.setCombinerClass(CustomCombiner.class)
Combiner 使用需要注意的是:
1.combiner 能够应用的前提是不能影响最终的业务逻辑,而且,combine输出kv 应该跟reducer 的输入kv 类型要对应起来
2.有很多人认为这个combiner 和map 输出的数据合并是一个过程,其实不然,map 输出的数据合并只会产生在有数据spill 出的时候,即进行merge 操作。
3.与mapper 和reducer 不同的是,combiner 没有默认的实现,需要显式的设置在conf 中才有作用。
4.并不是所有的job 都适用combiner,只有操作满足结合律的才可设置combiner。combine 操作类似于:opt(opt(1, 2, 3), opt(4,5, 6))。如果opt 为求和、求最大值的话,可以使用,但是如果是求中值的话,不适用。
5.一般来说,combiner 和reducer 它们俩进行同样的操作。
分布式计算的整个流程分析如下图所示:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/01pSo5FL.shtml

相关文章

Hadoop学习之MapReduce分布式计算框架

目录 一、本地模式 1.新建一个本地maven项目 2.修改prom依赖&#xff08;maven&#xff09; 3.新建一个包mapreduce&#xff0c;在该包中新建三个包 4.写mapper组件 5.写Reducer组件 6.写Driver组件 7.运行结果 二、集群模式词频统计 1.准备用于单词计数的文件夹和文…

MapReduce(分布式计算框架)

什么是MapReduce MapReduce是分布式计算框架&#xff0c;它将大型数据操作作业分解为可以跨服务器集群并行执行的单个任务&#xff0c;适用于大规模数据处理场景&#xff0c;每个job包含Map和Reduce两部分 MapReduce的设计思想 分而治之&#xff1a;简化并行计算的编程模型 …

140.深度学习分布式计算框架-3

140.1 Horovod Horovod是 Uber 开源的又一个深度学习工具&#xff0c;它的发展吸取了 Facebook「一小时训练 ImageNet 论文」与百度 Ring Allreduce 的优点&#xff0c;可为用户实现分布式训练提供帮助。Horovod 支持通过用于高性能并行计算的低层次接口 – 消息传递接口 (MPI…

【MapReduce】分布式计算框架MapReduce

分布式计算框架MapReduce 什么是MapReduce? MapReduce起源是2004年10月Google发表了MapReduce论文,之后由Mike Cafarella在Nutch(爬虫项目)中实现了MapReduce的功能。它的设计初衷是解决搜索引擎中大规模网页数据的并行处理问题,之后成为Apache Hadoop的核心子项目。 它…

【Hadoop】MapReduce——分布式计算框架

文章目录 一、MapReduce设计理念二、MpaReduce计算流程1 原始数据File2 数据块Block3 切片Split4 MapTask5 环形数据缓冲区KvBuffer6 分区Partation7 排序Sort8 溢写Spill9 合并Merge10 组合器Combiner11 拉取Fetch12 合并 merge13 归并Reduce14 写出Output15 MapReduce过程图解…

python-17-并行计算和分布式计算框架dask

dask入门教程 并行计算库Dask官方教程&#xff08;中文翻译&#xff09; dask和numpy的计算对比 1 并行计算和分布式计算 1.1 并行计算parallel computing 并行计算&#xff1a;这是一台计算机的概念&#xff0c;即一台计算机中多个处理器被组织起来&#xff0c;大任务下达的…

大数据技术入门:MapReduce(分布式计算框架)

大家好&#xff0c;我是百思不得小赵。 创作时间&#xff1a;2022 年 7 月 7 日 博客主页&#xff1a; &#x1f50d;点此进入博客主页 —— 新时代的农民工 &#x1f64a; —— 换一种思维逻辑去看待这个世界 &#x1f440; 今天是加入CSDN的第1222天。觉得有帮助麻烦&#x1…

05-分布式计算框架

目录 一&#xff0c;MapReduce 1&#xff0c;简介 2&#xff0c;原理 2.1 基本概念 2.2 程序执行过程 2.3 作业运行模式 二&#xff0c;Spark 1&#xff0c;简介 1.1 背景 1.2 概念 1.3 特点 2&#xff0c;原理 2.1 编程模型 2.2 运行模式 2.3 运行过程 2.4 DA…

大数据之Hadoop分布式计算框架MapReduce

这里写目录标题 一、MapReduce概述二、MapReduce编程模型简述三、MapReduce词频统计案例mvn clean package 四、词频统计案例进阶之Combiner五、词频统计案例进阶之Partitioner六、案例二介绍 一、MapReduce概述 Hadoop MapReduce 是一个分布式计算框架&#xff0c;用于编写批处…

分布式系列之分布式计算框架Flink深度解析

Flink作为主流的分布式计算框架&#xff0c;满足批流一体、高吞吐低时延、大规模复杂计算、高可靠的容错和多平台部署能力。本文简要介绍了Flink中的数据流处理流程以及基本部署架构和概念&#xff0c;以加深对分布式计算平台的了解。 1、Flink概述 Apache Flink是一个框架和分…

分布式计算框架——MapReduce

一、MapReduce概述 Hadoop MapReduce 是一个分布式计算框架&#xff0c;用于编写批处理应用程序。编写好的程序可以提交到 Hadoop 集群上用于并行处理大规模的数据集。 MapReduce 作业通过将输入的数据集拆分为独立的块&#xff0c;这些块由 map 以并行的方式处理&#xff0c…

【学习笔记1】分布式计算技术及框架

一.定义及描述 分布式计算(Distributed Computing)&#xff0c;又称分散式计算&#xff0c;指通过分布式系统进行计算的方式。分布式系统中的每一个运算单元存在于不同的计算机/处理器上&#xff0c;通过调度算法进行信息传递、协作以实现一件大而繁的目标。 简单来说&#x…

C#之简易计算器的制作

在一些问题中有时会用到计算器,今天我们可以用C#做一个简易的计算器 用到的开发工具为Visual Studio 2019(我用的是2019,其他版本的也可以) 1.首先新建一个项目文件. 2.在Form1.cs文件(Winform框架基础文件)中添加所用到的控件. 3.添加TextBox和ComboBox以及Button控件 4.对But…

JS原生——编写简易计算器

一个非常适合新手练习的小案例&#xff01;&#xff01;&#xff01; 使用JS的ES5语法HTMLCSS及企业级代码规范&#xff0c;方便后续良好的代码习惯养成&#xff01;&#xff01;&#xff01; 先来看一下样式吧&#xff01;&#xff01;&#xff01;&#xff08;后附代码&…

Java 实现简易计算器

前言&#xff1a; 出此文章是因为楼主之前在面试中遇到一个笔试题&#xff0c;当时一时半会没想出来&#xff0c;所以后续研究出来了&#xff0c;发出来希望对大家能有所帮助~ 题目&#xff1a;设计一个计算器&#xff0c;可以接收用户输入两个数字与 - * / 的符号&#xff0c…

Matlab设计简易计算器

效果如如下&#xff1a; 整个工程还是挺简单的&#xff0c;之前一直都是用matlab做信号处理&#xff0c;由于要做课程设计&#xff0c;就学了一下matlab的GUI。下面总结几个关键的地方。 &#xff08;1&#xff09;控件拉到自己喜欢的位置&#xff0c;并将控件的Text和Tag改好…

简易计算器(有界面)

&#xff08;没有括号和优先级&#xff0c;简易计算器&#xff09;界面&#xff1a; package javaprogram;import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import j…

Andriod设计简易计算器

1&#xff0e;设计任务及要求 &#xff08;1&#xff09;设计一款基于Android系统下的计算器&#xff0c;实现加减乘除算法&#xff0c;以及清零、撤销操作。界面设计应该就尽量简洁而美观&#xff0c;具有良好的交互性&#xff0c;程序应具有较好的稳健性&#xff1b; &a…

java实现简易计算器

Java简易计算器 用java语言写的一个简易计算器&#xff0c;实现了最基本的、-、*、/ 运算。 先来看下效果&#xff1a; 界面简述&#xff1a; 整个面板的由一个JTextFiled组件16个JButton组件构成&#xff0c;外加一个JPanel组件存放16个按钮&#xff0c;其布局为4x4的网格…

做一个简易计算器(VB版)

今天小编来带大家用VB做一个简易计算器 废话不多说&#xff0c;下面就是具体步骤了 1、创建控件组的方法首先创建一个命令按钮&#xff0c;调整其大小&#xff08;觉得合适就行&#xff09;&#xff0c;名称为Command1&#xff0c;Caption 属性为数字 0 &#xff1b;然后进行…