hadoop -- Yarn资源管理

news2024/12/23 17:27:41

Yarn

YARN被设计用以解决以往架构的需求和缺陷的资源管理调度软件


Apache Hadoop YARN (Yet Another Resource Negotiator,另一种资源协调者)是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统调度平台,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。

资源管理系统:集群的硬件资源,和程序运行相关,比如内存,CPU等

调度平台:多个程序同时申请计算资源如何分配,调度的规则(算法)。

通用∶不仅仅支持MapReduce程序,理论上支持各种计算程序。YARN不关心你干什么,只关心你要资源,在有的情况下给你,用完之后还我。

可以把Hadoop YARN理解为相当于一个分布式的操作系统平台,而MapReduce等计算程序则相当于运行于操作系统之上的应用程序,YARN为这些程序提供运算所需的资源(内存、CPU等)。

Yarn架构体系


主从架构

 

也是采用 master(Resource Manager)- slave (Node Manager)架构,Resource Manager 整个集群只有一个,一个可靠的节点。

1、 每个节点上可以负责该节点上的资源管理以及任务调度,Node Manager 会定时向Resource Manager汇报本节点上 的资源使用情况和任务运行状态,
2、 Resource Manager会通过心跳应答的机制向Node Manager下达命令或者分发新的任务,
3、 Yarn 将某一资源分配给该应用程序后,应用程序会启动一个Application Master,
4、 Application Master为应用程序负责向Resource Manager申请资源,申请资源之后,再和申请到的节点进行通信,运行内部任务。

Resource Manager

RM是一个全局的资源管理器,负责整个系统的资源管理和分配。它主要由两个组件构成:调度器(Scheduler)和应用程序管理器(Applications Manager,ASM)。

Schedule 资源调度器是一个可插拔的组件,用户可根据自己需要设计资新的源调度器,YARN提供多个可直接使用的资源调度器。资源调度器将系统中的资源分配给正在运行的程序,不负责监控或跟踪应用的执行状态,不负责重启失败的任务

Applications Manager 应用程序管理器负责管理整个系统中所有应用程序,包括应用程序提交、与调度器协商资源以启动ApplicationMaster、监控ApplicationMaster运行状态并在失败时重新启动它等。

Node Manager

NM是每个节点上的资源和任务管理器,一方面,它会定时地向RM汇报本节点上的资源使用情况和各个Container的运行状态;另一方面,它接收并处理来自AM的Container启动/停止等各种请求。

ApplicationMaster

用户提交的每个应用程序均包含一个AM,主要功能包括:

1.与RM调度器协商以获取资源(用Container表示);

2.将得到的任务进一步分配给内部的任务

3.与NM通信以启动/停止任务;

4.监控所有任务运行状态,并在任务运行失败时重新为任务申请资源以重启任务。

注:RM只负责监控AM,在AM运行失败时候启动它,RM并不负责AM内部任务的容错,这由AM来完成。

Container

Container是YARN中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等,当AM向RM申请资源时,RM为AM返回的资源便是用Container表示。YARN会为每个任务分配一个Container,且该任务只能使用该Container中描述的资源。yarn的container容器是yarn虚拟出来的一个东西,属于虚拟化的,它是由memory+vcore组成,是专门用来运行任务的

安装

etc/hadoop/目录下 yarn-site.xml文件

 cd /opt/apps/hadoop-3.1.1/etc/hadoop/
 vi yarn-site.xml

<!--  resource,manager主节点所在机器 -->
<property>
	<name>yarn.resourcemanager.hostname</name>
	<value>linux01</value>
</property>

<!--  为mr程序提供shuffle服务 -->
<property>
	<name>yarn.nodemanager.aux-services</name>
	<value>mapreduce_shuffle</value>
</property>

<!--  一台NodeManager的总可用内存资源 -->
<property>
	<name>yarn.nodemanager.resource.memory-mb</name>
	<value>4096</value>
</property>
<!--  一台NodeManager的总可用(逻辑)cpu核数 -->
<property>
	<name>yarn.nodemanager.resource.cpu-vcores</name>
	<value>4</value>
</property>

<!--  是否检查容器的虚拟内存使用超标情况
	 vmem为true 指的是默认检查虚拟内存,容器使用的虚拟内存不能超过我们设置的虚拟内存大小 
-->
<property>
  	<name>yarn.nodemanager.vmem-check-enabled</name>
  	<value>false</value>
</property>

<!--  容器的虚拟内存使用上限:与物理内存的比率 --> 	
<property>
  	<name>yarn.nodemanager.vmem-pmem-ratio</name>
  	<value>2.1</value>
</property>


将 yarn-site.xml 同步给其他Linux
scp yarn-site.xml linux02:$PWD
scp yarn-site.xml linux03:$PWD

配置一键启停

cd /opt/apps/hadoop-3.1.1/sbin
vi  start-yarn.sh
vi  stop-yarn.sh

YARN_RESOURCEMANAGER_USER=root 
HADOOP_SECURE_DN_USER=yarn 
YARN_NODEMANAGER_USER=root

start-yarn.sh  一键启动 

启动后可以访问  http://linux01:8088 查看页面


解决linux连接不上 可能网卡出现问题
systemctl stop  NetworkManager
systemctl diable  NetworkManager
systemctl restart network

MR程序提交到Yarn

使用idea提交程序

配置mapred-site.xml文件 添加到resources目录下

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
    <property>
        <name>yarn.app.mapreduce.am.env</name>
        <value>HADOOP_MAPRED_HOME=/opt/apps/hadoop-3.1.1</value>
    </property>
    <property>
        <name>mapreduce.map.env</name>
        <value>HADOOP_MAPRED_HOME=/opt/apps/hadoop-3.1.1</value>
    </property>
    <property>
        <name>mapreduce.reduce.env</name>
        <value>HADOOP_MAPRED_HOME=/opt/apps/hadoop-3.1.1</value>
    </property>

</configuration>

day05.com.doit.demo06;

修改提交任务的代码 maven打jar包的命令为 package

public class Test02 {
    public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
        System.setProperty("HADOOP_USER_NAME", "root");
        Configuration conf = new Configuration();
        //操作HDFS数据
        conf.set("fs.defaultFS", "hdfs://linux01:8020");
        //设置运行模式
        conf.set("mapreduce.framework.name", "yarn");
        //设置ResourceManager位置
        conf.set("yarn.resourcemanager.hostname", "linux01");
        // 设置MapReduce程序运行在windows上的跨平台参数
        conf.set("mapreduce.app-submission.cross-platform","true");

        Job job = Job.getInstance(conf, "WordCount");

        //设置jar包路径
        job.setJar("D:\\IdeaProjects\\hadoop\\target\\test_yarn.jar");

        job.setMapperClass(WordCountMapper.class);
        job.setReducerClass(WordCountReduce.class);

        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        //设置路径为HDFS路径
        FileInputFormat.setInputPaths(job,new Path("/wc/input/word.txt"));
        FileOutputFormat.setOutputPath(job,new Path("/wc/out4"));

        job.waitForCompletion(true);
    }
}

在linux上直接提交jar包

public class Test02 {
    public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
        Configuration conf = new Configuration();

        //设置运行模式
        conf.set("mapreduce.framework.name", "yarn");
        //设置ResourceManager位置
        conf.set("yarn.resourcemanager.hostname", "linux01");
        // 设置MapReduce程序运行在windows上的跨平台参数
        conf.set("mapreduce.app-submission.cross-platform","true");

        Job job = Job.getInstance(conf, "WordCount");

        //设置jar包路径
        //job.setJar("D:\\IdeaProjects\\hadoop\\target\\test_yarn.jar");

        job.setJarByClass(Test02.class);

        job.setMapperClass(WordCountMapper.class);
        job.setReducerClass(WordCountReduce.class);

        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        //设置路径为HDFS路径
        FileInputFormat.setInputPaths(job,new Path("/wc/input/word.txt"));
        FileOutputFormat.setOutputPath(job,new Path("/wc/out5"));

        job.waitForCompletion(true);
    }
}
打成jar包后 
linux上使用 
需要查看 mapred-site.xml 如果没有配置 需要配置一下

hadoop jar jar包名  运行的类  
hadoop jar  test_yarn.jar  day03.com.doit.demo02.Test02

Map Join

Map端join是指数据达到map处理函数之前进行合并的,效率要远远高于Reduce端join,因为Reduce端join是把所有的数据都经过Shuffle,非常消耗资源。

order.txt
order011 u001
order012 u001
order033 u005
order034 u002
order055 u003
order066 u004
order077 u010

user.txt
u001,hangge,18,male,angelababy
u002,huihui,58,female,ruhua
u003,guanyu,16,male,chunge
u004,laoduan,38,male,angelababy
u005,nana,24,femal,huangbo
u006,xingge,18,male,laoduan


最终结果 
u001,hangge,18,male,angelababy,order012
u001,hangge,18,male,angelababy,order011
u002,huihui,58,female,ruhua,order034
u003,guanyu,16,male,chunge,order055
u004,laoduan,38,male,angelababy,order066
u005,nana,24,femal,huangbo,order033
null,order077

一个用户可能会产生多个订单,可能user.txt中的用户非常少,但是订单数据又非常非常多,这时我们可以考虑使用Map端join.一个小文件,一个大文件时,可以使用Map端join,说的简单一些,就是不走reduce,通过Map直接得出结果.

原理:将小文件上传到分布式缓存,保证每个map都可以访问完整的小文件的数据,然后与大文件切分后的数据进行连接,得出最终结果.

package hadoop06.com.doit.demo;

import hadoop03.com.doit.demo02.WordCountMapper;
import hadoop03.com.doit.demo02.WordCountReducer;
import hadoop05.com.doit.demo05.Test;
import org.apache.commons.lang.ObjectUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;

public class MapJoinDemo {

    public static  class JoinMapper extends Mapper<LongWritable,Text,Text, NullWritable>{

        //定义集合用来存储user.txt的数据  键是uid 值是这一行记录
        private Map<String,String> userMap = new HashMap<>();

        private Text k2 = new Text();
        @Override
        protected void setup(Mapper<LongWritable, Text, Text, NullWritable>.Context context) throws IOException, InterruptedException {
            //读取本地user.txt文件  由于user.txt添加到了分布式缓存中,会将这个文件 缓存到执行maptask的计算机上
            //由于这个文件和class文件放在一起 可以直接读取
            BufferedReader br = new BufferedReader(new FileReader("user.txt"));
            String line = null;
            while((line = br.readLine())!=null){
                //System.out.println(line);
               String uid =  line.split(",")[0];
            //将uid 和 user的一行记录放入到map中
                userMap.put(uid,line);
            }
        }

        @Override
        protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, NullWritable>.Context context) throws IOException, InterruptedException {
            //得到order的一条记录
            String line = value.toString();
            //获取order的 uid
            String uid = line.split("\\s+")[1];// u001
            //获取map中 当前uid的 用户信息
            String userInfo = userMap.get(uid);

            //拼接字符串写出
            k2.set(userInfo+","+line.split("\\s+")[0]);

            context.write(k2, NullWritable.get());
        }
    }

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

        System.setProperty("HADOOP_USER_NAME", "root");
        Configuration con = new Configuration();

        //配置到yarn上执行
        con.set("mapreduce.framework.name", "yarn");
        //配置操作HDFS数据
        con.set("fs.defaultFS", "hdfs://linux01:8020");
        //配置resourceManager位置
        con.set("yarn.resourcemanager.hostname", "linux01");
        //配置mr程序运行在windows上的跨平台参数
         con.set("mapreduce.app-submission.cross-platform","true");

        Job job = Job.getInstance(con,"wordcount");

        //分布式缓存user.txt文件
        job.addCacheFile(new URI("hdfs://linux01:8020/user.txt"));

        //设置jar包的路径
         job.setJar("D:\\IdeaProjects\\test_hadoop\\target\\test_hadoop-1.0-SNAPSHOT.jar");

        //设置Mapper
        job.setMapperClass(JoinMapper.class);

        //设置最后结果的输出类型
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(NullWritable.class);

        //设置读取HDFS上的文件 的路径
        //设置读取文件的位置 可以是文件 也可以是文件夹
        FileInputFormat.setInputPaths(job,new Path("/join/order.txt"));
        //设置输出文件的位置 指定一个文件夹 文件夹不已存在 会报错
        FileOutputFormat.setOutputPath(job,new Path("/join/out"));

        //提交任务 并等待任务结束
        job.waitForCompletion(true);

    }

}

MR程序提交到Yarn上流程

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

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

相关文章

基于uprobe的调试调优浅析

uprobe与krobe对应&#xff0c;动态附加到用户态调用函数的切入点称为uprobe&#xff0c;相比如kprobe 内核函数的稳定性&#xff0c;uprobe 的函数由开发者定义。uprobe是用户态的探针&#xff0c;它和kprobe是相对应的&#xff0c;kprobe是内核态的探针。uprobe需要制定用户态…

深度学习模型压缩方法综述

深度学习因其计算复杂度或参数冗余,在一些场景和设备上限制了相应的模型部署,需要借助模型压缩、系统优化加速等方法突破瓶颈,本文主要介绍模型压缩的各种方法,希望对大家有帮助。 1,模型压缩技术概述 我们知道,一定程度上,网络越深,参数越多,模型也会越复杂,但其最终…

基于Smb协议实现网络文件传输

文章目录 什么是SMB协议SMB与CIFS区别为什么要使用SMB如何对接SMB服务如何用Java实现Smb文件传输SmbV1的实现基于SmbV1的文件上传基于SmbV1的文件下载基于SmbV1的文件重命名基于SmbV1的文件删除基于SmbV1的文件查询 SmbV2的实现基于SmbV2的文件上传基于SmbV2的文件下载基于SmbV…

面向开发人员的 ChatGPT 提示词教程中文版 - ChatGPT 版

面向开发人员的 ChatGPT 提示词教程中文版 - ChatGPT 版 1. 指南1-1. 提示的指南1-2. 配置1-3. 提示语原则原则 1: 写出清晰而具体的指示技巧 1: 使用分隔符来清楚地表明输入的不同部分技巧 2: 要求提供结构化的输出技巧 3: 要求模型检查条件是否得到满足技巧 4: "少许样本…

QML Canvas 元素(绘制文本)

关于 QML Canvas,我们已经学习了如何绘制基本图形、应用样式和颜色、绘制图像等,现在来看一下如何在 Canvas 中绘制文本。 Canvas 提供了两种方式来渲染文本: fillText(text, x, y) 在指定的 (x,y) 位置填充指定的文本 strokeText(text, x, y) 在指定的 (x,y) 位置绘制文本…

基于t分布变异自适应的改进的黏菌算法(TSMA)

目录 一、基于t分布的自适应黏菌优化算法TSAM 1.1 自适应t分布变异 1.2 建立基于t分布的自适应黏菌优化算法TSAM 二、TSMA伪码表示如下&#xff1a; 三、改进对比 黏菌优化算法灵感来自于黏菌的扩张和觅食行为。主要模拟了黏菌在觅食过程中的行为和形态变化&#xff0c;没…

【网络2】MII MDIO

文章目录 1.MII&#xff1a;ISO网络模型中物理层&#xff08;phy&#xff09;和数据链路层&#xff08;mac&#xff09;属于硬件&#xff0c;其余都属于软件kernel2.MDC/MDIO&#xff1a;不仅管phy&#xff0c;只要支持mdio协议都可以管2.1 3.RGMII时序调整&#xff1a;下面波形…

BUUCTF——九连环1

听这个名字就不正常&#xff0c;不会加密九次吧 打开也是一张图片 依旧是存在隐藏文件信息 分离出来后有两个文件&#xff0c;和两个压缩包&#xff0c;但是都需要密码 哦看错了&#xff0c;原来binwalk直接把里面的给分离出来了 所以现在就asd一个文件夹 爆破不出来&#xff0…

为什么调试很重要?gdb调试分析问题

为什么调试很重要&#xff1f; 一、引言二、调试的定义和分类2.1、调试的定义2.2.、调试的分类 三、调试的重要性四、调试的步骤和技巧4.1、定位问题4.2、重现问题4.3、分析问题4.4、解决问题4.5、调试技巧 五、简单的GDB调试示例&#xff1a;六、总结 一、引言 &#x1f4a1; …

【基于Django框架的在线教育平台开发-02】用户注册功能开发

用户注册功能开发 文章目录 用户注册功能开发1 模型层开发2 视图层开发3 配置urls.py4 表单验证5 模板层开发6 效果展示 1 模型层开发 用户数据表如下所示&#xff1a; FieldTypeExtraidintPrime Key & Auto Incrementpasswordvarchar(128)last_logindatetime(6)Allow Nu…

缓存雪崩和缓存穿透的解决方案

缓存雪崩 缓存雪崩是指存储在缓存里面的大量数据&#xff0c;在同一时刻全部过期&#xff0c;大部分流量直接到达了数据库&#xff0c;导致数据库压力增加&#xff0c;造成数据库崩溃的情况。 缓存雪崩的解决方案如下&#xff1a; 每个缓存的key设置不同的过期时间采用多级缓…

STM32单片机(九)USART串口----第四节:USART串口实战练习(串口发送+接收)

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

在 K8S 中部署一个应用 下

接着上一篇继续部署应用到 K8S中 之前简单部署的简单集群&#xff0c;三个工作节点是运行在 docker 和 kubelet 的&#xff0c;还有一个是控制节点 ReplicationController &#xff0c; pod 和 service 本次关系 之前有提到 ReplicationController &#xff0c; pod 和 服务…

设计模式之命令模式笔记

设计模式之命令模式笔记 说明Command(命令)目录命令模式示例类图订单类厨师类抽象命令类订单命令类服务员类测试类 说明 记录下学习设计模式-命令模式的写法。JDK使用版本为1.8版本。 Command(命令) 意图:将一个请求封装为一个对象&#xff0c;从而使得可以用不同的请求对客…

STM32单片机(九)USART串口----第二节:USART串口外设

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

STM32单片机(九)USART串口----第三节:USART串口实战练习(串口发送)

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

常见面试题之MySQL篇

1.MySQL中&#xff0c;如何定位慢查询? 我们当时做压测的时候有的接口非常的慢&#xff0c;接口的响应时间超过了2秒以上&#xff0c;因为我们当时的系统部署了运维的监控系统Skywalking&#xff0c;在展示的报表中可以看到是哪一个接口比较慢&#xff0c;并且可以分析这个接…

【数据库七】MySQL主从复制与读写分离

MySQL主从复制与读写分离 1.案例概述2.什么是读写分离&#xff1f;3.为什么要读写分离呢&#xff1f;4.什么时候要读写分离&#xff1f;5.主从复制与读写分离6.MySQL主从复制原理6.1 mysql的复制类型 7.主从复制的工作过程7.1 MySQL架构图7.2 口语化工作工程 8.MySQL 读写分离原…

VSCode配置C语言编译环境

一、下载C语言编译器&#xff1a; &#xff08;1&#xff09;下载地址&#xff1a;MinGW-w64 - for 32 and 64 bit Windows - Browse /mingw-w64 at SourceForge.net 下载如下的windows版本&#xff1a; &#xff08;2&#xff09;配置环境变量&#xff1a; 二、安装VSCode …

Linux学习[18]bash学习深入4----命令执行的判断依据---【; , , ||】---用于一次性输入多指令情况

文章目录 前言判断符号 &#xff1b;判断符号 &&与||总结 前言 使用指令的时候&#xff0c;使用完一个指令之后&#xff0c;我想让它接着执行另一个指令&#xff0c;而非等A指令执行完之后再输入B指令。 为了实现这个效果&#xff0c;我查阅了相关资料&#xff0c;这里…