MapReduce 实现 WordCount

在大数据处理领域,MapReduce 是一种极为重要的编程模型,它可以将大规模的数据处理任务分解为多个并行的子任务,从而高效地处理海量数据。WordCount(词频统计)是 MapReduce 中最经典的示例之一,通过它能很好地理解 MapReduce 的工作原理。下面我们就来深入探讨如何使用 MapReduce 实现 WordCount。

一、MapReduce 简介

MapReduce 由 Google 提出,后来被开源实现并广泛应用于大数据框架(如 Hadoop)中。它主要由两个阶段组成:Map 阶段和 Reduce 阶段。

  • Map 阶段:负责将输入数据进行拆分,然后对每个数据片段执行用户定义的 Map 函数,生成一系列的中间键值对。
  • Reduce 阶段:将 Map 阶段产生的具有相同键的中间值进行聚合处理,执行用户定义的 Reduce 函数,最终得到处理结果。

二、WordCount 问题描述

WordCount 的目标很简单,就是统计给定文本中每个单词出现的次数。例如,对于文本 “hello world hello mapreduce mapreduce”,经过 WordCount 处理后,我们期望得到 “hello: 2, world: 1, mapreduce: 2” 这样的结果。

三、MapReduce 实现 WordCount 的原理

(一)Map 阶段

  1. 输入数据:首先,MapReduce 框架会将输入的文本文件按照一定的规则(比如按行)进行拆分,每一行作为一个输入记录。
  2. Map 函数:在 Map 函数中,我们对每一行文本进行处理。具体来说,就是将这一行文本按空格等分隔符拆分成单词,然后为每个单词生成一个键值对,键为单词本身,值为 1,表示这个单词出现了一次。例如,对于输入行 “hello world”,Map 函数会输出 [("hello", 1), ("world", 1)]。

(二)Shuffle 阶段

在 Map 阶段之后,会有一个 Shuffle 过程。这个过程主要负责将 Map 函数输出的键值对进行分区、排序和合并。分区是将具有相同键的键值对发送到同一个 Reduce 任务中;排序是对每个分区内的键值对按照键进行排序;合并是将相同键的值进行合并,减少数据传输量。

(三)Reduce 阶段

  1. Reduce 函数:在 Reduce 函数中,对于每个键(即单词),它会接收到该键对应的所有值(也就是在 Map 阶段统计的出现次数)。然后,Reduce 函数将这些值进行累加,得到这个单词在整个文本中出现的总次数。例如,对于键 “hello”,接收到的值为 [1, 1],经过 Reduce 函数累加后,得到 “hello: 2”。
  2. 输出结果:最后,Reduce 函数将统计好的键值对输出,这些输出就是我们想要的每个单词及其出现次数。

四、用 Java 代码实现 WordCount(以 Hadoop 为例)

(一)Map 类

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;public class WordCountMapper extends Mapper<Object, Text, Text, IntWritable>{private final static IntWritable one = new IntWritable(1);private Text word = new Text();public void map(Object key, Text value, Context context) throws IOException, InterruptedException {String line = value.toString();String[] words = line.split(" ");for (String w : words) {word.set(w);context.write(word, one);}}
}

(二)Reduce 类

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;public class WordCountReducer extends Reducer<Text,IntWritable,Text,IntWritable> {private IntWritable result = new IntWritable();public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {int sum = 0;for (IntWritable val : values) {sum += val.get();}result.set(sum);context.write(key, result);}
}

(三)主类(用于提交作业)

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;public class WordCountDriver {public static void main(String[] args) throws Exception {Configuration conf = new Configuration();Job job = Job.getInstance(conf, "word count");job.setJarByClass(WordCountDriver.class);job.setMapperClass(WordCountMapper.class);job.setCombinerClass(WordCountReducer.class);job.setReducerClass(WordCountReducer.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);FileInputFormat.addInputPath(job, new Path(args[0]));FileOutputFormat.setOutputPath(job, new Path(args[1]));System.exit(job.waitForCompletion(true)? 0 : 1);}
}

五、运行与测试

  1. 准备数据:创建一个文本文件,在里面输入一些文本内容作为测试数据。
  2. 打包代码:将上述 Java 代码打包成可执行的 JAR 包。
  3. 提交作业:在 Hadoop 集群环境下,使用命令hadoop jar wordcount.jar WordCountDriver input_path output_path来提交作业,其中input_path是输入文件路径,output_path是输出结果路径。
  4. 查看结果:作业运行完成后,可以到指定的输出路径查看生成的词频统计结果文件。

六、总结

通过 WordCount 这个经典实例,我们深入了解了 MapReduce 编程模型的工作原理和实现方式。它为大数据处理提供了一种高效、并行的思路,在实际应用中,类似的思想可以扩展到更复杂的数据分析和处理场景中。掌握 MapReduce 的基本原理和应用,对于在大数据领域的进一步学习和实践具有重要意义。

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

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

相关文章

GelSight Mobile 4.1 软件更新推出先进测量工具与报告功能

GelSight Mobile 4.1 软件完成版本更新&#xff0c;为表面分析领域带来重要功能升级。此次更新围绕测量工具与报告功能优化&#xff0c;助力用户更高效地量化材料表面特征&#xff0c;减少现场测量时间&#xff0c;优化生产流程。 新型测量工具&#xff0c;增强复杂曲面分析能力…

base64加密为何可以直接找三方网站解密

你问得非常关键&#xff1a;**Base64 为什么“加密”后还能被网上轻松“解密”&#xff1f;**这是一个很多人容易误解的点&#xff0c;下面我来用通俗的语言帮你彻底搞懂。 ✅ 1. Base64 根本不是加密算法 Base64 只是“编码&#xff08;Encoding&#xff09;”&#xff0c;不是…

IP地址、端口、TCP介绍、socket介绍、程序中socket管理

1、IP地址&#xff1a;IP 地址就是 标识网络中设备的一个地址&#xff0c;好比现实生活中的家庭地址。IP 地址的作用是 标识网络中唯一的一台设备的&#xff0c;也就是说通过IP地址能够找到网络中某台设备。 2、端口&#xff1a;代表不同的进程,如下图&#xff1a; 3、socket:…

【计算机网络】HTTP/1.0,HTTP/1.1,HTTP/2,HTTP/3汇总讲解,清晰表格整理面试重点对比

表格汇总 对比维度HTTP/1.0HTTP/1.1HTTP/2HTTP/3传输协议TCPTCPTCP/TLS&#xff08;默认加密&#xff09;UDP&#xff08;基于 QUIC 协议&#xff09;连接方式短连接&#xff08;每次请求/响应后断开&#xff09;引入持久连接&#xff08;Persistent Connection&#xff09;&a…

LLaMA-Factory微调大模型Qwen2.5

1、开始ModelScope社区GPU环境 训练或微调模型都是非常耗费算力的。如果电脑的配置不高,可使用一些云服务器来做这项工作。如ModelScope(魔搭)社区的GPU环境,目前提供36小时免费运算,足够微调一个大模型了。 注册ModelScope(魔搭)社区账号(可能还要注册或认证阿里云账号)…

Python 3.13.3 安装教程

原文来自&#xff1a;Python 3.13.3 安装教程 | w3cschool笔记 &#xff08;请勿标记为付费&#xff01;&#xff01;&#xff01;&#xff09; Python 是一种广泛使用的编程语言&#xff0c;广泛应用于 Web 开发、科学计算、数据处理、人工智能等领域。Python 3.13.3 作为 P…

sqli-labs靶场29-31关(http参数污染)

目录 前言 less29&#xff08;单引号http参数污染&#xff09; less30&#xff08;双引号http参数污染&#xff09; less31(双引号括号http参数污染) 前言 在JSP中&#xff0c;使用request.getParameter("id")获取请求参数时&#xff0c;如果存在多个同名参数&a…

npm cross-env工具包介绍(跨平台环境变量设置工具)

文章目录 cross-env&#xff1a;跨平台环境变量设置工具什么是cross-env&#xff1f;为什么需要cross-env&#xff1f;平台差异带来的问题 cross-env的工作原理核心功能技术实现 安装与基本使用安装步骤基本使用方法运行效果 高级使用技巧设置多个环境变量环境变量传递与链式命…

mac docker弹窗提示Docker 启动没有响应

一、原因分析 这台笔记电脑是Mac M3操作系统,安装Docker之后,Docker应用程序一直启动不起来。 二、解决办法 sudo rm /Library/PrivilegedHelperTools/com.docker.vmnetd sudo cp /Applications/Docker.app/Contents/Library/LaunchServices/com.docker.vmnetd /Library/Pri…

Golang基础知识—cond

cond 通常指 sync.Cond&#xff0c;它是标准库 sync 包中用于实现 条件变量 的同步原语。条件变量在多 goroutine 协作场景中非常有用&#xff0c;尤其在需要根据特定条件协调多个 goroutine 的执行顺序时。 sync.Cond 的核心作用 条件变量用于 等待某个条件满足 或 通知其他等…

MySQL 8.0 OCP 1Z0-908 题目解析(1)

题目001 Choose two. User fwuserlocalhost is registered with the SQL Enterprise Firewall and has been granted privileges for the sakila database. Examine these commands that you executed and the results: mysql> SELECT MODE FROM INFORMATION_SCHEMA.SQL…

【Tools】git使用详解以及遇到问题汇总

这里写目录标题 安装git安装 TortoiseGitgit github gitlab, Gitee 区别visual studio中使用gitgit使用步骤git命令git删除某些历史提交记录git找回丢失代码git上传文本和二进制和gitignore删除文件删不掉的问题 安装git https://blog.csdn.net/mukes/article/details/1156938…

画立方体软件开发笔记 js-pytorch xlsx 导出 excel pnpm安装

js-pytorch npm install -g pnpm pnpm add js-pytorch 放着&#xff0c;等我把模型训练好了再用这个对接 xlsx pnpm install xlsx ai写代码&#xff0c;一遍就通了 import * as XLSX from "xlsx"; import { linelist } from ./2dviewport.js; function export…

Kotlin并发请求的一些知识记录

private suspend fun fetchDataConcurrently(list: MutableList<MyType>,onRequestResult: (Int, List<MyType>?) -> Unit //高阶函数回调) {val deferredList mutableListOf<Deferred<MyType?>>()// 设定任务超时时间为12秒&#xff0c;并使用 …

配置VScodePython环境Python was not found;

Python was not found; run without arguments to install from the Microsoft Store, or disable this shortcut from Settings > Manage App Execution Aliases. 候试试重启电脑。 在卸载重装python后会出现难以解决的局面&#xff0c;系统变量&#xff0c;命令行&#…

OracleLinux7.9-ssh问题

有套rac环境&#xff0c;db1主机无法ssh db1和db1-priv&#xff0c;可以ssh登录 db2和db2-priv [rootdb1 ~]# ssh db1 ^C [rootdb1 ~]# ssh db2 Last login: Wed May 14 18:25:19 2025 from db2 [rootdb2 ~]# ssh db2 Last login: Wed May 14 18:25:35 2025 from db1 [rootdb2…

如何创建maven项目

1.IDEA 中创建 Maven 项目 步骤一&#xff1a;点击 File -> New -> Project&#xff0c;在弹出的窗口左侧选择 Maven&#xff0c;点击 Next&#xff1a; 步骤二&#xff1a;填写项目的 GroupId、ArtifactId、Version 等信息&#xff08;这些对应 pom.xml 中的关键配置&am…

Python爬虫实战:研究ajax异步渲染加密

一、引言 在当今数字化时代,数据已成为推动各行业发展的核心驱动力。网络爬虫作为一种高效的数据采集工具,能够从互联网上自动获取大量有价值的信息。然而,随着 Web 技术的不断发展,越来越多的网站采用了 AJAX(Asynchronous JavaScript and XML)异步渲染技术来提升用户体…

沪深股指期货指数怎么参考交易?

沪深股指期货指数&#xff0c;其实它就是咱们炒股时的一个“风向标”和“工具箱”。今天咱们就来聊聊怎么参考这个指数来交易&#xff0c;让你也能轻松上手&#xff01; 一、沪深股指期货指数是啥&#xff1f; 沪深股指期货指数&#xff0c;简单来说&#xff0c;就是基于沪深…

演员评论家算法

一、演员评论家算法核心思想和原理 演员(actor)代表策略&#xff0c;评论家代表价值函数。演员评论家算法是基于价值和策略的综合性方法。具体来说该算法使用了策略梯度和时序差分方法&#xff0c;是二者的一种有机结合。 1. 主要思想 策略梯度算法以轨迹为单位更新&#xf…