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
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81230.shtml
英文地址,請注明出處:http://en.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…