大數據之MapReduce詳解(MR的運行機制及配合WordCount實例來說明運行機制)

  • 目錄
    • 前言:
    • 1、MapReduce原理
    • 2、mapreduce實踐(WordCount實例)

目錄

今天先總體說下MapReduce的相關知識,后續將會詳細說明對應的shuffle、mr與yarn的聯系、以及mr的join操作的等知識。以下內容全是個人學習后的見解,如有遺漏或不足請大家多多指教。

前言:

為什么要MAPREDUCE
(1)海量數據在單機上處理因為硬件資源限制,無法勝任
(2)而一旦將單機版程序擴展到集群來分布式運行,將極大增加程序的復雜度和開發難度
(3)引入mapreduce框架后,開發人員可以將絕大部分工作集中在業務邏輯的開發上,而將分布式計算中的復雜性交由框架來處理。

設想一個海量數據場景下的wordcount需求:
單機版:內存受限,磁盤受限,運算能力受限分布式:
1、文件分布式存儲(HDFS)
2、運算邏輯需要至少分成2個階段(一個階段獨立并發,一個階段匯聚)
3、運算程序如何分發
4、程序如何分配運算任務(切片)
5、兩階段的程序如何啟動?如何協調?
6、整個程序運行過程中的監控?容錯?重試?

可見在程序由單機版擴成分布式時,會引入大量的復雜工作。為了提高開發效率,可以將分布式程序中的公共功能封裝成框架,讓開發人員可以將精力集中于業務邏輯。

而mapreduce就是這樣一個分布式程序的通用框架,其應對以上問題的整體結構如下:
1、MRAppMaster(mapreduce application master)
2、MapTask
3、ReduceTask

1、MapReduce原理

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

Mapreduce框架結構及核心運行機制
1.1、結構
一個完整的mapreduce程序在分布式運行時有三類實例進程 :
1、MRAppMaster:負責整個程序的過程調度及狀態協調
2、mapTask:負責map階段的整個數據處理流程
3、ReduceTask:負責reduce階段的整個數據處理流程
1.2、mapreduce框架的設計思想
這里寫圖片描述
這里面有兩個任務的分配過程:1、總的任務切割分配給各個mapTask,不同的mapTask再將得到的hashmap按照首字母劃分,分配給各個reduceTask。

1.3、mapreduce程序運行的整體流程(wordcount運行過程的解析)
這里寫圖片描述
流程解析
(job.split:負責任務的切分,形成一個任務切片規劃文件。
wc.jar:要運行的jar包,包含mapper、reducer、Driver等java類。
job.xml:job的其他配置信息:如指定map是哪個類,reduce是那個類,以及輸入數據的路徑在哪,輸出數據的路徑在哪等配置信息。)
前提:客戶端提交任務給yarn后(提交前會進行任務的規劃),yarn利用ResouceManager去找到mrAppmaster.
1、 一個mr程序啟動的時候,最先啟動的是MRAppMaster,MRAppMaster啟動后根據本次job的描述信息,計算出需要的maptask實例數量,然后向集群申請機器啟動相應數量的maptask進程

2、 maptask進程啟動之后,根據給定的數據切片范圍進行數據處理,主體流程為:
a) 利用客戶指定的inputformat來獲取RecordReader讀取數據,形成輸入KV對(框架干的事)
b) 將輸入KV對傳遞給客戶定義的map()方法,做邏輯運算,并將map()方法輸出的KV對收集到緩存
c) 將緩存中的KV對按照K分區排序后不斷溢寫到磁盤文件

3、 MRAppMaster監控到所有maptask進程任務完成之后,會根據客戶指定的參數啟動相應數量的reducetask進程,并告知reducetask進程要處理的數據范圍(數據分區)

4、 Reducetask進程啟動之后,根據MRAppMaster告知的待處理數據所在位置,從若干臺maptask運行所在機器上獲取到若干個maptask輸出結果文件,并在本地進行重新歸并排序,然后按照相同key的KV為一個組,調用客戶定義的reduce()方法進行邏輯運算,并收集運算輸出的結果KV,然后調用客戶指定的outputformat將結果數據輸出到外部存儲(對應的就是context.write方法)

2、mapreduce實踐(WordCount實例)

編程規范:

(1)用戶編寫的程序分成三個部分:Mapper,Reducer,Driver(提交運行mr程序的客戶端)
(2)Mapper的輸入數據是KV對的形式(KV的類型可自定義)
(3)Mapper的輸出數據是KV對的形式(KV的類型可自定義)
(4)Mapper中的業務邏輯寫在map()方法中
(5)map()方法(maptask進程)對每一個<K,V>調用一次
(6)Reducer的輸入數據類型對應Mapper的輸出數據類型,也是KV
(7)Reducer的業務邏輯寫在reduce()方法中
(8)Reducetask進程對每一組相同k的<k,v>組調用一次reduce()方法
(9)用戶自定義的Mapper和Reducer都要繼承各自的父類
(10)整個程序需要一個Drvier來進行提交,提交的是一個描述了各種必要信息的job對象

WordCount程序
mapper類

package bigdata.mr.wcdemo;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
/**
//map方法的生命周期:  框架每傳一行數據就被調用一次* KEYIN: 默認情況下,是mr框架所讀到的一行文本的起始偏移量,Long,* 但是在hadoop中有自己的更精簡的序列化接口,所以不直接用Long,而用LongWritable* * VALUEIN:默認情況下,是mr框架所讀到的一行文本的內容,String,同上,用Text* * KEYOUT:是用戶自定義邏輯處理完成之后輸出數據中的key,在此處是單詞,String,同上,用Text* VALUEOUT:是用戶自定義邏輯處理完成之后輸出數據中的value,在此處是單詞次數,Integer,同上,用IntWritable*/
public class WordcountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{/*** map階段的業務邏輯就寫在自定義的map()方法中* maptask會對每一行輸入數據調用一次我們自定義的map()方法*/@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {        //將maptask傳給我們的文本內容先轉換成StringString line = value.toString();//根據空格將這一行切分成單詞String[] words = line.split(" ");       //將單詞輸出為<單詞,1>for(String word:words){//將單詞作為key,將次數1作為value,以便于后續的數據分發,可以根據單詞分發,以便于相同單詞會到相同的reduce taskcontext.write(new Text(word), new IntWritable(1));}}
}

reducer類

package mr_test;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
/**
//生命周期:框架每傳遞進來一個k相同的value 組,reduce方法就被調用一次* KEYIN, VALUEIN 對應  mapper輸出的KEYOUT,VALUEOUT類型對應* KEYOUT, VALUEOUT 是自定義reduce邏輯處理結果的輸出數據類型* KEYOUT是單詞* VLAUEOUT是總次數*/
public class WordcountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {   /*** <angelababy,1><angelababy,1><angelababy,1><angelababy,1><angelababy,1>* <hello,1><hello,1><hello,1><hello,1><hello,1><hello,1>* <banana,1><banana,1><banana,1><banana,1><banana,1><banana,1>* 入參key,是一組相同單詞kv對的key*/@Overrideprotected void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException { int count=0;for(IntWritable value:values){count+=value.get();     }context.write(key, new IntWritable(count));}
}

Driver類 用來描述job并提交job

package mr_test;
import java.io.IOException;
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;
/*** 相當于一個yarn集群的客戶端* 需要在此封裝我們的mr程序的相關運行參數,指定jar包* 最后提交給yarn*/
public class WordcountDriver {public static void main(String[] args) throws IOException, Exception, InterruptedException {Configuration cf = new Configuration();
//  把這個程序打包成一個Job來運行Job job = Job.getInstance();        //指定本程序的jar包所在的本地路徑job.setJarByClass(WordcountDriver.class);       //指定本業務job要使用的mapper/Reducer業務類job.setMapperClass(WorldcountMapper.class);job.setReducerClass(WordcountReducer.class);        //指定mapper輸出數據的kv類型job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(IntWritable.class);  //指定最終輸出的數據的kv類型job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class); //指定job的輸入原始文件所在目錄FileInputFormat.setInputPaths(job, new Path(args[0]));  //指定job的輸出結果所在目錄FileOutputFormat.setOutputPath(job, new Path(args[1]));     //將job中配置的相關參數,以及job所用的java類所在的jar包,提交給yarn去運行boolean res = job.waitForCompletion(true);System.exit(res?0:1);   }
}

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

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

相關文章

生動形象的理解什么是裝飾器!

裝飾器 裝飾器是程序開發中經常會用到的一個功能&#xff0c;用好了裝飾器&#xff0c;開發效率如虎添翼&#xff0c;所以這也是Python面試中必問的問題&#xff0c;但對于好多初次接觸這個知識的人來講&#xff0c;這個功能有點繞&#xff0c;自學時直接繞過去了&#xff0c;…

PLSQL 申明和游標

--從鍵盤輸入一個數 accept b prompt 請輸入一個大于零的數字; declareanum number : &b; beginwhile anum>0loopdbms_output.put_line(anum);anum:anum-1;end loop; end;declarev_num number; begin -- 從stsu表中選出id最大的值&#xff0c;并根據該值打印次數select …

20155222 2016-2017-2 《Java程序設計》第8周學習總結

20155222 2016-2017-2 《Java程序設計》第8周學習總結 教材學習內容總結 Java NIO(New IO)是一個可以替代標準Java IO API的IO API&#xff08;從Java 1.4開始)&#xff0c;Java NIO提供了與標準IO不同的IO工作方式。 Java NIO: Channels and Buffers&#xff08;通道和緩沖區&…

BAT經典面試題精簡版(基礎知識附答案)

文章目錄目錄J2SE基礎JVM操作系統TCP/IP數據結構與算法目錄 J2SE基礎 九種基本數據類型的大小&#xff0c;以及他們的封裝類。 原始類型封裝類 booleanBoolean charCharacter byteByte shortShort intInteger longLong floatFloat doubleDouble Switch能否用string做參數&…

使用2to3.py 轉換 python2.x 代碼 到python3

1.使用Windows 命令提示符&#xff08;cmd&#xff09;cd到2to3.py 腳本所在位置&#xff0c;如下圖&#xff1a; 找不到的2 to 3.py的去 pycharm中雙擊shift搜索一下 2.緊接著運行 2to3.py 腳本&#xff08;可省略&#xff09; 3.執行你想要轉換的文件 python 2to3.py -w H:…

iis6.0與asp.net的運行原理

這幾天上網翻閱了不少前輩們的關于iis和asp.net運行原理的博客&#xff0c;學的有點零零散散&#xff0c;花了好長時間做了一個小結&#xff08;雖然文字不多&#xff0c;但也花了不少時間呢&#xff09;&#xff0c;鄙人不才&#xff0c;難免有理解不道的地方&#xff0c;還望…

元類--用不上的先了解

元類 1. 類也是對象 在大多數編程語言中&#xff0c;類就是一組用來描述如何生成一個對象的代碼段。在Python中這一點仍然成立&#xff1a; >>> class ObjectCreator(object): … pass … >>> my_object ObjectCreator() >>> print(my_ob…

Android學習筆記進階十之Matrix錯切變換

剛開始我也不懂啥叫錯切變換&#xff0c;一看效果圖你就恍然大悟。 對圖像的錯切變換做個總結&#xff1a; x x0 b*y0; y d*x0 y0; 與之對應的方法是&#xff1a; [java] view plaincopyMatrix matrix new Matrix(); matrix.setSkew(0.0f, 0.5f);

SQL數據庫實戰(含建表數據和查詢案例)

Oracle數據庫安裝的時候會自帶一個練習用數據庫&#xff08;其中包含employee表&#xff0c;后來版本中此表改名為emp&#xff09;&#xff1b; 首先在安裝過程中應該有個選項“是否安裝實例表”&#xff08;完全安裝模式下默認是選擇的&#xff09;&#xff0c;需要選擇才有此…

Django中的核心思想ORM---元類實現ORM

1. ORM是什么 ORM 是 python編程語言后端web框架 Django的核心思想&#xff0c;“Object Relational Mapping”&#xff0c;即對象-關系映射&#xff0c;簡稱ORM。 一個句話理解就是&#xff1a;創建一個實例對象&#xff0c;用創建它的類名當做數據表名&#xff0c;用創建它…

移動互聯網廣告 - 第十更 - 廣告投放運營 DashBoard - 2016/12/10

廣告投放運營 DashBoard設計 移動互聯網互聯網廣告投放&#xff0c;數據監控DashBoard&#xff0c;基礎樣例示意&#xff0c;下圖僅供參考&#xff08;來自于互聯網&#xff09;。 轉載于:https://www.cnblogs.com/pythonMLer/p/6154700.html

微信小程序中使用emoji表情相關說明

2019獨角獸企業重金招聘Python工程師標準>>> 本帖將聚合一些跟emoji表情有關的知識&#xff1b;相關文章&#xff1a;“i愛記賬” 小程序后端開發小結 第7條經驗前端傳過來的昵稱和備注信息一定要經過嚴格的正則表達式過濾&#xff0c;放置出現XSS等攻擊&#xff0c…

java.lang.IllegalArgumentException: Does not contain a valid host:port authority: ignorethis

執行Hive語句運行MapReduce程序時突然出現這樣的異常&#xff1a; Total MapReduce jobs 1 Launching Job 1 out of 1 Number of reduce tasks not specified. Estimated from input data size: 1 In order to change the average load for a reducer (in bytes):set hive.ex…

Oracle基礎語句

1、創建表create table IT_EMPLOYEES(ENPLOYEES_ID NUMBER(6) NOT NULL UNIQUE,FIRST_NAME VARCHAR2(20),LAST_NAME VARCHAR2(25) NOT NULL,EMAIL VARCHAR2(25),PHONE_NUMBER VARCHAR2(20),JOB_ID VARCHAR2(10),SALARY NUMBER(8,2),MANAGER_ID NUMBER(6));2、--創建索引&#x…

Linux三劍客之grep 與 egrep

grep&#xff1a;Linux上文本處理三劍客1 grep&#xff1a;文本過濾(模式&#xff1a;pattern)工具; *&#xff08;grep, egrep, fgrep&#xff09; 2 sed&#xff1a;stream editor&#xff0c;文本編輯工具&#xff1b; 3 awk&#xff1a;Linux上的實現gawk&#xff0c;文本報…

WSGI直觀形象的了解一下

1. 瀏覽器請求動態頁面過程 2. WSGI 怎么在你剛建立的Web服務器上運行一個Django應用和Flask應用&#xff0c;如何不做任何改變而適應不同的web架構呢&#xff1f; 在以前&#xff0c;選擇 Python web 架構會受制于可用的web服務器&#xff0c;反之亦然。如果架構和服務器可以…

安裝Hbase(分布式)遇到一些問題及解決方法

問題一&#xff1a;安裝完成后在Hbase shell 命令行執行list命令時&#xff0c;爆出如下錯誤&#xff1a; hbase(main):001:0> list TABLE …

安裝MySql卡在Start Service的問題

我的情況&#xff1a;之前在windows下安裝過5.6版本&#xff0c;卸載后&#xff0c;現在安裝5.7版本&#xff0c;然后卡在Start Service這里&#xff0c;log日志沒報任何錯誤&#xff0c;后來經過不斷的嘗試各種網上的辦法終于把問題解決了。 問題的原因就是當初卸載5.6版本時…

學習進度條11

第十三周 日期 星期一 星期二 星期三 星期四 星期五 星期六 所花時間&#xff08;包括上課&#xff09; 19:10-22:20 (編程河北省科技信息通用調查系統) 8:00-10:00 (上課) 18:30-21:00 (Oracle實驗) 14:00-16:30 (編程河北省科技信息通用調查系統) 18:20-22:30 (編…

Python面向切面編程是什么

簡而言之就是裝飾器 https://blog.csdn.net/qq_41856814/article/details/90146293