Hadoop3.0大数据处理学习3(MapReduce原理分析、日志归集、序列化机制、Yarn资源调度器)

MapReduce原理分析

什么是MapReduce

前言:如果想知道一堆牌中有多少张红桃,直接的方式是一张张的检查,并数出有多少张红桃。
而MapReduce的方法是,给所有的节点分配这堆牌,让每个节点计算自己手中有几张是红桃,然后将这个数汇总,得到结果。

概述

  • 官方介绍:MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题。
  • MapReduce是分布式运行的,由俩个阶段组成:Map和Reduce。
  • MapReduce框架都有默认实现,用户只需要覆盖map()和reduce()俩个函数,即可实现分布式计算。

原理分析

image.png

Map阶段执行过程

  1. 框架会把输入文件划分为很多InputSplit,默认每个hdfs的block对应一个InputSplit。通过RecordReader类,将每个InputSplit解析为一个个键值对<K1,V1>。默认每一个行会被解析成一个键值对。
  2. 框架会调用Mapper类中的map()函数,map函数的形参是<k1,v1>,输出是<k2,v2>。一个inputSplit对应一个map task。
  3. 框架对map函数输出的<k2,v2>进行分区。不同分区中的<k2,v2>由不同的reduce task处理,默认只有一个分区。
  4. 框架对每个分区中的数据,按照k2进行排序、分组。分组指的是相同k2的v2分为一组。
  5. 在map节点,框架可以执行reduce规约,此步骤为可选。
  6. 框架会把map task输出的<k2,v2>写入linux的磁盘文件

Reduce阶段执行过程

  1. 框架对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点,这个过程称为shuffle。
  2. 框架对reduce端接收到的相同分区的<k2,v2>数据进行合并、排序、分组
  3. 框架调用reduce类中的reduce方法,输入<k2,[v2…]>,输出<k3,v3>。一个<k2,[v2…]>调用一次reduce函数。
  4. 框架把reduce的输出保存到hdfs。

WordCount案例分析

image.png

多文件WordCount案例分析

image.png

image.png

Shuffle过程详解

shuffle是一个过程,贯穿map和reduce,通过网络将map产生的数据放到reduce。
image.png

Map与Reduce的WordsCount案例(与日志查看)

引入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.14</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.hx</groupId>
    <artifactId>hadoopDemo1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>hadoopDemo1</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>3.3.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>

编码

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import java.io.IOException;

/**
 * @author Huathy
 * @date 2023-10-21 21:17
 * @description 组装任务
 */
public class WordCountJob {
    public static void main(String[] args) throws Exception {
        System.out.println("inputPath  => " + args[0]);
        System.out.println("outputPath  => " + args[1]);
        String path = args[0];
        String path2 = args[1];

        // job需要的配置参数
        Configuration configuration = new Configuration();
        // 创建job
        Job job = Job.getInstance(configuration, "wordCountJob");
        // 注意:这一行必须设置,否则在集群的时候将无法找到Job类
        job.setJarByClass(WordCountJob.class);
        // 指定输入文件
        FileInputFormat.setInputPaths(job, new Path(path));
        FileOutputFormat.setOutputPath(job, new Path(path2));

        job.setMapperClass(WordMap.class);
        job.setReducerClass(WordReduce.class);
        // 指定map相关配置
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(LongWritable.class);
        // 指定reduce
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(LongWritable.class);

        // 提交任务
        job.waitForCompletion(true);
    }

    /**
     * @author Huathy
     * @date 2023-10-21 21:39
     * @description 创建自定义映射类
     * 定义输入输出类型
     */
    public static class WordMap extends Mapper<LongWritable, Text, Text, LongWritable> {
        /**
         * 需要实现map函数
         * 这个map函数就是可以接受keyIn,valueIn,产生keyOut、ValueOut
         *
         * @param k1
         * @param v1
         * @param context
         * @throws IOException
         * @throws InterruptedException
         */
        @Override
        protected void map(LongWritable k1, Text v1, Context context) throws IOException, InterruptedException {
            // k1表示每行的行首偏移量,v1表示每一行的内容
            // 对获取到的每一行数据进行切割,把单词切割出来
            String[] words = v1.toString().split("\W");
            // 迭代切割的单词数据
            for (String word : words) {
                // 将迭代的单词封装为<k2,v2>的形式
                Text k2 = new Text(word);
                System.out.println("k2: " + k2.toString());
                LongWritable v2 = new LongWritable(1);
                // 将<k2,v2>输出
                context.write(k2, v2);
            }
        }
    }

    /**
     * @author Huathy
     * @date 2023-10-21 22:08
     * @description 自定义的reducer类
     */
    public static class WordReduce extends Reducer<Text, LongWritable, Text, LongWritable> {
        /**
         * 针对v2s的数据进行累加求和,并且把最终的数据转为k3,v3输出
         *
         * @param k2
         * @param v2s
         * @param context
         * @throws IOException
         * @throws InterruptedException
         */
        @Override
        protected void reduce(Text k2, Iterable<LongWritable> v2s, Context context) throws IOException, InterruptedException {
            long sum = 0L;
            for (LongWritable v2 : v2s) {
                sum += v2.get();
            }
            // 组装K3,V3
            LongWritable v3 = new LongWritable(sum);
            System.out.println("k3: " + k2.toString() + " -- v3: " + v3.toString());
            context.write(k2, v3);
        }
    }

}

运行命令与输出日志

[root@cent7-1 hadoop-3.2.4]# hadoop jar wc.jar WordCountJob  hdfs://cent7-1:9000/hello.txt  hdfs://cent7-1:9000/out /home/hadoop-3.2.4/wc.jar
inputPath  => hdfs://cent7-1:9000/hello.txt
outputPath  => hdfs://cent7-1:9000/out
set jar => /home/hadoop-3.2.4/wc.jar
2023-10-22 15:30:34,183 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032
2023-10-22 15:30:35,183 WARN mapreduce.JobResourceUploader: Hadoop command-line option parsing not performed. Implement the Tool interface and execute your application with ToolRunner to remedy this.
2023-10-22 15:30:35,342 INFO mapreduce.JobResourceUploader: Disabling Erasure Coding for path: /tmp/hadoop-yarn/staging/root/.staging/job_1697944187818_0010
2023-10-22 15:30:36,196 INFO input.FileInputFormat: Total input files to process : 1
2023-10-22 15:30:37,320 INFO mapreduce.JobSubmitter: number of splits:1
2023-10-22 15:30:37,694 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1697944187818_0010
2023-10-22 15:30:37,696 INFO mapreduce.JobSubmitter: Executing with tokens: []
2023-10-22 15:30:38,033 INFO conf.Configuration: resource-types.xml not found
2023-10-22 15:30:38,034 INFO resource.ResourceUtils: Unable to find 'resource-types.xml'.
2023-10-22 15:30:38,188 INFO impl.YarnClientImpl: Submitted application application_1697944187818_0010
2023-10-22 15:30:38,248 INFO mapreduce.Job: The url to track the job: http://cent7-1:8088/proxy/application_1697944187818_0010/
2023-10-22 15:30:38,249 INFO mapreduce.Job: Running job: job_1697944187818_0010
2023-10-22 15:30:51,749 INFO mapreduce.Job: Job job_1697944187818_0010 running in uber mode : false
2023-10-22 15:30:51,751 INFO mapreduce.Job:  map 0% reduce 0%
2023-10-22 15:30:59,254 INFO mapreduce.Job:  map 100% reduce 0%
2023-10-22 15:31:08,410 INFO mapreduce.Job:  map 100% reduce 100%
2023-10-22 15:31:09,447 INFO mapreduce.Job: Job job_1697944187818_0010 completed successfully
2023-10-22 15:31:09,578 INFO mapreduce.Job: Counters: 54
	File System Counters
		FILE: Number of bytes read=129
		FILE: Number of bytes written=479187
		FILE: Number of read operations=0
		FILE: Number of large read operations=0
		FILE: Number of write operations=0
		HDFS: Number of bytes read=139
		HDFS: Number of bytes written=35
		HDFS: Number of read operations=8
		HDFS: Number of large read operations=0
		HDFS: Number of write operations=2
		HDFS: Number of bytes read erasure-coded=0
	Job Counters 
		Launched map tasks=1
		Launched reduce tasks=1
		Data-local map tasks=1
		Total time spent by all maps in occupied slots (ms)=4916
		Total time spent by all reduces in occupied slots (ms)=5821
		Total time spent by all map tasks (ms)=4916
		Total time spent by all reduce tasks (ms)=5821
		Total vcore-milliseconds taken by all map tasks=4916
		Total vcore-milliseconds taken by all reduce tasks=5821
		Total megabyte-milliseconds taken by all map tasks=5033984
		Total megabyte-milliseconds taken by all reduce tasks=5960704
	Map-Reduce Framework
		Map input records=4
		Map output records=8
		Map output bytes=107
		Map output materialized bytes=129
		Input split bytes=94
		Combine input records=0
		Combine output records=0
		Reduce input groups=5
		Reduce shuffle bytes=129
		Reduce input records=8
		Reduce output records=5
		Spilled Records=16
		Shuffled Maps =1
		Failed Shuffles=0
		Merged Map outputs=1
		GC time elapsed (ms)=259
		CPU time spent (ms)=2990
		Physical memory (bytes) snapshot=528863232
		Virtual memory (bytes) snapshot=5158191104
		Total committed heap usage (bytes)=378011648
		Peak Map Physical memory (bytes)=325742592
		Peak Map Virtual memory (bytes)=2575839232
		Peak Reduce Physical memory (bytes)=203120640
		Peak Reduce Virtual memory (bytes)=2582351872
	Shuffle Errors
		BAD_ID=0
		CONNECTION=0
		IO_ERROR=0
		WRONG_LENGTH=0
		WRONG_MAP=0
		WRONG_REDUCE=0
	File Input Format Counters 
		Bytes Read=45
	File Output Format Counters 
		Bytes Written=35
[root@cent7-1 hadoop-3.2.4]# 

MapReduce任务日志查看

  1. 开启yarn日志聚合功能,将散落在nodemanager节点的日志统一收集管理,方便查看
  2. 修改yarn-site.xml中的yarn.log-aggregation-enable和yarn.log.server.url
<property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
</property>
<property>
    <name>yarn.log.server.url</name>
    <value>http://cent7-1:19888/jobhistory/logs/</value>
</property>
  1. 启动historyserver:
sbin/mr-jobhistory-daemon.sh  start historyserver

UI界面查看

  1. 访问 http://192.168.56.101:8088/cluster ,点击History
    image.png

  2. 点进Successful
    image.png

  3. 看到成功记录,点击logs可以看到成功日志

image.png

停止Hadoop集群中的任务

Ctrl+C退出终端,并不会结束任务,因为任务已经提交到了Hadoop

  1. 查看任务列表:yarn application -list
  2. 结束任务进程:yarn application -kill [application_Id]
# 查看正在进行的任务列表
[root@cent7-1 hadoop-3.2.4]# yarn application -list
2023-10-22 16:18:38,756 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032
Total number of applications (application-types: [], states: [SUBMITTED, ACCEPTED, RUNNING] and tags: []):1
                Application-Id	    Application-Name	    Application-Type	      User	     Queue	             State	       Final-State	       Progress	                       Tracking-URL
application_1697961350721_0002	        wordCountJob	           MAPREDUCE	      root	   default	          ACCEPTED	         UNDEFINED	             0%	                                N/A
# 结束任务
[root@cent7-1 hadoop-3.2.4]# yarn application -kill application_1697961350721_0002
2023-10-22 16:18:55,669 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032
Killing application application_1697961350721_0002
2023-10-22 16:18:56,795 INFO impl.YarnClientImpl: Killed application application_1697961350721_0002

Hadoop序列化机制

序列化机制作用

image.png
上面可以看出,Hadoop运行的时候大多数IO操作。我们在编写Hadoop的Map和Reduce代码的时候,用的都是Hadoop官方提供的数据类型,Hadoop官方对序列化做了优化,只会序列化核心内容来减少IO开销。

Hadoop序列化机制的特点

  1. 紧凑:高效的使用存储空间
  2. 快速:读写数据的额外开销小
  3. 可扩展:可透明的读取老格式的数据
  4. 互操作:支持多语言操作

Java序列化的不足

  1. 不够精简,附加信息多,不适合随机访问
  2. 存储空间占用大,递归输出类的父类描述,直到不再有父类
  3. 扩展性差,Hadoop中的Writable可以方便用户自定义

资源管理器(Yarn)详解

  1. Yarn目前支持三种调度器:(针对任务的调度器)
    • FIFO Scheduler:先进先出调度策略(工作中存在实时任务和离线任务,先进先出可能不太适合业务)
    • CapacityScheduler:可以看作是FIFO的多队列版本。可以分成多个队列,每个队列里面是先进先出的。
    • FairScheduler:多队列,多用户共享资源。公平任务调度(建议使用)。

image.png

image.png

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IOC课程整理-20 Spring 应用上下文生命周期

0.目录 1. Spring 应用上下文启动准备阶段 2. BeanFactory 创建阶段 3. BeanFactory 准备阶段 4. BeanFactory 后置处理阶段 5. BeanFactory 注册 BeanPostProcessor 阶段 6. 初始化內建 Bean&#xff1a;MessageSource 7. 初始化內建 Bean&#xff1a;Spring 事件广播器…

【LeetCode每日一题合集】2023.10.23-2023.10.29(简单的一周)

文章目录 2678. 老人的数目&#xff08;简单遍历模拟&#xff09;1155. 掷骰子等于目标和的方法数&#xff08;动态规划&#xff09;2698. 求一个整数的惩罚数&#xff08;预处理dfs回溯&#xff09;2520. 统计能整除数字的位数&#xff08;简单模拟&#xff09;1465. 切割后面…

【面试经典150 | 栈】简化路径

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;字符串数组模拟栈 其他语言python3 写在最后 Tag 【栈】【字符串】 题目来源 71. 简化路径 题目解读 将 Unix 风格的绝对路径转化成更加简洁的规范路径。字符串中会出现 字母、数字、/、_、. 和 .. 这几种字符&#…

关于FTP的一些往事

公司每天都要从美国的服务器下载大量的语音文件。然后根据语音的内容完成相关的医疗报告。不同语音的实时性要求是不一样的&#xff0c;有些要求6小时内完成&#xff08;TAT6&#xff09; &#xff0c;有些则是12小时。中美之间的网速又特别慢&#xff0c;所以&#xff0c;如何…

shell脚本变量

目录 1.变量的定义 2.shell脚本中变量的定义方法 3.变量的转译 4.Linux中命令的别名设定 5.用户环境变量的更改 6.利用命令的执行结果设定变量 7.脚本函数 1.变量的定义 1&#xff09;定义本身 变量就是内存一片区域的地址 2)变量存在的意义 命令无法操作一直变化的目…

14. 机器学习 - KNN 贝叶斯

Hi&#xff0c;你好。我是茶桁。 咱们之前几节课的内容&#xff0c;从线性回归开始到最后讲到了数据集的处理。还有最后补充了SOFTMAX。 这些东西&#xff0c;都挺零碎的&#xff0c;但是又有着相互之间的关系&#xff0c;并且也都蛮重要的。并且是在学习机器学习过程当中比较…

【赠书活动】从瀑布模式到水母模式:ChatGPT如何赋能软件研发全流程

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

测开 (性能测试)

目录 前言 1、性能测试和功能测试的区别 2、性能好与不好的表现 3、性能测试衡量指标 && 名称解释 指标一&#xff1a;并发用户数 指标二&#xff1a;响应时间 / 平均响应时间 指标三&#xff1a;事务 指标四&#xff1a;点击率&#xff08;Hit Per Second&…

【C++笔记】C++继承

【C笔记】C继承 一、继承的概念二、继承的语法和权限三、父类和子类成员之间的关系3.1、子类赋值给父类(切片)3.2、同名成员 四、子类中的默认成员函数4.1、构造函数4.2、拷贝构造4.3、析构函数 五、C继承大坑之“菱形继承”5.1、什么是“菱形继承”5.2、解决方法 一、继承的概…

数据交换技术

一、数据交换 数据交换是实现在大规模网络核心上进行数据传输的技术基础。 常见的数据交换技术包括 电路交换报文交换分组交换 基于不同交换技术构建的网络分别称之为电路交换网络、报文交换网络和分组交换网络。 发展演变图&#xff1a; a) 电路交换 电路交换是最早出现…

JEnv使用初体验

Java多版本控制器初体验 1、前言 由于公司项目使用jdk8版本&#xff0c;而日常学习会使用其他版本例如jdk17等&#xff0c;往常都是修改环境配置目录实现。 2、下载资料 链接&#xff1a;https://pan.baidu.com/s/1UqzHv8K8WBu-75Ysyc_h3A 提取码&#xff1a;ra6a 3、安装 …

TYWZOJ 种树苗 待定题解

文章目录 题目描述输入格式输出格式样例样例输入样例输出 数据范围与提示思路与部分实现完整代码 题目描述 在游戏 Minecraft 中&#xff0c;玩家可以通过种树来使木材再生。玩家需要将树苗种在泥土上&#xff0c;然后等待它长成大树&#xff0c;期间可以利用骨粉来催熟树苗。…

Linux——文件权限属性和权限管理

文件权限属性和权限管理 本章思维导图&#xff1a; 注&#xff1a;本章思维导图对应的Xmid文件和.png文件都以传到“资源” 文章目录 文件权限属性和权限管理1. sudo提权和sudoers文件1.1 sudo提权和成为root的区别 2. 权限2.1 Linux群体2.1.1 为什么要有所属组2.1.2 修改文件…

汇编运算符和表达式

运算符&#xff1a; 汇编语言由表达式和运算符组成&#xff0c;运算符分为数值运算符和属性运算符。属性运算符面向变量或标号。 数值运算符&#xff1a; 算术运算符&#xff1a; 运算符类型 ✓ ( 正号 ) 、 -( 负号 ) ✓ ( 加 ) 、 -( 减 ) 、 *( 乘 ) 、 /( 除 ) 、 MO…

centos中安装Mysql8.0

其实和mysql5.7的安装差不多 1.root用户 2.更新密钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 3.安装mysql yum库 rpm -Uvh https://dev.mysql.com/ get/mysql80-community-release-el7-2.noarch.rpm 4.通过上两步&#xff0c;我们就可以使用yum去安装…

2023-10-21 美团2024秋招后端开发岗笔试题

1 考察dfs和拓扑排序 1.1 题目描述&#xff08;如果拓扑排序不清楚可以去做一下lc 207. 课程表&#xff09; 1.2 答案 import java.util.*;public class Meituan {static int m,n;public static void main(String[] args) {Scanner in new Scanner(System.in);m in.nextInt…

Controller接收Postman的raw参数时,属性值全部为空

Controller接收Postman的raw参数时&#xff0c;属性值全部为空 情景再现 在进行业务代码的编写过程中&#xff0c;使用Postman等工具调用Controller接口时&#xff0c;发现属性值全部为空后端代码如下&#xff1a; Requset对象为&#xff1a; public class QuerySkuRequest …

Openssl数据安全传输平台017:客户端在Linux上的编译与调试

客户端代码在widows上编译&#xff0c;除了protobuf找不到目录&#xff0c;其他的基本没有什么问题。 然后打开虚拟机&#xff0c;项目文件已经在/home/projects目录下了 进入项目文件&#xff0c;对代码进行编译 第一次 // 找不到protobuf g *.cpp *.cc -ljson -lpthread -…

雨云OSS服务介绍和使用教程,以及Chevereto图床使用雨云OSS的教程

雨云OSS&#xff08;对象存储&#xff09;服务介绍和使用教程&#xff0c;以及Chevereto图床程序使用雨云OSS的教程 雨云OSS&#xff08;对象存储&#xff09;是一种基于S3协议的云端数据存储服务&#xff0c;它可以帮助你将数据安全、高效地存储在云端&#xff0c;并且可以随…

队列(Queue)概念+通过单、双链表来模拟队列+环形队列+OJ面试题(用队列实现栈、用栈实现队列、设计环形队列)

文章目录 队列(Queue)一、 概念1.尾进头出 二、模拟队列1.单链表实现队列1.1 设置结点1.2 入队offer1.3出队 poll1.4 empty方法&#xff0c;peek方法&#xff0c;getUsedSize方法 2.双链表实现队列2.1 创建结点2.2 入队列2.3 出队列2.4 peek、size、isEmpty方法 三、环形队列1.…