鍍金池/ 教程/ 大數(shù)據(jù)/ MapReduce簡(jiǎn)介和入門
Hadoop命令參考
Hadoop教程
Hadoop介紹快速入門
Pig & Hive介紹
Hadoop MapReduce
Hadoop安裝
Hadoop環(huán)境安裝設(shè)置
Hadoop HDFS入門
理解 MapReducer
Hadoop多節(jié)點(diǎn)集群
OOZIE 五分鐘入門學(xué)習(xí)
Flume和Sqoop
Hadoop是什么?
MapReduce計(jì)數(shù)器和連接
MapReduce Hadoop程序連接數(shù)據(jù)
Hadoop Streaming
Hadoop HDFS
Hadoop程序入門實(shí)踐
MapReduce簡(jiǎn)介和入門
Hadoop大數(shù)據(jù)解決方案
Hadoop HDFS操作

MapReduce簡(jiǎn)介和入門

MapReduce 是適合海量數(shù)據(jù)處理的編程模型。Hadoop是能夠運(yùn)行在使用各種語(yǔ)言編寫的MapReduce程序: Java, Ruby, Python, and C++. MapReduce程序是平行性的,因此可使用多臺(tái)機(jī)器集群執(zhí)行大規(guī)模的數(shù)據(jù)分析非常有用的。

MapReduce程序的工作分兩個(gè)階段進(jìn)行:

  1. Map階段
  2. Reduce 階段

輸入到每一個(gè)階段均是鍵 - 值對(duì)。此外,每一個(gè)程序員需要指定兩個(gè)函數(shù):map函數(shù)和reduce函數(shù)

整個(gè)過程要經(jīng)歷三個(gè)階段執(zhí)行,即

MapReduce如何工作

讓我們用一個(gè)例子來理解這一點(diǎn) –

假設(shè)有以下的輸入數(shù)據(jù)到 MapReduce 程序,統(tǒng)計(jì)以下數(shù)據(jù)中的單詞數(shù)量:

Welcome to Hadoop Class

Hadoop is good

Hadoop is bad

MapReduce 任務(wù)的最終輸出是:

bad 

1

Class 

1

good 

1

Hadoop 

3

is 

2

to 

1

Welcome 

1

這些數(shù)據(jù)經(jīng)過以下幾個(gè)階段

輸入拆分:

輸入到MapReduce工作被劃分成固定大小的塊叫做 input splits ,輸入折分是由單個(gè)映射消費(fèi)輸入塊。

映射 - Mapping

這是在 map-reduce 程序執(zhí)行的第一個(gè)階段。在這個(gè)階段中的每個(gè)分割的數(shù)據(jù)被傳遞給映射函數(shù)來產(chǎn)生輸出值。在我們的例子中,映射階段的任務(wù)是計(jì)算輸入分割出現(xiàn)每個(gè)單詞的數(shù)量(更多詳細(xì)信息有關(guān)輸入分割在下面給出)并編制以某一形式列表<單詞,出現(xiàn)頻率>

重排

這個(gè)階段消耗映射階段的輸出。它的任務(wù)是合并映射階段輸出的相關(guān)記錄。在我們的例子,同樣的詞匯以及它們各自出現(xiàn)頻率。

Reducing

在這一階段,從重排階段輸出值匯總。這個(gè)階段結(jié)合來自重排階段值,并返回一個(gè)輸出值??傊@一階段匯總了完整的數(shù)據(jù)集。

在我們的例子中,這個(gè)階段匯總來自重排階段的值,計(jì)算每個(gè)單詞出現(xiàn)次數(shù)的總和。

詳細(xì)的整個(gè)過程

  • 映射的任務(wù)是為每個(gè)分割創(chuàng)建在分割每條記錄執(zhí)行映射的函數(shù)。
  • 有多個(gè)分割是好處的, 因?yàn)樘幚硪粋€(gè)分割使用的時(shí)間相比整個(gè)輸入的處理的時(shí)間要少, 當(dāng)分割比較小時(shí),處理負(fù)載平衡是比較好的,因?yàn)槲覀冋诓⑿械靥幚矸指睢?/div>
  • 然而,也不希望分割的規(guī)模太小。當(dāng)分割太小,管理分割和映射創(chuàng)建任務(wù)的超負(fù)荷開始逐步控制總的作業(yè)執(zhí)行時(shí)間。
  • 對(duì)于大多數(shù)作業(yè),最好是分割成大小等于一個(gè)HDFS塊的大小(這是64 MB,默認(rèn)情況下)。
  • map任務(wù)執(zhí)行結(jié)果到輸出寫入到本地磁盤的各個(gè)節(jié)點(diǎn)上,而不是HDFS。
  • 之所以選擇本地磁盤而不是HDFS是因?yàn)?,避免?fù)制其中發(fā)生 HDFS 存儲(chǔ)操作。
  • 映射輸出是由減少任務(wù)處理以產(chǎn)生最終的輸出中間輸出。
  • 一旦任務(wù)完成,映射輸出可以扔掉了。所以,復(fù)制并將其存儲(chǔ)在HDFS變得大材小用。
  • 在節(jié)點(diǎn)故障的映射輸出之前,由 reduce 任務(wù)消耗,Hadoop 重新運(yùn)行另一個(gè)節(jié)點(diǎn)在映射上的任務(wù),并重新創(chuàng)建的映射輸出。
  • 減少任務(wù)不會(huì)在數(shù)據(jù)局部性的概念上工作。每個(gè)map任務(wù)的輸出被供給到 reduce 任務(wù)。映射輸出被傳輸至計(jì)算機(jī),其中 reduce 任務(wù)正在運(yùn)行。
  • 在此機(jī)器輸出合并,然后傳遞到用戶定義的 reduce 函數(shù)。
  • 不像到映射輸出,reduce輸出存儲(chǔ)在HDFS(第一個(gè)副本被存儲(chǔ)在本地節(jié)點(diǎn)上,其他副本被存儲(chǔ)于偏離機(jī)架的節(jié)點(diǎn))。因此,寫入 reduce 輸出

MapReduce如何組織工作?

Hadoop 劃分工作為任務(wù)。有兩種類型的任務(wù):

  1. Map 任務(wù) (分割及映射)
  2. Reduce 任務(wù) (重排,還原)

如上所述

完整的執(zhí)行流程(執(zhí)行 Map 和 Reduce 任務(wù))是由兩種類型的實(shí)體的控制,稱為

  1. Jobtracker : 就像一個(gè)主(負(fù)責(zé)提交的作業(yè)完全執(zhí)行)
  2. 多任務(wù)跟蹤器 : 充當(dāng)角色就像從機(jī),它們每個(gè)執(zhí)行工作

對(duì)于每一項(xiàng)工作提交執(zhí)行在系統(tǒng)中,有一個(gè) JobTracker 駐留在 Namenode 和 Datanode 駐留多個(gè) TaskTracker。

  • 作業(yè)被分成多個(gè)任務(wù),然后運(yùn)行到集群中的多個(gè)數(shù)據(jù)節(jié)點(diǎn)。
  • JobTracker的責(zé)任是協(xié)調(diào)活動(dòng)調(diào)度任務(wù)來在不同的數(shù)據(jù)節(jié)點(diǎn)上運(yùn)行。
  • 單個(gè)任務(wù)的執(zhí)行,然后由 TaskTracker 處理,它位于執(zhí)行工作的一部分,在每個(gè)數(shù)據(jù)節(jié)點(diǎn)上。
  • TaskTracker 的責(zé)任是發(fā)送進(jìn)度報(bào)告到JobTracker。
  • 此外,TaskTracker 周期性地發(fā)送“心跳”信號(hào)信息給 JobTracker 以便通知系統(tǒng)它的當(dāng)前狀態(tài)。
  • 這樣 JobTracker 就可以跟蹤每項(xiàng)工作的總體進(jìn)度。在任務(wù)失敗的情況下,JobTracker 可以在不同的 TaskTracker 重新調(diào)度它。