【MapReducer】

MapReduce是基于HDFS的分布式并行编程模型,通过分而治之的思想,将大规模数据集划分为多个小数据块进行处理。Map阶段通过map函数处理输入数据,Reduce阶段则通过reduce函数聚合结果。在Map阶段,数据在节点本地处理以减少网络传输成本,而在Reduce阶段,数据经过shuffle阶段重新组织,便于进一步处理。MapReduce提供了多种测试和运行方式,包括本地运行和集群运行。此外,输入数据被划分为等长的分片,每个分片对应一个map任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MapReducer

MapReducer简介

MapReduce是对google提出的分布式并行编程模型MapReduce论文的开源实现,以可靠,容错的方式运行在反不是文件系统HDFS上的并行处理数据的编程模型。MapReduce的优势在于处理大规模数据集。
MapReduce框架由单个主ResourceManager,每个集群节点一个nodeManager和每个应用程序的MRAppMaster组成。

MapReducer的核心思想

分而治之,移动计算、不移动数据
MapReducer的设计理念是:计算向数据靠拢(移动计算),而不是数据向着计算靠拢(移动数据);因为移动数据需要大量的网络传输开销,尤其是在大规模数据环境下,这种开销尤为惊人,所以移动计算要比移动数据更加经济。

在一个集群中,只要有可能,MapReduce框架就会将Map程序就近的在HDFS数据所在的节点上运行,即将计算和存储放在一个节点上,从而减少节点之间数据移动的开销。正因为这样,MapReduce可以并行的进行处理,解决计算效率问题。

MapReduce任务过程分为两个阶段:map阶段和reduce阶段,每一个阶段都是以键值对作为输入和输出,其类型认为设定,在每个阶段都需要写一个函数,分别为map函数和reduce函数。

在执行MapReduce任务时,一个大规模的数据集会被划分成许多的独立等长的小数据块,称之为输入分片,简称分片。Hadoop的每一个输入分片分别构建一个map任务,并由该任务来运行用户自定义的map函数,从而处理分片中的每条记录,map任务处理后的数据,会继续作为reduce任务的输入,最终由reduce任务输出最终的结果,并写入分布式文件系统。

在MapReduce中存在数据的扭转:
数据扭转之Map阶段:
MapReduce程序分为两个阶段,第一个阶段为Map阶段,该阶段中有一个map函数,map函数的输入是一个<key,value>对,map函数的输出也是一个<key,value>对,他们的类型可以不同,参考下图:
在这里插入图片描述
数据扭转之Reduce阶段:
MapReduce的第二个阶段是Reduce阶段,该阶段的编程模型中,有一个reduce函数reduce函数的输入是一个<key,value>对,reduce函数的输出也是<key,value>对,这里需要注意的是,map阶段的输出作为了reduce阶段的输入,只不过map阶段的输出经过shuffle技术后变成了<key,List>,如下图所示:
在这里插入图片描述
MapReduce之WorldCount简要流程图如下:
在这里插入图片描述

1、MapReduce默认的情况下,一行数据对应一条记录,即读到"\n\r"才会认为这一条记录结束。
2、每条记录会被解析成<k1,v1>的形式,其中k1是行的偏移量,v1是行数据。
3、k1没用,我们不需要,我们只需要将v1截取成一个个的单词,分别设置为k2,v2设置为1。
4、经过shuffle技术后,转成每个单词作为k2,v2是1的集合,即List<v2>。
5、我们在reduce函数内,将List<v2>中多个1进行累加,再将k2当作k3,累加和作为V3写出去,即为<k3,v3>。

MapReduce之代码实现WordCount

Map
package com.cxl.mapReduce;

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;

public class MyMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
   
    @Override

    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
   
        String[] words = value.toString().split(" ");
        for(String i : words){
   
            String word = i;
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值