MapReduce原理全剖析

MapReduce剖析圖

這里寫圖片描述

如上圖所示是MR的運行詳細過程

  1. 首先mapTask讀文件是通過InputFormat(內部是調RecordReader()–>read())來一次讀一行,返回K,V值。(默認是TextInputFormat,還可以輸入其他的類型如:音視頻,圖片等。)。
  2. mapper(map(k,v))–>context.write()即mapTask階段。
  3. 輸出數據到OutputCollector收集器(不會輸出一組就傳到下一步進行處理,而是需要一個收集的過程,減少IO)
  4. 將收集到的數據寫到環形緩沖區–>通過Spiller來將溢出的數據溢出到文件中去(在這里會通過hashPartitioner執行分區、通過key.comPareTo來實現排序(分為系統默認的快排和外部排序)即實現了shuffle的核心機制:分區和排序)。
  5. 將多個溢出文件進行Merge(采用歸并排序),合并成一個大文件。
  6. 將文件下載到ReduceTask的本地磁盤工作目錄–>將多個MapTask的輸出結果再進行歸并排序(也可以說是ReduceTask去各個mapTask對應的分區去取對應的數據)。
  7. Reducer(reduce(k,v))–>context.write(k,v)–>
    OutputFormat(RecordWriter.write(k,v))即reduceTask階段。
  8. 將數據寫到part-r-00000這里

如上圖所示,圖中用紅色粗線描述的組件都是可以重寫的。
mapreduce在編程的時候,基本上一個固化的模式,沒有太多可靈活改變的地方,除了以下幾處:

1、輸入數據接口:InputFormat —> FileInputFormat(文件類型數據讀取的通用抽象類) DBInputFormat (數據庫數據讀取的通用抽象類)

默認使用的實現類是 :TextInputFormat。
job.setInputFormatClass(TextInputFormat.class)
TextInputFormat的功能邏輯是:一次讀一行文本,然后將該行的起始偏移量作為key,行內容作為value返回

2、邏輯處理接口: Mapper
完全需要用戶自己去實現其中 map() setup() clean()

3、map輸出的結果在shuffle階段會被partition以及sort,此處有兩個接口可自定義:
Partitioner
有默認實現 HashPartitioner,邏輯是 根據key和numReduces來返回一個分區號; key.hashCode()&Integer.MAXVALUE % numReduces
通常情況下,用默認的這個HashPartitioner就可以,如果業務上有特別的需求,可以自定義Comparable
當我們用自定義的對象作為key來輸出時,就必須要實現WritableComparable接口,override其中的compareTo()方法

4、reduce端的數據分組比較接口 : Groupingcomparator
reduceTask拿到輸入數據(一個partition的所有數據)后,首先需要對數據進行分組,其分組的默認原則是key相同,然后對每一組kv數據調用一次reduce()方法,并且將這一組kv中的第一個kv的key作為參數傳給reduce的key,將這一組數據的value的迭代器傳給reduce()的values參數

5、邏輯處理接口:Reducer
完全需要用戶自己去實現其中 reduce() setup() clean()

6、輸出數據接口: OutputFormat —> 有一系列子類 FileOutputformat DBoutputFormat …..
默認實現類是TextOutputFormat,功能邏輯是: 將每一個KV對向目標文本文件中輸出為一行

整個過程需要注意以下幾點:

  • 環形緩存區(數據從outputCollector中傳入環形緩存區,直到達到80%的緩存時,緩存才會啟用清理機制,將已經溢出的數據溢出到文件中去(通過spiller來將數據溢出到文件中去))會溢出多次,每次溢出都會對數據進行分區排序,形成多個分區排序后的數據,最終進行合并。
  • combiner的作用:對spiller階段的溢出數據進行一個reduce處理,直接讓相同k的value值相加,減少數據量以及傳輸過程中的開銷,大大提高效率。(根據業務需求使用,并不是每個業務都要用。可自定義一個Combiner類,內部邏輯和Reduce類似)
  • shuffle:洗牌、發牌——(核心機制:數據分區,排序,緩存
    具體來說:就是將maptask輸出的處理結果數據,分發給reducetask,并在分發的過程中,對數據按key進行了分區和排序;

  • 數據傾斜:指的是任務在shuffle階段時會進行一個分區操作(默認的是hashcode取模),如果有大部分數據被分到一個ReduceTask端進行處理,一小部分任務被分到其他的ReduceTask端進行處理,就會造成其他ReduceTask處理完成后,仍有一個ReduceTask還在處理數據。最終造成整個工程延遲的情況。(為了解決這個問題,引入了Partition)

總結:

MapReduce中最核心的知識點就是MR運行的整體流程;除此之外要達到博主菜鳥級別的水平,你還需要了解以下幾個知識點:
1、MapReduce是什么,用來干什么的(無論學什么首先都得知道這一點)。
2、MapReduce框架的設計思想。
3、MapReduce框架中的程序實體角色以及對應的作用:maptask reducetask mrappmaster。
(1和2詳見:https://blog.csdn.net/qq_16633405/article/details/78404018)
4、MapReduce程序中maptask任務切片規劃的機制。
(詳見:https://blog.csdn.net/qq_16633405/article/details/79729172)
5、Yarn在MapReduce中作用。
(詳見:https://blog.csdn.net/qq_16633405/article/details/79734021)
6、掌握MapReduce的編程套路,通過不斷的寫MR案例領悟編寫MR程序的核心思想(即如何確定對應K-V值)。
(后續會將對應的MR的一些特殊套路案例上傳到Git上)
目前想到的就這么點,后續有遺漏的話會接著補充。

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

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

相關文章

利用selenium webdriver點擊alert提示框

在進行元素定位時常常遇到這樣的alert框: 那么該如何定位并點擊確定或取消按鈕呢?stackoverflow上找到了這個問題的答案。 OK, Show you the code: 1 driver.findElement(By.id("updateButton")).click(); 2 //pop up w…

Log 日志的使用與重要性

開發過程中出現bug是必不可免的,你會怎樣debug?從第1行代碼開始看么?還是有個文件里面記錄著哪里錯了更方便呢!!!log日志 Python中有個logging模塊可以完成相關信息的記錄,在debug時用它往往事…

webdriver 的三種等待方式

1、顯式等待 一個顯式等待是你定義的一段代碼,用于等待某個條件發生然后再繼續執行后續代碼。 from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWait #…

Django的核心思想ORM

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

Secondary Namenode的Check point機制以及Namenode、Datanode工作機制說明

目錄前言:1、NameNode的工作機制2、DataNode的工作機制3、Secondary Namenode的Check point機制 目錄 前言: 在說明checkpoint機制之前,先要了解下namenode、datanode的一些功能和職責。 1、NameNode的工作機制 問題場景: 1…

表單驗證的初步實現和省市級聯

1.表單驗證的初步實現 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html xmlns"http://www.w3.org/1999/xhtml" lang"en"><head><meta http-equiv"Conte…

抓包軟件:Charles

修正&#xff1a;手機不必一定連接電腦分享的熱點&#xff0c;只需要手機和電腦在同一個局域網下就可以了&#xff0c;手機代理IP設置為電腦的IP。 之前寫過一篇通過Wireshark進行抓包&#xff0c;分析網絡連接的文章《通過WireShark抓取iOS聯網數據實例分析》&#xff1a;htt…

Hive的相關介紹

目錄前言&#xff1a;1、Hive簡介2、Hive架構3、Hive與Hadoop的關系4、Hive與傳統數據庫對比5、Hive的數據存儲總結&#xff1a; 目錄 前言&#xff1a; 為什么使用Hive 直接使用hadoop所面臨的問題 人員學習成本太高 項目周期要求太短 MapReduce實現復雜查詢邏輯開發難…

數據結構實驗之排序七:選課名單

數據結構實驗之排序七&#xff1a;選課名單 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 隨著學校規模的擴大&#xff0c;學生人數急劇增加&#xff0c;選課名單的輸出也成為一個繁重的任務&#xff0c;我校目前有在校生3萬多名&#xff0…

Java第五次作業--面向對象高級特性(抽象類和接口)

一、學習要點 認真看書并查閱相關資料&#xff0c;掌握以下內容&#xff1a; 掌握抽象類的設計掌握接口的設計理解簡單工廠設計模式理解抽象類和接口的區別掌握包裝類的應用掌握對象的比較方法和比較器的使用學習使用日期操作類學習匿名內部類的使用二、作業要求 發布一篇隨筆&…

關于國內廠商的國際版殺毒軟件

很多國內軟件公司的殺毒軟件都分為國內版和國際版&#xff0c;這二者有什么區別呢&#xff1f; 首先&#xff0c;這兩個的團隊是不一樣的。國際版的團隊大多收購&#xff0c;國內版為自研。例如百度殺毒的國際版就是原超級巡警的團隊做的&#xff0c;而國內版是自己另起爐灶。…

gulp教程之gulp-minify-css【gulp-clean-css】

原文&#xff1a;http://www.ydcss.com/archives/41 簡介&#xff1a; 使用gulp-minify-css壓縮css文件&#xff0c;減小文件大小&#xff0c;并給引用url添加版本號避免緩存。重要&#xff1a;gulp-minify-css已經被廢棄&#xff0c;請使用gulp-clean-css&#xff0c;用法一致…

大數據面試題總結(附答案)

文章目錄前言hadoop相關試題Hive相關試題Hbase相關試題Storm相關試題Spark相關試題Java基礎試題其他前言 最近由于要準備面試就開始提早看些面試、筆試題。以下是自己總結的一些經常出現、有價值的試題&#xff0c;包含hadoop、hive、hbase、storm、spark等。答案僅供參考&…

win7 IE11卸載后無法上網

今天某同事需要訪問一個銀行網站&#xff0c;必須使用IE8,我在win7中降級IE11,直接卸載了IE11和其語言包&#xff0c;發現IE8再也打不開網頁了&#xff0c;每次打開都提示保存html網頁。測試Google Chrome上網完全沒有問題。IE8的internet選項等任何工具菜單點擊均無反應&#…

關于django的模板

模板 問題 如何向請求者返回一個漂亮的頁面呢&#xff1f; 肯定需要用到html、css&#xff0c;如果想要更炫的效果還要加入js&#xff0c;問題來了&#xff0c;這么一堆字段串全都寫到視圖中&#xff0c;作為HttpResponse()的參數嗎&#xff1f;這樣定義就太麻煩了吧&#x…

Hbase簡介及常用命令相關知識總結

文章目錄目錄前言&#xff1a;1.Hbase簡介1.1、什么是Hbase1.2、與傳統數據庫的對比1.3、Hbase集群中的角色2、Hbase數據模型3、Hbase命令總結&#xff1a;目錄 前言&#xff1a; 對于Hbase來說&#xff0c;由于其是基于列的數據庫&#xff0c;所以比傳統的數據庫快許多&…

Django中模型類 屬性-學習筆記

定義屬性 Django根據屬性的類型確定以下信息&#xff1a; 當前選擇的數據庫支持字段的類型渲染管理表單時使用的默認html控件在管理站點最低限度的驗證 django會為表創建自動增長的主鍵列&#xff0c;每個模型只能有一個主鍵列&#xff0c;如果使用選項設置某屬性為主鍵列后d…

Angular Redux

Angular Redux 轉載于:https://www.cnblogs.com/skating/p/6185878.html

AtomicInteger相關類

在java6以后我們不但接觸到了Lock相關的鎖&#xff0c;也接觸到了很多更加樂觀的原子修改操作&#xff0c;也就是在修改時我們只需要保證它的那個瞬間是安全的即可&#xff0c;經過相應的包裝后可以再處理對象的并發修改&#xff0c;以及并發中的ABA問題&#xff0c;本文講述At…

Storm入門簡介

目錄前言&#xff1a;1、Storm簡介2、Storm與Hadoop的區別3、Storm核心組件4、Storm編程模型5、流式計算一般架構圖&#xff08;重要&#xff09;總結&#xff1a; 目錄 前言&#xff1a; 在介紹Storm之前&#xff0c;先介紹下離線計算。 離線計算&#xff1a;批量獲取數據…