Hadoop的第二个核心组件:MapReduce框架第一节

这篇具有很好参考价值的文章主要介绍了Hadoop的第二个核心组件:MapReduce框架第一节。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、基本概念

Hadoop解决了大数据面临的两个核心问题:海量数据的存储问题、海量数据的计算问题

其中MapReduce就是专门设计用来解决海量数据计算问题的,同时MapReduce和HDFS不一样的地方在于,虽然两者均为分布式组件,但是HDFS是一个完善的软件,我们只需要使用即可,不需要去进行任何的逻辑的编辑。而MapReduce进行数据计算,计算什么样的数据,使用什么样的逻辑,MR程序都不清楚,因此MR只是一个分布式的计算【框架】,所谓的框架就是MR程序把分布式计算的思想和逻辑全部封装好了,我们只需要按照框架的思维编写计算代码(就是我们自己处理数据的逻辑代码),编写完成之后,我们的程序必然是分布式的程序。

使用分布式计算框架的好处就在于我们开发人员只需要把关注点和重点放在业务的逻辑开发,而非分布式计算程序逻辑的逻辑。

二、MapReduce的分布式计算核心思想

MR框架实现分布式计算的逻辑是将MR程序分成了两部分:Map阶段、Reduce阶段

其中运行一个计算程序先执行Map阶段,map阶段又可以同时运行多个计算程序(MapTask)去计算map阶段的逻辑,Map阶段主要负责分数据,而且map阶段的多个MapTask并行运行互不干扰。

第二阶段Reduce阶段,Reduce阶段也可以同时运行多个计算程序(ReduceTask),Reduce阶段的任务主要负责合数据,同时多个ReduceTask同时运行互不干扰的。

任何一个MR程序,只能有一个Map阶段,一个Reduce阶段。

三、MapReduce程序在运行过程中三个核心进程

MRAppMaster(一个):负责整个分布式程序的监控

MapTask(多个):Map阶段的核心进程,每一个MapTask处理数据源的一部分数据

ReduceTask(多个):Reduce阶段的核心进程,每一个ReduceTask负责处理Map阶段输出的一部分数据

四、如何编写MapReduce计算程序:(编程步骤)

1、编写MapTask的计算逻辑

1、编写一个Java类继承Mapper类,继承Mapper类之后必须指定四个泛型,四个泛型分别代表了MapTask阶段的输入的数据和输出的数据类型。
MR程序要求输入的数据和输出的数据类型必须都得是key-value键值对类型的数据。

2、重写继承的Mapper类当中的map方法,map方法处理数据的时候是文件中的一行数据调用一次map方法,map方法的计算逻辑就是MapTask的核心计算逻辑。

3、同时map方法中数据计算完成,需要把数据以指定的key-value格式类型输出。

2、编写ReduceTask的计算逻辑

1、编写一个Java类继承Reducer类,继承Reducer类之后必须指定四个泛型,四个泛型分别代表了Reduce阶段的输入和输出的KV数据类型。
Reduce的输入的KV类型就是Map阶段的输出的KV类型。
Reduce的输出类型自定义的。

2、重写Reducer类当中提供的reduce方法,reduce方法处理数据的时候一组相同的key调用一次reduce方法,reduce方法的计算逻辑就是ReduceTask的核心计算逻辑。

3、调用reduce方法,reduce逻辑处理完成,需要把数据以指定的key-value格式类型输出。

3、编写Driver驱动程序

Driver驱动程序是用来组装MR程序,组装MR程序的处理的文件路径、MR程序的Map阶段的计算逻辑、MR程序的Reduce阶段的计算逻辑、MR程序运行完成之后的结果的输出路径。

Driver驱动程序本质上就是一个main函数

MapReduce底层是由Java开发的,因此MR程序我们要编写的话支持使用Java代码来进行编写

五、MapReduce的案例实现 —— 大数据分布式计算的经典案例WordCount(单词计数)

1、案例需求

现在有一个文件,文件很大,文件中存储的每一行数据都是由空格分割的多个单词组成的,现在需要通过大数据分布式计算技术去统计文件中每一个单词出现的总次数

2、案例分析(基于MapReduce)

Hadoop的第二个核心组件:MapReduce框架第一节,Hadoop,hadoop,mapreduce,大数据

3、代码开发

1、创建一个maven管理的Java项目

2、引入MR的编程依赖

  • hadoop-client
  • hadoop-hdfs
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.kang</groupId>
  <artifactId>mr-study</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>mr-study</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <hadoop.version>3.1.4</hadoop.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-client</artifactId>
      <version>${hadoop.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-hdfs</artifactId>
      <version>${hadoop.version}</version>
    </dependency>
  </dependencies>
</project>

3、编写Mapper阶段的计算逻辑

package com.kang.wc;

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

/**
 * 单词计数的MapTask的计算逻辑
 * 1、继承Mapper类。同时需要指定四个泛型 两两一组 分别 代表输入的key value 和输出的key value的数据类型
 *      默认情况下,map阶段读取文件数据是以每一行的偏移量为key 整数类型 每一行的数据为value读取的 字符串类型
 *      map阶段输出以单词为key 字符串 以1为value输出 整数
 *      数据类型不能使用Java中的数据类型,数据类型必须是Hadoop的一种序列化类型
 *      Int —— hadoop.io.IntWritable
 *      Long —— hadoop.io.LongWritable
 *      String —— hadoop.io.Text
 * 2、重写map方法
 */
public class WCMapper extends Mapper<LongWritable, Text, Text, LongWritable> {
    /**
     * map方法就是MapTask的核心计算逻辑方法
     * map方法是切片中的一行数据调用一次
     * @param key   这一行数据的偏移量
     * @param value 这一行数据
     * @param context 上下文对象 用于输出map阶段处理完成的key value数据
     * @throws IOException
     * @throws InterruptedException
     */
    @Override
    protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, LongWritable>.Context context) throws IOException, InterruptedException {
        //拿到一行数据,并且将一行数据转成字符串类型
        String line = value.toString();
        //字符串以空格切割得到一个数组,数组中存放的就是一行的多个单词
        String[] words = line.split(" ");
        //遍历数组 得到每一个单词 以单词为key 以1为value输出数据即可
        for (String word : words) {
            context.write(new Text(word),new LongWritable(1L));
        }
    }
}

4、编写Reducer阶段的计算逻辑

package com.kang.wc;

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;

/**
 * Reduce的编程逻辑:
 * 1、继承Reducer类,指定输入和输出的kv类型
 *      输入KV就是Map阶段的输出KV Text LongWritable
 *      输出kv  Text LongWritable
 * 2、重写reduce方法
 */
public class WCReducer extends Reducer<Text, LongWritable,Text,LongWritable> {
    /**
     * Reduce方法是Reduce阶段的核心计算逻辑
     * reduce方法是一组相同的key执行一次
     * @param key      一组相同的key  某一个单词
     * @param values   是一个集合,集合存放的就是这一个单词的所有的value值
     * @param context  上下文对象 用于reduce阶段输出数据
     * @throws IOException
     * @throws InterruptedException
     */
    @Override
    protected void reduce(Text key, Iterable<LongWritable> values, Reducer<Text, LongWritable, Text, LongWritable>.Context context) throws IOException, InterruptedException {
        //只需要将某个单词聚合起来的value数据累加起来 得到总次数
        long sum = 0L;
        for (LongWritable value : values) {
            sum += value.get();
        }
        //只需要以单词为key 以sum为value输出即可
        context.write(key,new LongWritable(sum));
    }
}

5、编写Driver驱动程序

package com.kang.wc;

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;

/**
 * Driver驱动程序说白了就是封装MR程序的
 * Driver驱动程序其实就是一个main函数
 */
public class WCDriver {
    public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
        //1、准备一个配置文件对象Configuration
        Configuration conf = new Configuration();
        //指定HDFS的地址
        conf.set("fs.defaultFS","hdfs://192.168.31.104:9000");
        //2、创建封装MR程序使用一个Job对象
        Job job = Job.getInstance(conf);
        //3、封装处理的文件路径hdfs://single:9000/wc.txt
        FileInputFormat.setInputPaths(job,new Path("/wc.txt"));
        //4、封装MR程序的Mapper阶段,还要封装Mapper阶段输出的key-value类型
        job.setMapperClass(WCMapper.class);
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(LongWritable.class);
        //5、封装MR程序的Reducer阶段,还要封装reduce的输出kv类型
        job.setReducerClass(WCReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setMapOutputValueClass(LongWritable.class);
        job.setNumReduceTasks(1);//指定reduce阶段只有一个ReduceTask
        //6、封装MR程序的输出路径 —— 输出路径一定不能存在  如果存在会报错
        FileOutputFormat.setOutputPath(job,new Path("/wcoutput"));
        //7、提交运行MR程序
        boolean flag = job.waitForCompletion(true);
        System.exit(flag?0:1);
    }
}

Hadoop的第二个核心组件:MapReduce框架第一节,Hadoop,hadoop,mapreduce,大数据

Hadoop的第二个核心组件:MapReduce框架第一节,Hadoop,hadoop,mapreduce,大数据

Hadoop的第二个核心组件:MapReduce框架第一节,Hadoop,hadoop,mapreduce,大数据文章来源地址https://www.toymoban.com/news/detail-697294.html

到了这里,关于Hadoop的第二个核心组件:MapReduce框架第一节的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 面向对象的第二个基本特征:继承011026

    生活中:         继承 --- 延续                 --- 扩展 代码中:         继承 --- 重复使用已有的类的代码(复用)                 --- 扩展已有类的代码(扩展) ① 代码的复用和扩展 ② 满足is - a 的关系 事物的分类来说,子类别的关系 Student is a Person. Teacher is a Pe

    2024年02月05日
    浏览(50)
  • 分布式计算框架Hadoop核心组件

    Hadoop作为成熟的分布式计算框架在大数据生态领域已经使用多年,本文简要介绍Hadoop的核心组件MapReduce、YARN和HDFS,以加深了解。 1、Hadoop基本介绍 Hadoop是分布式计算框架,主要解决海量数据的存储和计算问题。Hadoop主要组件包括分布式文件系统HDFS、分布式离线并行计算框架

    2024年02月06日
    浏览(41)
  • 大数据框架之Hadoop:MapReduce(三)MapReduce框架原理——MapTask工作机制

    MapTask工作机制如下图所示。 (1)Read阶段:MapTask通过用户编写的RecordReader,从输入InputSplit中解析出一个个key/value。 (2)Map阶段:该节点主要是将解析出的key/value交给用户编写map()函数处理,并产生一系列新的key/value。 (3)Collect收集阶段:在用户编写map()函数中,当数据处

    2023年04月08日
    浏览(65)
  • Hadoop三大框架之MapReduce工作流程

    MapReduce的思想核心是“分而治之”,适用于大量复杂的任务处理场景(大规模数据处理场景)。 Map负责“分”,把复杂的任务分解为若干个“简单的任务”来并行处理。可以进行拆分的前提是这些小任务可以并行计算,彼此间几乎没有依赖关系。 Reduce负责“合”,即对map阶

    2024年02月02日
    浏览(44)
  • Hadoop的第三大组成:YARN框架

    YARN是一个分布式资源调度系统,专门用来给分布式计算程序提供计算资源的,而且YARN只负责进行资源的提供,不管计算程序的逻辑,因此YARN这个软件非常的成功,因为YARN不关注程序计算逻辑,因此只要是分布式计算程序,只要满足YARN的运行要求,那么就可以在YARN上进行运

    2024年02月09日
    浏览(42)
  • Hadoop入门学习笔记——四、MapReduce的框架配置和YARN的部署

    视频课程地址:https://www.bilibili.com/video/BV1WY4y197g7 课程资料链接:https://pan.baidu.com/s/15KpnWeKpvExpKmOC8xjmtQ?pwd=5ay8 Hadoop入门学习笔记(汇总) 本次YARN的部署结构如下图所示: 当前,共有三台服务器(虚拟机)构成集群,集群规划如下所示: 主机 部署的服务 node1 ResourceManager、N

    2024年02月04日
    浏览(46)
  • 年轻人的第一款单元测试框架———vitest

    一款合格的开源项目是避免不了单元测试的,这也是这几年单元测试的热度居高不下的原因。而在今年的 state of js 2022 中,我们可以看见在 代码库层级列表 中, vitest 飞升一跃,直接到了第二名,仅次于同门师兄弟 vite ,而 element plus unocss 等知名开源项目都采用了vitest进行单

    2024年01月17日
    浏览(44)
  • Hadoop核心组件及组件介绍

    1、Hadoop通用组件 -  Hadoop Common 包含了其他hadoop模块要用到的库文件和工具 2、分布式文件系统 - Hadoop Distributed File System (HDFS) 运行于通用硬件上的分布式文件系统,高吞吐,高可靠 3、资源管理组件 - Hadoop YARN 于2012年引入的组件,用于管理集群中的计算资源并在这些资源上

    2024年02月05日
    浏览(49)
  • 【大数据开发 Spark】第一篇:Spark 简介、Spark 的核心组成(5大模块)、Spark 的主要特征(4大特征)、Spark 对比 MapReduce

    初步了解一项技术,最好的方式就是去它的官网首页,一般首页都会有十分官方且准确的介绍,学习 Spark 也不例外, 官方介绍:Apache Spark ™是一种多语言引擎,用于在单节点机器或集群上执行数据工程、数据科学和机器学习。 我们可以得知,Spark 可以单节点运行,也可以搭

    2024年02月05日
    浏览(47)
  • 金字塔的思维--思考的第一步就是先提炼出一个基本框架

            如果以哲学的眼光来看待这一切,那么可以说每一件事情都包含在其他事物之间,包括我们的社会体系,包括整个自然界,万事万物都处于某一特定的体系当中。一辆行驶的汽车,一匹奔跑的骏马,一栋建筑,一个面包,你、我、他,所有的一切都从属于某一个大的

    2024年02月08日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包