Hadoop--yarn

news/2025/10/13 1:12:31/文章来源:https://www.cnblogs.com/chucz/p/19137577

Yarn资源调度器

Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而MapReduce等运算程序则相当于运行于操作系统之上的应用程序

Y****arn基本架构

YARN主要由ResourceManager、NodeManager、ApplicationMaster和Container等组件构成。

1605199035796-5b58a5f0-1891-4d45-85e7-2fe10c6ec964.png

Y****arn工作机制

1605199131356-30d2658c-7bcb-433f-b41a-b440f98ecb07.png

(1)MR程序提交到客户端所在的节点。

(2)YarnRunner向ResourceManager申请一个Application。

(3)RM该应用程序的资源路径返回给YarnRunner

(4)该程序将运行所需资源提交到HDFS上

(5)程序资源提交完毕后,申请运行mrAppMaster

(6)RM将用户的请求初始化成一个Task

(7)其中一个NodeManager领取到Task任务。

(8)该NodeManager创建容器Container,并产生MRAppmaster

(9)Container从HDFS上拷贝资源到本地

(10)MRAppmasterRM 申请运行MapTask资源。

(11)RM运行MapTask任务分配给另外两个NodeManager另两个NodeManager分别领取任务创建容器。

(12)MR向两个接收到任务的NodeManager发送程序启动脚本这两个NodeManager分别启动MapTaskMapTask数据分区排序。

(13)MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask

(14)ReduceTask向MapTask获取相应分区的数据。

(15)程序运行完毕后,MR会向RM申请注销自己。

作业提交全****过程

1605199211132-17f5ec2d-a879-4d44-8986-edc70c640e38.png

作业提交全过程详解

(1)作业提交

第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。

第2步:ClientRM申请一个作业id。

第3步:RM给Client返回该job资源的提交路径和作业id

第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。

第5步:Client提交完资源后,向RM申请运行MrAppMaster

(2)作业初始化

第6步:当RM收到Client的请求后,将job添加到容量调度器中。

第7步一个空闲的NM领取到该Job

第8步:该NM创建Container并产生MRAppmaster

第9步:下载Client提交的资源到本地。

(3)任务分配

第10步:MrAppMaster向RM申请运行多个MapTask任务资源。

第11步RM运行MapTask任务分配给另外两个NodeManager另两个NodeManager分别领取任务创建容器。

(4)任务运行

第12步MR向两个接收到任务的NodeManager发送程序启动脚本这两个NodeManager分别启动MapTaskMapTask数据分区排序。

第13步:MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask

第14步:ReduceTask向MapTask获取相应分区的数据。

第15步程序运行完毕后,MR会向RM申请注销自己。

(5)进度和状态更新

YARN中的任务将其进度和状态(包括counter)返回给应用管理器, 客户端每秒(通过mapreduce.client.progressmonitor.pollinterval设置)向应用管理器请求进度更新, 展示给用户。

(6)作业完成

除了向应用管理器请求作业进度外, 客户端每5都会通过调用waitForCompletion()来检查作业是否完成时间间隔可以通过mapreduce.client.completion.pollinterval来设置作业完成之后, 应用管理器和Container会清理工作状态作业的信息会被作业历史服务器存储以备之后用户核查

资源调度器

目前,Hadoop作业调度器主要有三种:FIFO、Capacity Scheduler和Fair Scheduler。Hadoop3.1.3默认的资源调度器是Capacity Scheduler

具体设置详见:yarn-default.xml文件

The class to use as the resource scheduler.

yarn.resourcemanager.scheduler.class

org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler

1****)先进先出调度器(FIFO)

 

2)容量调度器(Capacity Scheduler)

3)公平调度器(Fair Scheduler)

容量调度器多队列提交案例

Yarn默认的容量调度器是一条单队列的调度器,在实际使用中会出现单个任务阻塞整个队列的情况。同时,随着业务的增长,公司需要分业务限制集群使用率。这就需要我们按照业务种类配置多条任务队列。

配置多队列的容量调度器

默认Yarn的配置下,容量调度器只有一条Default队列。在capacity-scheduler.xml中可以配置多条队列,并降低default队列资源占比:

yarn.scheduler.capacity.root.queues

default,hive

The queues at the this level (root is the root queue).

yarn.scheduler.capacity.root.default.capacity

40

同时为新加队列添加必要属性:

yarn.scheduler.capacity.root.hive.capacity

60

yarn.scheduler.capacity.root.hive.user-limit-factor

1

yarn.scheduler.capacity.root.hive.maximum-capacity

80

yarn.scheduler.capacity.root.hive.state

RUNNING

yarn.scheduler.capacity.root.hive.acl_submit_applications

*

yarn.scheduler.capacity.root.hive.acl_administer_queue

*

yarn.scheduler.capacity.root.hive.acl_application_max_priority

*

yarn.scheduler.capacity.root.hive.maximum-application-lifetime

-1

yarn.scheduler.capacity.root.hive.default-application-lifetime

-1

在配置完成后,重启Yarn,就可以看到两条队列:

向Hive队列提交任务

默认的任务提交都是提交到default队列的。如果希望向其他队列提交任务,需要在Driver中声明:

public class WcDrvier {

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

Configuration configuration = new Configuration();

        configuration.set("mapred.job.queue.name", "hive");

//1. 获取一个Job实例

Job job = Job.getInstance(configuration);

//2. 设置类路径

job.setJarByClass(WcDrvier.class);

//3. 设置Mapper和Reducer

job.setMapperClass(WcMapper.class);

job.setReducerClass(WcReducer.class);

//4. 设置Mapper和Reducer的输出类型

job.setMapOutputKeyClass(Text.class);

job.setMapOutputValueClass(IntWritable.class);

job.setOutputKeyClass(Text.class);

job.setOutputValueClass(IntWritable.class);

job.setCombinerClass(WcReducer.class);

//5. 设置输入输出文件

FileInputFormat.setInputPaths(job, new Path(args[0]));

FileOutputFormat.setOutputPath(job, new Path(args[1]));

//6. 提交Job

boolean b = job.waitForCompletion(true);

System.exit(b ? 0 : 1);

}

}

这样,这个任务在集群提交时,就会提交到hive队列:

常见错误及****解决方案

1)导包容易出错。尤其Text和CombineTextInputFormat。

2)Mapper中第一个输入的参数必须是LongWritable或者NullWritable,不可以是IntWritable.  报的错误是类型转换异常。

3)java.lang.Exception: java.io.IOException: Illegal partition for 13926435656 (4),说明Partition和ReduceTask个数没对上,调整ReduceTask个数。

4)如果分区数不是1,但是reducetask为1,是否执行分区过程。答案是:不执行分区过程。因为在MapTask的源码中,执行分区的前提是先判断ReduceNum个数是否大于1。不大于1肯定不执行。

5)在Windows环境编译的jar包导入到Linux环境中运行,

hadoop jar wc.jar com.atguigu.mapreduce.wordcount.WordCountDriver /user/atguigu/ /user/atguigu/output

报如下错误:

Exception in thread "main" java.lang.UnsupportedClassVersionError: com/atguigu/mapreduce/wordcount/WordCountDriver : Unsupported major.minor version 52.0

原因是Windows环境用的jdk1.7,Linux环境用的jdk1.8。

解决方案:统一jdk版本。

6)缓存pd.txt小文件案例中,报找不到pd.txt文件

原因:大部分为路径书写错误。还有就是要检查pd.txt.txt的问题。还有个别电脑写相对路径找不到pd.txt,可以修改为绝对路径。

7)报类型转换异常。

通常都是在驱动函数中设置Map输出和最终输出时编写错误。

Map输出的key如果没有排序,也会报类型转换异常。

8)集群中运行wc.jar时出现了无法获得输入文件。

原因:WordCount案例的输入文件不能放用HDFS集群的根目录。

9)出现了如下相关异常

Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z

at org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Native Method)at org.apache.hadoop.io.nativeio.NativeIO$Windows.access(NativeIO.java:609)at org.apache.hadoop.fs.FileUtil.canRead(FileUtil.java:977)

java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.

at org.apache.hadoop.util.Shell.getQualifiedBinPath(Shell.java:356)at org.apache.hadoop.util.Shell.getWinUtilsPath(Shell.java:371)at org.apache.hadoop.util.Shell.<clinit>(Shell.java:364)

解决方案:拷贝hadoop.dll文件到Windows目录C:\Windows\System32。个别同学电脑还需要修改Hadoop源码。

方案二:创建如下包名,并将NativeIO.java拷贝到该包名下

10)自定义Outputformat时,注意在RecordWirter中的close方法必须关闭流资源。否则输出的文件内容中数据为空。

@Override

public void close(TaskAttemptContext context) throws IOException, InterruptedException {

	if (atguigufos != null) {atguigufos.close();}if (otherfos != null) {otherfos.close();}

}

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

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

相关文章

AI元人文构想框架体系

AI元人文构想框架体系 一、核心概念与理论基础 1.1 基本定义 AI元人文构想:一种革命性AI发展范式,旨在构建能够理解、协调并增强人类复杂价值体系的新型人工智能系统。其核心特征包括:从"优化工具"转变…

[DAX/数据分析表达式/Power BI] DAX 查询视图语言 = `Data Analysis eXpressions`(数据分析表达式) = 编程式数据分析语言

0 序Power BI1 概述:DAX 查询视图语言 = Data Analysis eXpressions(数据分析表达式) = 编程式数据分析语言 for Power BI / SSAS / ... DAX是什么?DAX 全称 Data Analysis eXpressions(数据分析表达式); 其是面向 …

Hadoop--HDFS-HA高可用

high avilability HA****概述 1)所谓HA(High Availablity),即高可用(7*24小时不中断服务)。 2)实现高可用最关键的策略是消除单点故障。HA严格来说应该分成各个组件的HA机制:HDFS的HA和YARN的HA。 3)Hadoop2.…

Hadoop--HDFS

注意机器启动过之后,同步的时候不要同步data文件夹一次写入,多次读出,不支持文件修改。适合数据分析,不适合网盘应用 分布式存储,文件系统。 优点:高容错性。多复制,丢失自动恢复 适合大数据,数据以及文件规模…

10月——算法竞赛回坑杂记

说起来上次打比赛已经是好久以前了呢。初中、高中作为OIer的生涯就这么糊里糊涂的结束了,似乎连一个正经的告别都没写。谁叫广大附离家那么远呢,只记得当时比完赛回到家光顾着玩了,第二天一早又懒得补上。说起来也好…

20232308 2025-2026-1 《网络与系统攻防技术》实验一实验报告

1.实验内容 1. 本周学习内容缓冲区溢出缓冲区溢出原理:本质是数组的生长方向与栈的生长方向相反,且数组调用没有进行越界检查。 返回地址覆盖:掌握如何通过缓冲区溢出覆盖栈上的返回地址,以控制程序的执行路径。 返…

20232307 2025-2026-1 《网络与系统攻防技术》实验一

20232307 2025-2026-1 《网络与系统攻防技术》实验一20232307 2025-2026-1 《网络与系统攻防技术》实验一 一、实验内容 1.手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。 2.利用foo函数的Bof漏洞,…

Redis知识点汇总

Redis快速回忆 核心数据结构字符串 小于1M,成倍扩容,大于1M,就每次扩容1M,最大512M。哈希购物车列表集合有序集合位图 Bitmap 虽然基于String类型,但是可以直接操作位一个字节8位表示一个用户是数据使用的时候把握…

乐理 -05 乐音 乐级

乐音 一直发生在某个频率不发生变化的称为乐音噪音 没有固定的频率像鼓之类的称为 噪音乐器 乐音体系音列 多个 有序乐级

Redis实现分布式锁以及Redis客户端比较

对比 1、redisTemplate是基于某个具体实现的再封装,比如说springBoot1.x时,具体实现是jedis;而到了springBoot2.x时,具体实现变成了lettuce。封装的好处就是隐藏了具体的实现,使调用更简单,但是有人测试过jedis效…

一致性哈希原理

数据服务器如何组织:设计时候保证高频中低频都有数量。否则就是忙的忙死闲的闲死 逻辑层服务器:增加和减少机器的时候代价很小 数据层服务器:增加和减少机器的时候代价是全量的 取模服务器个数的问题--缓存雪崩 取模…

缓存和数据库数据的一致性

缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的 问题 Redis 的 qps 可以达到 10 万每秒,对于一般体量的互联网公司,一台机器就够了。但不论是什么业务,都不得不面对一个棘手的问题:那就是 Redis 和…

Redis不同数据类型代码场景实践

string 博客不好的实现 jedis.set("key1", "value1"); jedis.get("key1"); jedis.del("lock_test"); jedis.incr("blog_id_counter"); Long key = jedis.incrBy(&q…

上下文与this指向

var name = window​​ const person1 = { ​ name: person1,​foo1: function() {​console.log(this.name) ​ }, ​ foo2: () => {console.log(this.name) ​ },​foo3: function() { ​ return function…

[数据库] Microsoft SQL Server 数据库

1 概述: Microsoft SQL Server SQL Server 数据库SQL是英文Structured Query Language的缩写,意思为结构化查询语言。SQL语言的【主要功能】就是同各种数据库建立联系,进行沟通。按照ANSI(美国国家标准协会)的规定,…

02 | 在环境中使用Airsim插件

02 | 在环境中使用Airsim插件参考 https://zhuanlan.zhihu.com/p/619214564 中 我们只需要随意下载一个小一点的场景工程就可以然后按照文章中的内容进行。注意需要用到我们上一个文章中介绍的 plugins 文件夹

01 | UE5.3+Airsim+VS2022+Windows10(无人机仿真环境)

01 | UE5.3+Airsim+VS2022+Windows10(无人机仿真环境)配置步骤 vs2022 的安装和配置可以多装;少装也没事后面打开 vs2022 配置项目会进行提示桌面开发套件NET 桌面开发游戏开发单个组件安装 UE5.3不要下载在 C 盘,…

对于使用ant design组件库的疑问

用ant design 的tag来制作组件封装然后实现应该筛选功能的话,我得考虑什么,具体筛选是点击tag之后会得到对应的筛选后的信息,我的后端接口应该是放在主页面没问题,然后传类别和该类别的tag,但是tag是能选择了,那…

阅读《构建之法》提出的5个问题

问题1:科技公司应如何应对“颠覆式”的创新 书中上下文:16.1.2迷思之⼆:⼤家都喜欢创新 第348页“如果这位年轻⼈提的想法是改进电报技术,⼀定会受到欢迎,这⼀类创新是改良式的(Incremental Innovation),但是,…

提示工程介绍

什么是提示工程? 提示工程(Prompt Engineering)是“设计、优化输入给大语言模型的提示词,使其生成准确、有用且符合预期的输出”的技术与方法集合。它不改变模型本身,只通过调整“问法”来引导 AI 的表现。 定义看…