• Hadoop yarn工作流程详解


    yarn是什么?
    1、它是一个资源调度及提供作业运行的系统环境平台
    资源:cpu、mem等
    作业:map task、reduce Task


    yarn产生背景?
    它是从hadoop2.x版本才引入
    1、hadoop1.x版本它是如何资源调度及作业运行机制原理
    a、JobTracker(主节点)
    (a):接受客户端的作业提交
    (b):交给任务调度器安排任务的执行
    (c):通知空闲的TaskTracker去处理
    (d): 与TaskTracker保持心跳机制


    b、TaskTracker(从节点)
    (a):执行map task和reduce task
    (b): 与JobTracker保持心跳机制

    缺点:
    1、单点故障问题
    2、负载压力
    3、只能运行mapreduce的程序

    引入了yarn机制
    1、减少负载压力
    2、主备机制
    3、支持不同的程序运行

    yarn整体的架


    yarn主要的核心组件?

     


    resourcemanager


    作用:
    (1)接受客户端提交作业
    (2)启动一个app master去处理
    资源分配
    (3)监控nodemanager


    nodemanager


    作用:
    (1)管理单个节点上的资源
    (2)接受resourcemanager发送过来的指令
    (3)接受app master发送过来的指令
    (4) 启动Container


    app master


    (1)运行作业的主控者
    (2)获取切片数据
    (3)从resourcemanager审请运行作业资源
    (4)监控作业运行的状态


    Container


    它其实就是一个虚拟主机的抽象,分配cpu和内存,主要运行作业

     

    app master
    Container
    Client



    yarn的工作机制(重点)
    1、连接运行器平台
    根据mapreduce.framework.name变量配置
    如果等于yarn:则创建YARNRunner对象
    如果等于Local:则创建LocalJobRunner对象

    2、如果是yarn平台,对resoucemanager提交作业审请
    3、resourcemanager返回一个jobid和数据保存目录(hdfs://xxx/staging/xxx)
    4、客户端根据返回数据保存目录路径,将job.split、job.xml、jar文件提交到hdfs://xxx/staging/xxx目录
    5、提交数据资源之后,客户端对resouremanager提交任务运行
    6、resourcemanager将任务存储任务队列
    7、resourcemanager发送命令nodemanager处理从任务取出的任务
    8、nodemanager往resourcemanageer审请我要创建一个app master
    a、在nodemanager创建一个container,再启动app master
    9、app master读取数据切片处理方案
    10、app master往resourcemanager审请运行资源
    11、resourcemanager往空闲的nodemanager主机发送指令,要创建Container
    12、app master往nodemanger发送运行指令,container运行任务。

    如下图:


    是否可以直接从本地idea直接将程序运行到yarn平台?

    以wordcount为例:

    代码如下:

    package com.gec.demo;
    
    
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.LongWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Mapper;
    
    import java.io.IOException;
    
    /*
    * 作用:体现mapreduce的map阶段的实现
    * KEYIN:输入参数key的数据类型
    * VALUEIN:输入参数value的数据类型
    * KEYOUT,输出key的数据类型
    * VALUEOUT:输出value的数据类型
    *
    * 输入:
    *      map(key,value)=偏移量,行内容
    *
    * 输出:
    *      map(key,value)=单词,1
    *
    * 数据类型:
    * java数据类型:
    * int-------------->IntWritable
    * long------------->LongWritable
    * String----------->Text
    * 它都实现序列化处理
    *
     * */
    public class WcMapTask extends Mapper<LongWritable, Text,Text, IntWritable>
    {
        /*
        *根据拆分输入数据的键值对,调用此方法,有多少个键,就触发多少次map方法
        * 参数一:输入数据的键值:行的偏移量
        * 参数二:输入数据的键对应的value值:偏移量对应行内容
        * */
        @Override
        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
    
            String line=value.toString();
    
            String words[]=line.split(" ");
    
            for (String word : words) {
    
                context.write(new Text(word),new IntWritable(1));
            }
    
        }
    }
    package com.gec.demo;
    
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Reducer;
    
    import java.io.IOException;
    
    /*
    * 此类:处理reducer阶段
    *   汇总单词次数
    * KEYIN:输入数据key的数据类型
    * VALUEIN:输入数据value的数据类型
    * KEYOUT:输出数据key的数据类型
    * VALUEOUT:输出数据value的数据类型
    *
    *
    * */
    public class WcReduceTask extends Reducer<Text, IntWritable,Text,IntWritable>
    {
        /*
        * 第一个参数:单词数据
        * 第二个参数:集合数据类型汇总:单词的次数
        *
        * */
        @Override
        protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
    
            int count=0;
    
            for (IntWritable value : values) {
    
                count+=value.get();
            }
    
            context.write(key,new IntWritable(count));
    
        }
    }
    package com.gec.demo;
    
    
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Reducer;
    
    import java.io.IOException;
    
    public class WcCombiner extends Reducer<Text, IntWritable,Text,IntWritable> {
        private IntWritable sum=new IntWritable();
        @Override
        protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
            int count=0;
    
            for (IntWritable value : values) {
                count+=value.get();
            }
            sum.set(count);
            context.write(key,sum);
        }
    }
    package com.gec.demo;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Job;
    import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
    import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    
    import java.io.IOException;
    
    /**
     * Hello world!
     *
     */
    public class App 
    {
        public static void main( String[] args ) throws IOException, ClassNotFoundException, InterruptedException {
    
            Configuration conf=new Configuration();
    //        conf.set("fs.defaultFS","hdfs://hadoop-001:9000");
    //        conf.set("mapreduce.framework.name","yarn");
    //        conf.set("yarn.resourcemanager.hostname","hadoop-002");
            conf.set("mapred.jar","D:\JAVA\projectsIDEA\BigdataStudy\mrwordcountbyyarn\target\wordcountbyyarn-1.0-SNAPSHOT.jar");
            Job job=Job.getInstance(conf);
            //设置Driver类
            job.setJarByClass(App.class);
    
            //设置运行那个map task
            job.setMapperClass(WcMapTask.class);
            //设置运行那个reducer task
            job.setReducerClass(WcReduceTask.class);
            job.setCombinerClass(WcCombiner.class);
    
            //设置map task的输出key的数据类型
            job.setMapOutputKeyClass(Text.class);
            //设置map task的输出value的数据类型
            job.setMapOutputValueClass(IntWritable.class);
    
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(IntWritable.class);
    
            //指定要处理的数据所在的位置
            FileInputFormat.setInputPaths(job, "/wordcount/input/big.txt");
            //指定处理完成之后的结果所保存的位置
            FileOutputFormat.setOutputPath(job, new Path("/wordcount/output7"));
            //向yarn集群提交这个job
            boolean res = job.waitForCompletion(true);
            System.exit(res?0:1);
    
        }
    }

    其中

    是因为在resource文件夹中直接添加配置文件

    配置文件分别如下:

    core-site.xml
    hdfs-site.xml
    mapred-site.xml
    yarn-site.xml

     注意:这里的配置文件要和虚拟机中的配置文件一样,否则可能会出错,最好的做法是从虚拟机中直接copy出来

  • 相关阅读:
    [转]使用NLog记录日志到数据库 自定义日志表的数据格式
    [转]使用C#实现长整型向任意编码的转换和逆转换
    解释一下 P/NP/NPComplete/NPHard 等问题
    在C#中创建进度窗体
    [转载] 关于Winform编译中的属性设置
    [转]使用NLog記錄Exception
    SQL Server数据库,在表上建立唯一性索引的一些问题
    DES文件字符加密解密
    线程运行超时处理类
    使用FFmpeg从视频中截图的命令
  • 原文地址:https://www.cnblogs.com/Transkai/p/10549923.html
Copyright © 2020-2023  润新知