【Hadoop】大數據技術之 MapReduce

目錄

一、MapReduce概述

1.1 MapReduce 定義

1.2?MapReduce優缺點

1.3?MapReduce 核心思想

1.4?MapReduce 進程

1.5?常用數據序列化類型

1.6?MapReduce 編程規范

二、WordCound 案例

2.1 環境準備

2.2?編寫程序

三、MapReduce?工作流程


一、MapReduce概述

1.1 MapReduce 定義

MapReduce是一個 分布式運算程序 的編程框架,是用戶開發“基于 Hadoop的數據分析
應用”的核心框架。
MapReduce核心功能是將 用戶編寫的業務邏輯代碼 和 自帶默認組件 整合成一個完整的
分布式運算程序 ,并發運行在一個 Hadoop集群上。

1.2?MapReduce優缺點

優點分析:

1. MapReduce易于編程:它簡單的實現一些接口,就可以完成一個分布式程序,這個分布式程序可以分布到大量廉價的 PC機器上運行。也就是說你寫一個分布式程序,跟寫一個簡單的串行程序是一模一樣的。就是因為這個特點使得 MapReduce編程變得非常流行。

2.?良好的擴展性:當你的計算資源不能得到滿足的時候,你可以通過簡單的增加機器 來擴展它的計算能力。

3.?高容錯性:MapReduce設計的初衷就是使程序能夠部署在廉價的 PC機器上,這就要求它具有很高的容錯性。比如 其中一臺機器掛了,它可以把上面的計算任務轉移到另外一個節點上運行,不至于這個任務運行失敗 ,而且這個過程不需要人工參與,而完全是由 Hadoop內部完成的。

4. 適合 PB級以上海量數據的離線處理:可以實現上千臺服務器集群并發工作,提供數據處理能力。

缺點分析:

1.?不擅長實時計算:MapReduce 無法像MySQL 一樣,在毫秒或者秒級內返回結果。

2.?不擅長流式計算:流式計算的輸入數據是動態的,而MapReduce 的輸入數據集是靜態的,不能動態變化。這是因為MapReduce 自身的設計特點決定了數據源必須是靜態的。

3.?不擅長DAG(有向無環圖)計算:多個應用程序存在依賴關系,后一個應用程序的輸入為前一個的輸出。在這種情況下,MapReduce 并不是不能做,而是使用后,每個MapReduce 作業的輸出結果都會寫入到磁盤,會造成大量的磁盤IO,導致性能非常的低下。

1.3?MapReduce 核心思想

(1)分布式的運算程序往往需要分成至少2 個階段。

(2)第一個階段的MapTask 并發實例,完全并行運行,互不相干。

(3)第二個階段的ReduceTask 并發實例互不相干,但是他們的數據依賴于上一個階段的所有MapTask 并發實例的輸出。

(4)MapReduce 編程模型只能包含一個Map 階段和一個Reduce 階段,如果用戶的業
務邏輯非常復雜,那就只能多個MapReduce 程序,串行運行。

1.4?MapReduce 進程

一個完整的MapReduce 程序在分布式運行時有三類實例進程:

(1)MrAppMaster:負責整個程序的過程調度及狀態協調。

(2)MapTask:負責Map 階段的整個數據處理流程。

(3)ReduceTask:負責Reduce 階段的整個數據處理流程。

1.5?常用數據序列化類型

1.6?MapReduce 編程規范

用戶編寫的程序分成三個部分:Mapper、Reducer 和Driver。

1.Mapper階段
(1)用戶自定義的Mapper要繼承自己的父類

(2)Mapper的輸入數據是KV對的形式(KV的類型可自定義)

(3)Mapper中的業務邏輯寫在map()方法中

(4)Mapper的輸出數據是KV對的形式(KV的類型可自定義)

(5)map()方法(MapTask進程)對每一個<K,V>調用一次

2.Reducer階段

(1)用戶自定義的Reducer要繼承自己的父類

(2)Reducer的輸入數據類型對應Mapper的輸出數據類型,也是KV

(3)Reducer的業務邏輯寫在reduce()方法中

(4)ReduceTask進程對每一組相同k的<k,v>組調用一次reduce()方法

3.Driver階段

相當于YARN集群的客戶端,用于提交我們整個程序到YARN集群,提交的是封裝了MapReduce程序相關運行參數的job對象

二、WordCound 案例

需求分析:在給定的文本文件中統計輸出每一個單詞出現的總次數。按照MapReduce 編程規范,分別編寫Mapper,Reducer,Driver。

2.1 環境準備

第一步:創建maven 工程,MapReduceDemo

第二步:在pom.xml 文件中添加如下依賴

<dependencies><dependency><groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.1.3</version>
</dependency>
<dependency><groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency><groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.30</version>
</dependency>
</dependencies>

第三步:在項目的src/main/resources 目錄下,新建一個文件,命名為“log4j.properties”,在
文件中填入。

log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

2.2?編寫程序

第一步:編寫 Mapper類

public class Word C ountMapper extends Mapper < LongWritable, Text, Text,IntWritable > {Text k = new Text();IntWritable v = new IntWritable(1);@Overrideprotected void map(LongWritable key, Text value, Context context)throws IOException,InterruptedException {// 1 獲取一行String line = value.toString();// 2 切割String[] words = line.spli t(" ");// 3 輸出for (String word: words) {k.set(word);context.write(k, v);}}}

第二步:編寫 Reducer類

public class WordCountReducer extends Reducer < Text, IntWritable, Text,IntWritable > {int sum;IntWritable v = new IntWritable();@Overrideprotected void reduce(Text key, Iterable < IntWritable > values, Context context) throws IOException,InterruptedException {// 1 累加求和sum = 0;for (IntWritable count: values) {sum += count.get();// 2 輸出v.set(sum);context.write(key, v);}}

第三步:編寫 Driver驅動類

public static void main(String[] args) throws I OException,ClassNotFoundException, InterruptedException {// 1 獲取配置信息以及 獲取 job 對象Configuration conf = new Configuration();Job job = Job.getInstance(conf);// 2 關聯本 Driver 程序的 jarjob.setJarByClass(Word C ountDriver.class);// 3 關聯 Mapper 和 Reducer 的 jarjob.setMapperClass(Word C ountMapper.class);job.setReducerClass(Word C ountReducer.class);// 4 設置 Mapper 輸出的 kv 類型job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(IntWritable.class);// 5 設置最終輸出 kv 類型job.setOutputKeyCl ass(Text.class);job.setOutputValueClass(IntWritable.class);// 6 設置輸入和輸出路徑FileInputFormat.setInputPaths(job, new Path(args[0]));FileOutputFormat.setOutputPath(job, new Path(args[1]));// 7 提交 jobboolean result = job.waitForCompletion(tru e);System.exit(result ? 0 : 1);}
}

三、MapReduce?工作流程

(1)MapTask 收集我們的map()方法輸出的kv 對,放到內存緩沖區中

(2)從內存緩沖區不斷溢出本地磁盤文件,可能會溢出多個文件

(3)多個溢出文件會被合并成大的溢出文件

(4)在溢出過程及合并的過程中,都要調用Partitioner 進行分區和針對key 進行排序

(5)ReduceTask 根據自己的分區號,去各個MapTask 機器上取相應的結果分區數據

(6)ReduceTask 會抓取到同一個分區的來自不同MapTask 的結果文件,ReduceTask 會將這些文件再進行合并(歸并排序)

(7)合并成大文件后,Shuffle 的過程也就結束了,后面進入ReduceTask 的邏輯運算過程(從文件中取出一個一個的鍵值對Group,調用用戶自定義的reduce()方法)

Shuffle 機制:Map 方法之后,Reduce 方法之前的數據處理過程稱之為Shuffle。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/81168.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/81168.shtml
英文地址,請注明出處:http://en.pswp.cn/web/81168.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

國際前沿知識系列三:解決泛化能力不足問題

目錄 國際前沿知識系列三&#xff1a;解決泛化能力不足問題 一、子類建模法與分類建模法在腦區應變預測中的應用 &#xff08;一&#xff09;子類建模法 案例分析 &#xff08;二&#xff09;分類建模法 案例分析 二、基于遷移學習和數據融合的大腦應變預測模型改良 &a…

client.chat.completions.create方法參數詳解

response client.chat.completions.create(model"gpt-3.5-turbo", # 必需參數messages[], # 必需參數temperature1.0, # 可選參數max_tokensNone, # 可選參數top_p1.0, # 可選參數frequency_penalty0.0, # 可選參數presenc…

iOS 15.4.1 TrollStore(巨魔商店)安裝教程詳解:第二篇

?? iOS 15.4.1 TrollStore(巨魔商店)安裝教程詳解 ? 前言??? 如何安裝 TrollStore?第一步:打開 Safari 瀏覽器第二步:選擇對應系統版本安裝方式第三步:訪問地址,下載配置文件(plist)第四步:安裝配置文件第五步:“jailbreaks.app” 請求安裝 TrollHelper第六步…

SQL的RAND用法和指定生成隨機數的范圍

SQL中的RAND函數能夠滿足多種隨機數生成的需求。通過合理地使用種子、結合一些SQL語句&#xff0c;我們可以實現靈活的隨機數生成。在數據填充、數據處理、數據分析中經常需要用RAND生成的隨機數。 用法1 生成隨機浮點數&#xff0c;其返回值在0&#xff08;包括0&#xff09;…

AppAgentx 開源AI手機操控使用分享

項目地址: https://appagentx.github.io/?utm_sourceai-bot.cn GitHub倉庫: https://github.com/Westlake-AGI-Lab/AppAgentX/tree/main arXiv技術論文:https://arxiv.org/pdf/2503.02268 AppAgentx是什么: AppAgentX 是西湖大學推出的一種自我進化式 GUI 代理框架。它通過…

[原創]X86C++反匯編01.IDA和提取簽名

https://bpsend.net/thread-415-1-1.html 用VC6.0新建一個控制臺工程 編譯成 debug 和 Release 2個版本 應ida分別查看2種版本的程序 高版本ida 可能會直接定位到函數入口,正常情況下,我們需要先調試找到關鍵,找到關鍵以后點再通過調試設置api斷點,讀寫斷點等,找到程序的關鍵…

vs2022 Qt Visual Studio Tools插件設置

安裝之后&#xff0c;需要指定QT中msvc編譯器的位置&#xff0c;點擊下圖Location右邊的按鈕即可 選擇msvc2022_64\bin目錄下的 qmake.exe 另一個問題,雙擊UI文件不能打開設計界面 設置打開方式 選擇msvc2022_64\bin目錄下的designer.exe 確定即可 然后設置為默認值即可 確定…

C++代碼隨想錄刷題知識分享-----兩數之和(哈希表)三種算法逐個擊破

題目描述 給定一個整數數組 nums 和一個目標值 target&#xff0c;請你在該數組中找出和為目標值的那兩個整數&#xff0c;并返回它們的下標。 每個輸入只對應一個答案。同一個元素不能重復使用。你可以按任意順序返回答案。 示例 輸入&#xff1a; nums [2, 7, 11, 15], ta…

List介紹

什么是List 在集合框架中&#xff0c;List是一個接口&#xff0c;繼承自Collection Collection也是一個接口&#xff0c;該接口中規范了后序容器中常用的一些方法 Iterable也是一個接口&#xff0c;表示實現該接口的類是可以逐個元素進行遍歷的&#xff0c;具體如下&#xff1…

深入理解API:從概念到實戰

引言 在現代軟件開發中&#xff0c;API&#xff08;Application Programming Interface&#xff09;無處不在。無論是調用第三方服務、訪問操作系統功能&#xff0c;還是使用編程語言的標準庫&#xff0c;API 都扮演著關鍵角色。但對于許多初學者來說&#xff0c;API 仍然是一…

織夢dedecms登錄后臺出現Safe Alert Request Error step 2

今天一個客戶在安裝織夢dedecms時候&#xff0c;安裝完成后登錄后臺就出現“Safe Alert Request Error step 2”&#xff0c;常用dedecms的朋友都知道&#xff0c;這是織夢的安全機制&#xff0c;在程序覺得有sql注入等攻擊時候&#xff0c;會有這種提示。 1、起初我以為是文件…

BLIP3-o:理解和生成統一的多模態模型

文章目錄 研究背景BLIP3-o 框架3個關鍵問題BLIP3-o模型總結 paper link: https://arxiv.org/pdf/2505.09568from saleforce research 研究背景 隨著gpt4o圖像生成和編輯的應用火爆&#xff0c;如何構造能夠同時處理圖像理解和生成任務的統一多模態模型&#xff0c;成為研究的…

練習小項目7:天氣狀態切換器

&#x1f9e0; 項目目標&#xff1a; 點擊按鈕切換不同天氣狀態&#xff0c;背景或圖標隨之變化。 ? 功能描述&#xff1a; 顯示當前天氣&#xff08;如&#xff1a;?? 晴天 / ?? 多云 / &#x1f327;? 雨天&#xff09; 點擊“切換天氣”按鈕&#xff0c;每點擊一次…

esp32 lvgl9.2版本,透明底色圖片的,透明部分被渲染成黑色,不隨背景顏色變化解決辦法

在lvgl圖片轉換工具時&#xff0c;指定轉換格式為ARGB8888 代指Alpha RGB RGB565&#xff08;不支持 Alpha&#xff09;&#xff0c;透明像素會被解釋為黑色。改用 ARGB8888。 有問題的 轉換為ARGB8888后的

AI智能分析網關V4區域入侵檢測算法:全功能覆蓋,多場景守護安防安全

一、方案背景? 在當今社會&#xff0c;安全需求日益增長&#xff0c;傳統安防監控系統因效率低、精準度不足等問題&#xff0c;已無法滿足現代安全防范的要求。AI智能分析網關V4區域入侵檢測算法憑借其先進的人工智能技術&#xff0c;能夠實時、精準地識別區域內的異常入侵行…

Phantom 視頻生成的流程

Phantom 視頻生成的流程 flyfish Phantom 視頻生成的實踐 Phantom 視頻生成的流程 Phantom 視頻生成的命令 Wan2.1 圖生視頻 支持批量生成 Wan2.1 文生視頻 支持批量生成、參數化配置和多語言提示詞管理 Wan2.1 加速推理方法 Wan2.1 通過首尾幀生成視頻 AnyText2 在圖片里玩…

瑞薩單片機筆記

1.CS for CC map文件中顯示變量地址 Link Option->List->Output Symbol information 2.FDL庫函數 pfdl_status_t R_FDL_Write(pfdl_u16 index, __near pfdl_u08* buffer, pfdl_u16 bytecount) pfdl_status_t R_FDL_Read(pfdl_u16 index, __near pfdl_u08* buffer, pfdl_…

uniapp+ts 多環境編譯

1. 創建項目 npx degit dcloudio/uni-preset-vue#vite-ts [項目名稱] 2.創建env目錄 多環境配置文件命名為.env.別名 添加index.d.ts interface ImportMetaEnv{readonly VITE_ENV:string,readonly UNI_PLATFORM:string,readonly VITE_APPID:string,readonly VITE_NAME:stri…

英語學習5.24

make informed decisions 表示“做出明智的決定”&#xff0c;是一個常用的固定搭配&#xff0c;常用于議論文中。 …to make informed decisions. 為了做出明智的決定&#xff08;表示目的的動詞不定式&#xff09;。 We need accurate data to make informed decisions. Ci…

【Qt】QImage::Format

QImage::Format 是 Qt 中用于指定圖像像素數據格式的枚舉類型。它決定了圖像如何存儲顏色信息和透明度&#xff08;如果有&#xff09;。選擇合適的 Format 對性能、內存占用以及是否支持某些特性&#xff08;如透明通道&#xff09;有重要影響。 常見的 QImage::Format 枚舉值…