分布式计算模型Mapreduce实践与原理剖析(一)

news2024/12/22 15:09:33

第一章 MapReduce核心理论

1.1 什么是MapReduce

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

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

回顾一下Hadoop 的四大组件:

HDFS:分布式存储系统 
MapReduce:分布式计算系统 
YARN:资源调度系统 
Common:以上三大组件的底层支撑组件,主要提供基础工具包和 RPC 框架等

1.2 为什么需要 MapReduce

为什么需要 MapReduce?

1、海量数据在单机上处理因为硬件资源限制,无法胜任
2、而一旦将单机版程序扩展到集群来分布式运行,将极大增加程序的复杂度和开发难度
3、引入 MapReduce 框架后,开发人员可以将绝大部分工作集中在业务逻辑的开发上,而将分布式计算中的复杂性交由框架来处理 

设想一个海量数据场景下的数据计算需求:

单机版:磁盘受限,内存受限,计算能力受限
分布式版:思考,图片讲解。

程序由单机版扩成分布式版时,会引入大量的复杂工作。
为了提高开发效率,可以将分布式程序中的公共功能封装成框架,让开发人员可以将精力集中于业务逻辑。
Hadoop 当中的 MapReduce 就是这样的一个分布式程序运算框架,它把大量分布式程序都会涉及的到的内容都封装进了,让用户只用专注自己的业务逻辑代码的开发。

1.3 MapReduce的优缺点

优点:

(1)适合大批量(PB级以上)数据的离线处理
上千台服务器集群并发工作能力,提供数据运算。
(2)高容错性
首先要知道MapReduce设计的初衷:就是使程序能够部署在廉价的PC机器上,那么这就需要MapReduce框架具有很高的容错性。比如在运行的过程中有节点宕机,它可以把上面的计算任务转移到其他节点上来运行,不至于让这个任务运行失败,且这个过程不需要人工去参与,由Hadoop内部完成的。
(3)高扩展性
计算资源不够的时候,通过简单的增加机器来扩展它的计算能力。横向扩展。
(4)易于编程(中规中矩)
完成一个分布式程序的运行,简单的实现一些接口就可以。这个分布式程序可以分布到廉价的机器上运行。
写一个分布式程序,和写一个普通的串行程序是一样的。

缺点:

(1)实时计算不擅长
MapReduce基本上做不到毫秒或者秒级内返回结果。
(2)流式计算也不擅长
MapReduce输入数据源是静态的,不能动态变化;流式计算输入数据是动态的。这是由MapReduce自身设计特点决定数据源必须是静态的。
Spark Streaming、 Flink 擅长实时。
(3)多级依赖任务不擅长
N个应用程序存在依赖关系,前一个的输出为后一个应用程序的输入。这种情况下,MapReduce处理效率很低,因为这个时候使用MapReduce后,每个MapReduce job的输出结果都会写入到磁盘,会造成大量的磁盘IO,所以性能低下。
Spark擅长这种多级依赖。

1.4 MapReduce的核心思路

在这里插入图片描述

思路

1、MapReduce运算程序需要分成2个阶段执行。
2、第一个阶段的MapTask任务并发执行,完全并行运行,互不影响。
3、第二个阶段的ReduceTask任务并发执行,但是此时的数据依赖于上一个阶段的所有MapTask并发任务的输出。
4、MapReduce编程模型只能包含一个Map阶段和一个Reduce阶段,如果业务逻辑复杂,那只能多个MapReduce程序,串行运行。

MapReduce中的进程:一个完整的MapReduce计算程序在分布式运行的时候有三类实例进程:

1、MapTask:负责Map阶段的数据处理流程。
2、ReduceTask:负责Reduce阶段的数据处理流程。
3、MrAppMaster:负责整个程序的流程调度和状态协调。

1.5 MapReduce核心组件

在这里插入图片描述

1.6 MapReduce编程流程和规范

MapReduce编程流程
在这里插入图片描述

MapReduce编程规范

1、MapReduce 程序的业务编码分为两个大部分:

一部分配置程序的运行信息,

一部分编写该 MapReduce 程序的业务逻辑,并且业务逻辑的 map 阶段和 reduce 阶段的代码分别继 承 Mapper 类和 Reducer 类

2、MapReduce 程序具体编写规范

1、用户编写的程序分成三个部分:Mapper,Reducer,Driver(提交运行 MR 程序的客户端) 
2、Mapper 的输入数据是 KV 对的形式(KV 的类型可自定义) 
3、Mapper 的输出数据是 KV 对的形式(KV 的类型可自定义) 
4、Mapper 中的业务逻辑写在 map()方法中 
5、map()方法(maptask 进程)对每一个<K,V>调用一次 
6、Reducer 的输入数据类型对应 Mapper 的输出数据类型,也是 KV 对的形式 
7、Reducer 的业务逻辑写在 reduce()方法中 
8、Reducetask 进程对每一组相同 k 的<K,V>组调用一次 reduce()方法 
9、用户自定义的 Mapper 和 Reducer 都要继承各自的父类 
10、整个程序需要一个 Drvier 来进行提交,提交的是一个描述了各种必要信息的 job 对象

1.7 MapReduce程序运行演示

在 MapReduce 组件里,官方给我们提供了一些样例程序,其中非常有名的就是 wordcount 和 pi 程序。这些 MapReduce 程序的代码都在hadoop-mapreduce-examples-2.7.4.jar 包里,这 个 jar 包在 hadoop 安装目录下的/share/hadoop/mapreduce/目录里

下面我们使用 hadoop 命令来试跑例子程序,看看运行效果

先看 MapReduce 程序求WordCount的程序:

1、创建一个wcinput文件夹,注意是在hdfs上面创建,不是在本地创建

在这里插入图片描述

2、在本地任意文件夹下面创建文件并上传到hdfs上面,我这里是在本地的/home/data目录下面创建的wordcount.txt

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3、任意目录下运行官方wordcount程序

官方案例的路径为:

/software/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.4.jar

编写的时候注意路径不要写错了!!!注意是HDFS上面的路径。

hadoop jar  /software/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.4.jar  wordcount /wcinput /wcoutput  

4、去hdfs上面查看

在这里插入图片描述

再来看求PI的案例

1、任意目录直接运行即可

hadoop jar /software/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.4.jar  pi 5 5 //pi + map数量 + reduce数量  

在这里插入图片描述

2、查看结果
在这里插入图片描述

1.8 运行模式

集群运行模式:

1、 将 MapReduce 程序提交给 Yarn 集群, 分发到很多的节点上并发执行

2、 处理的数据和输出结果应该位于 HDFS 文件系统

3、 提交集群的实现步骤: 将程序打成JAR包,然后在集群的任意一个节点上用hadoop命令启动

hadoop jar mr-day01-1.0-SNAPSHOT.jar com.nx.JobMain

[root@hadoop10 data]# hadoop jar mapreduce-1.0-SNAPSHOT.jar com.aa.mapreduce.wordcount.JobMain

[root@hadoop10 home]# hadoop jar mapreduce-1.0-SNAPSHOT.jar com.aa.mr.JobMain

1.9 可能会遇到的错误

[root@hadoop10 home]# hadoop jar mapreduce-1.0-SNAPSHOT.jar com.aa.mr.JobMain
2021-11-12 22:40:52,213 INFO client.RMProxy: Connecting to ResourceManager at hadoop10/192.168.22.136:8032
2021-11-12 22:40:53,180 WARN mapreduce.JobResourceUploader: Hadoop command-line option parsing not performed. Implement the Tool interface and execute your application with ToolRunner to remedy this.
2021-11-12 22:40:53,223 INFO mapreduce.JobResourceUploader: Disabling Erasure Coding for path: /tmp/hadoop-yarn/staging/root/.staging/job_1636727840916_0001
2021-11-12 22:40:53,247 WARN mapreduce.JobResourceUploader: No job jar file set.  User classes may not be found. See Job or Job#setJar(String).
2021-11-12 22:40:53,299 INFO input.FileInputFormat: Total input files to process : 1
2021-11-12 22:40:54,649 INFO mapreduce.JobSubmitter: number of splits:1
2021-11-12 22:40:54,889 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1636727840916_0001
2021-11-12 22:40:54,890 INFO mapreduce.JobSubmitter: Executing with tokens: []
2021-11-12 22:40:55,132 INFO mapred.YARNRunner: Job jar is not present. Not adding any jar to the list of resources.
2021-11-12 22:40:55,203 INFO conf.Configuration: resource-types.xml not found
2021-11-12 22:40:55,204 INFO resource.ResourceUtils: Unable to find 'resource-types.xml'.
2021-11-12 22:40:55,669 INFO impl.YarnClientImpl: Submitted application application_1636727840916_0001
2021-11-12 22:40:55,780 INFO mapreduce.Job: The url to track the job: http://hadoop10:8088/proxy/application_1636727840916_0001/
2021-11-12 22:40:55,781 INFO mapreduce.Job: Running job: job_1636727840916_0001
2021-11-12 22:41:08,979 INFO mapreduce.Job: Job job_1636727840916_0001 running in uber mode : false
2021-11-12 22:41:08,979 INFO mapreduce.Job:  map 0% reduce 0%
2021-11-12 22:41:15,038 INFO mapreduce.Job: Task Id : attempt_1636727840916_0001_m_000000_0, Status : FAILED
Error: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class com.aa.mr.WordMapper not found
	at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2638)
	at org.apache.hadoop.mapreduce.task.JobContextImpl.getMapperClass(JobContextImpl.java:187)
	at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:759)
	at org.apache.hadoop.mapred.MapTask.run(MapTask.java:347)
	at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:174)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:422)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1762)
	at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:168)
Caused by: java.lang.ClassNotFoundException: Class com.aa.mr.WordMapper not found
	at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:2542)
	at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2636)
	... 8 more

2021-11-12 22:41:21,141 INFO mapreduce.Job: Task Id : attempt_1636727840916_0001_m_000000_1, Status : FAILED
Error: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class com.aa.mr.WordMapper not found
	at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2638)
	at org.apache.hadoop.mapreduce.task.JobContextImpl.getMapperClass(JobContextImpl.java:187)
	at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:759)
	at org.apache.hadoop.mapred.MapTask.run(MapTask.java:347)
	at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:174)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:422)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1762)
	at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:168)
Caused by: java.lang.ClassNotFoundException: Class com.aa.mr.WordMapper not found
	at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:2542)
	at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2636)
	... 8 more

cccc2021-11-12 22:41:26,207 INFO mapreduce.Job: Task Id : attempt_1636727840916_0001_m_000000_2, Status : FAILED
Error: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class com.aa.mr.WordMapper not found
	at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2638)
	at org.apache.hadoop.mapreduce.task.JobContextImpl.getMapperClass(JobContextImpl.java:187)
	at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:759)
	at org.apache.hadoop.mapred.MapTask.run(MapTask.java:347)
	at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:174)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:422)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1762)
	at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:168)
Caused by: java.lang.ClassNotFoundException: Class com.aa.mr.WordMapper not found
	at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:2542)
	at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2636)
	... 8 more

2021-11-12 22:41:33,311 INFO mapreduce.Job:  map 100% reduce 100%

上面的报错是说找不到类,但是本质上是主调度入口在集群上运行的时候没有配置好。

解决方案:加上下面的一行代码即可

job.setJarByClass(JobMain.class);


声明:
        文章中代码为自己根据相应理解编写,文章中出现的相关图片为自己实践中的截图和相关技术对应的图片,若有相关异议,请联系删除。感谢。转载请注明出处,感谢。


By luoyepiaoxue2014

微博地址: http://weibo.com/luoyepiaoxue2014 点击打开链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/32478.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[短的文章] Spring Boot 日志创建使用、日志级别、@Slf4j、日志持久化——Spring Boot 系列

前言&#xff1a; 想必日志大家伙在项目开发调试过程中常会使用&#xff0c;这篇文章我们来一起探讨一下 Spring Boot 项目中日志的定义与使用&#xff0c;主要针对以下几个方面重点叙述 日志级别 日志框架进行日志定义 日志持久化 1 日志简述 1.1 为什么使用日志 日志大家在…

机器学习-逻辑回归

机器学习-基础知识 机器学习-线性回归 机器学习-逻辑回归 机器学习-聚类算法 机器学习-决策树算法 机器学习-集成算法 机器学习-SVM算法 文章目录逻辑回归1. 线性逻辑回归1.1. 理论基础1.2. 逻辑回归模拟步骤1.2.1. 数据集1.2.2. 模拟逻辑回归类模块1.2.3. 测试模块1.2.4. 数据…

PN532开发指南(uart)

开发环境 STM32F103C8T6 STM32f103c8t6最小系统板&#xff08;typec接口&#xff09; STM32CUBEMX PN532模块 一、NFC简介 NFC(Near Field Communication)近场通信&#xff0c;是一种短距高频的无线电技术&#xff0c;在13.56MHz频率运行于20厘米距离内。其传输速度有106Kb…

懒人福利:只需一行代码,导入所有的 Python 库

前言 今天给大家介绍一个懒人 Python 库—— Pyforest 。 使用一行代码&#xff0c;就能导入所有的 Python 库(本地已经安装的)。 GitHub 地址 https://github.com/8080labs/pyforest &#xff08;文末送读者福利&#xff09; / 01 / 介绍 Python 因为有着成千上万个功能…

paper 阅读: An introduction to ROC analysis

发布于2005年&#xff0c;附论文链接如下&#xff1a; https://ccrma.stanford.edu/workshops/mir2009/references/ROCintro.pdf 之前一直都是从各种博客上了解ROC的&#xff0c;最近才看到这一篇paper。 写在前面 用 True&#xff08;T&#xff09;和 False&#xff08;F&…

BGP进阶:BGP 基础实验配置

实验拓扑 实验需求 R1、R2、R3属于AS123&#xff0c;R4属于AS 400&#xff1b;AS123内的R1、R2、R3运行OSPF&#xff0c;通告各自直连接口&#xff0c;注意OSPF域的工作范围&#xff1b;R3-R4之间建立eBGP邻居关系&#xff0c;R2暂时不运行BGP&#xff0c;R1-R3之间建立iBGP邻…

MCE | D-萤光素 Protocol 在手,生物发光检测无忧!

■ Q: D-萤光素的作用原理 D-萤光素 (D-Luciferin) 是萤火虫萤光素酶 (Firefly Luciferase) 的化学发光底物。在ATP 和萤光素酶存在下&#xff0c;萤光素能够被氧化发光 (图 1)。当萤光素过量时&#xff0c;发光亮度与萤光素酶浓度呈正相关。通过萤光素/萤光素酶生物发光体系&…

小程序容器技术加快推动国产操作系统“上车”

计算机是当前乃至未来的基础工具&#xff0c;而负责管理计算机硬件与软件资源、提供必须的人机交互机制的操作系统无疑是整个计算机的核心系统软件。 可以说&#xff0c;操作系统是当前一个国家提升综合实力过程中必须要攻克、掌握的核心技术之一。 国产操作系统多为以Linux为…

猫狗肠道菌群—“主子们”的健康新领域

随着生活水平提升&#xff0c;我国养宠人士逐年增多。数据显示&#xff0c;我国城镇养宠人士达到6844万多人&#xff0c;且仍在不断增长。 其中养猫人群数占比59.5%&#xff0c;养狗人群数占比51.7%&#xff0c;养水族类占比8.3%&#xff0c;养爬行类宠物的占比为5.8%&#xff…

Linux 文件操作(三) —— 获取并打印某个文件的属性(文件类型、执行权限、文件大小)

目录 1、获取文件属性 stat / lstat / fstat (1) 参数 path (2) 参数 buf (3) 返回值 2、获取并打印某个文件的属性 (1) 获取文件类型 (2) 获取文件权限 (3) 获取文件大小 (4) 获取上一次的访问时间 (5) 最终代码 1、获取文件属性 stat / lstat / fstat stat / lsta…

[附源码]java毕业设计疫情防控期间网上教学管理

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

数据分析可视化之模型介绍

一 前言 “数据分析可视化”这条术语实现了成熟的科学可视化领域与较年轻的信息可视化领域的统一。 数据分析可视化&#xff1a;是指将大型数据集中的数据以图形图像形式表示&#xff0c;并利用数据分析和开发工具发现其中未知信息的处理过程。 数据可视化已经提出了许多方法&…

【软件工程导论】1.软件过程模型

软件过程模型什么是软件过程模型包括瀑布模型特点演化模型特点增量模型特点原型模型类型使用策略废弃策略追加策略螺旋模型特点什么是软件过程模型 又叫作软件开发模型、软件生存周期模型 包括 瀑布模型 每一阶段都会生成文档 特点 缺乏灵活性在交互使用时才能发现问题&…

用HTML+CSS仿网易云音乐网站(6个页面)_实训素材

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 音乐网页设计 | 仿网易云音乐 | 各大音乐官网网页 | 明星音乐演唱会主题 | 爵士乐音乐 | 民族音乐 | 等网站的设计与制作 | HTML期末大学生网页设计作…

ubuntu 安装 k8s 记录 2 初始化

ubuntu 安装 k8s 记录 2 初始化初ubuntu 安装 k8s 记录初始化初始化前置条件查询本机 ip需要docker初始化报错禁止 Swap 分区禁用 CRI重启 containerd重置节点初始化初始化报错设置驱动向 docker 看齐如果遇到出错要重新初始化&#xff0c;先执行下面两个步骤关闭 swap 并重新设…

业务增长遇到瓶颈?这些用大数据驱动业务增长的方法你一定要看看

目录 前言 一、海量数据处理方案 1.1 大数据存储 1.1.1 传统数据存储 1.1.2 云大数据仓库 1.2 数据BI快速展示 1.2.1大数据BI产业链结构分析 1.2.2 华为一站式大数据BI方案 前言 随着大数据与云原生的快速发展融汇交互&#xff0c;各技术领域又将来临新一波迅雷之势的挑…

数据增强

在训练数据拆分上评估数据增强&#xff0c;以增加高质量训练样本的数量。 Intuition 通常希望通过数据扩充来增加训练数据的规模和多样性。它涉及使用现有样本生成合成但真实的示例。 拆分数据集。想首先拆分数据集&#xff0c;因为如果允许将生成的样本放置在不同的数据拆分中…

HTML+CSS+JS环境保护网页设计期末课程大作业 web前端开发技术 web课程设计 网页规划与设计

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

FEDformer 代码分析(2)

首先总结一下FEDformer里面这些这些东西&#xff0c; mean的尺寸是&#xff1a;&#xff08;1,96,7&#xff09; seasonal_init的尺寸是&#xff1a;&#xff08;1,144,7&#xff09; trend_init的尺寸是&#xff1a;&#xff08;1,144,7&#xff09; zeros的尺寸是&#x…

[附源码]java毕业设计疫苗接种管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…