MapReduce原理和執(zhí)行過程

MapReduce是一個用于處理海量數(shù)據(jù)的分布式計算框架菩掏。

  • 這個框架解決了 ? 數(shù)據(jù)分布式存儲
    ?作業(yè)調(diào)度霎烙、
    ? 容錯募寨、
    ? 機器間通信等復(fù)雜問題

MapReduce的核心思想叁怪,分而治之

分:map
? 把復(fù)雜的問題分解為若干“簡單的 任務(wù)”
合:reduce

上面這幅圖就是mapreduce的工作原理

以詞頻統(tǒng)計為例审葬。

詞頻統(tǒng)計就是統(tǒng)計一個單詞在所有文本中出現(xiàn)的次數(shù),在Hadoop中的事例程序就是wordcount奕谭,俗稱hadoop編程的"hello world".因為我們有多個文本涣觉,所以可以并行的統(tǒng)計每個文本中單詞出現(xiàn)的個數(shù),然后最后進行合計血柳。
所以這個可以很好地體現(xiàn)map官册,reduce的過程。

1)首先文檔的數(shù)據(jù)記錄(如文本中的行难捌,或數(shù)據(jù)表格中的行)是以“鍵值對”的形式傳入map 函數(shù)膝宁,然后map函數(shù)對這些鍵值對進行處理(如統(tǒng)計詞頻),然后輸出到中間結(jié)果根吁。

2)在鍵值對進入reduce進行處理之前员淫,必須等到所有的map函數(shù)都做完,所以既為了達到這種同步又提高運行效率击敌,在mapreduce中間的過程引入了barrier(同步障)
在負(fù)責(zé)同步的同時完成對map的中間結(jié)果的統(tǒng)計介返,包括 a. 對同一個map節(jié)點的相同key的value值進行合并,b. 之后將來自不同map的具有相同的key的鍵值對送到同一個reduce進行處理。

3)在reduce階段圣蝎,每個reduce節(jié)點得到的是從所有map節(jié)點傳過來的具有相同的key的鍵值對刃宵。reduce節(jié)點對這些鍵值進行合并。

4)Combiner 節(jié)點負(fù)責(zé)完成上面提到的將同一個map中相同的key進行合并徘公,避免重復(fù)傳輸组去,從而減少傳輸中的通信開銷。

5)Partitioner節(jié)點負(fù)責(zé)將map產(chǎn)生的中間結(jié)果進行劃分步淹,確保相同的key到達同一個reduce節(jié)點.

編程模型

? 借鑒函數(shù)式的編程方式
? 用戶只需要實現(xiàn)兩個函數(shù)接口:
? Map(in_key, in_value)-> (out_key, intermediate_value) list
? Reduce (out_key, intermediate_value list) ->out_value list

兩個重要的進程

  • JobTracker
    主進程从隆,負(fù)責(zé)接收客戶作業(yè)提交,調(diào)度任務(wù)到作節(jié)點上運行缭裆,并提供諸如監(jiān)控工作節(jié)點狀態(tài)及任務(wù)進度等 管理功能键闺,一個MapReduce集群有一個jobtracker,一般運行在可靠的硬件上澈驼。
    ? tasktracker是通過周期性的心跳來通知jobtracker其當(dāng)前的健康狀態(tài)辛燥,每一次心跳包含了可用的map和 reduce任務(wù)數(shù)目、占用的數(shù)目以及運行中的任務(wù)詳細(xì)信息缝其。Jobtracker利用一個線程池來同時處理心跳和 客戶請求挎塌。
  • TaskTracker
    ? 由jobtracker指派任務(wù),實例化用戶程序内边,在本地執(zhí)行任務(wù)并周期性地向jobtracker匯報 狀態(tài)榴都。在每一個工 作節(jié)點上永遠只會有一個tasktracker

? JobTracker一直在等待JobClient提交作業(yè)
? TaskTracker每隔3秒向JobTracker發(fā)送心跳詢問有沒有任務(wù)可做,如果有漠其,讓
其派發(fā)任務(wù)給它執(zhí)行
? Slave主動向master拉生意

wordCount實例代碼(python實現(xiàn))

案例文件結(jié)構(gòu)

run.sh文件
 HADOOP_CMD="/usr/local/src/hadoop-1.2.1/bin/hadoop"  
 STREAM_JAR_PATH="/usr/local/src/hadoop-1.2.1/contrib/streaming/hadoop-streaming-1.2.1.jar"    //python代碼實現(xiàn)嘴高,引入streaming

#INPUT_FILE_PATH_1="/The_Man_of_Property.txt"
INPUT_FILE_PATH_1="/1.data"
OUTPUT_PATH="/output"

$HADOOP_CMD fs -rmr -skipTrash $OUTPUT_PATH

# Step 1. 
$HADOOP_CMD jar $STREAM_JAR_PATH \    //設(shè)置通過streaming方式提交
    -input $INPUT_FILE_PATH_1 \    //上面定義的,指向/1.data和屎,原始文件(數(shù)據(jù)源)
    -output $OUTPUT_PATH \     //輸出路徑
    -mapper "python map_new.py" \    //指定如何執(zhí)行map
    -reducer "python red_new.py" \    //指定如何執(zhí)行reducer
    -file ./map_new.py \    //通過下面兩個配置文件拴驮,把本地的代碼分發(fā)到集群的map和Reducer上去
    -file ./red_new.py
a.txt
111
222
333
map_new.py
import sys

for line in sys.stdin:
    ss = line.strip().split(' ')
    for word in ss:
            print '\t'.join([word.strip(), '1'])

cat a.txt | python map_new.py。通過管道的方式柴信,a.txt 是數(shù)據(jù)源套啤,標(biāo)準(zhǔn)輸入到map。

red_new.py
import sys


cur_word = None
sum = 0

for line in sys.stdin:
    ss = line.strip().split('\t')
    if len(ss) != 2:
            continue
    word, cnt = ss

    if cur_word == None:
            cur_word = word

    if cur_word != word:
            print '\t'.join([cur_word, str(sum)])
            cur_word = word
            sum = 0

    sum += int(cnt)

print '\t'.join([cur_word, str(sum)])

head -2 The_Man_of_Property.txt | python map_new.py | sort -k1 | python red_new.py > result.local
這段代碼模擬了數(shù)據(jù)進入map随常,中間sort之后再進入red潜沦,最后輸出result.local

啟動集群。進入hadoop/bin 目錄下
./start-all.sh

然后hadoop fs -out 1.data / 把數(shù)據(jù)源上傳到HDFS
bash run.sh執(zhí)行streaming方式提交的腳本线罕。

MapReduce計算框架-執(zhí)行流程

File:

文件要存儲在HDFS中止潮,每個文件切分成多個一定大小(默認(rèn)64M)的Block(默認(rèn)3個備份)存儲在多個節(jié)點(DataNode)上

文件數(shù)據(jù)內(nèi)容:

We are studying at badou.\n
We are studyPinagrtiatitonbeardou.\n
......

InputFormat:

MR框架基礎(chǔ)類之一
? 數(shù)據(jù)分割(Data Splits)
? S記pli錄t讀取Sp器lit(RSepcliotrdReader)
例子:
數(shù)據(jù)格定義,如果以“\n”分割每條記錄钞楼,以空格區(qū)分一個目標(biāo)單詞
Shuffle “we are studying at badou.”為一條記錄
“are”“at”等為一個目標(biāo)單詞

Split:

實際上每個split包含后一個Block中開頭部分的數(shù)據(jù)(解決記錄跨Block問題)
例子:
比如記錄 “we are studing at badou./n"
跨越存儲在兩個Block中,那么這條記錄屬于前一個Block對應(yīng)的split

RecordReader:(RR)

每讀取一條記錄袄琳,調(diào)用一次map函數(shù)
例子
比如询件,記錄“we are studying at badou." 作為參數(shù)v燃乍,調(diào)用map(v)
然后繼續(xù)這個過程,讀取議案一條記錄知道split尾部宛琅。

Map:

比如記錄”we are studying at badou"
調(diào)用執(zhí)行一次map("we are studying at badou")
在內(nèi)存中增加數(shù)據(jù):
{"we":1}
{"are":1}
......

Shuffle:

Partion,Sort,Spill,Meger,Combiner.......
神奇發(fā)生的地方刻蟹,性能優(yōu)化大有可為的地方!

Partitioner:

決定數(shù)據(jù)由哪個Reducer處理嘿辟,從而分區(qū)
比如采用Hash法舆瘪。

MemoryBuffer

內(nèi)存緩沖區(qū),每個map的結(jié)果和partition處理的key value結(jié)果都保存在緩存中

緩沖區(qū)大泻炻住:默認(rèn)100M
溢寫閾值:100M*0.8 = 80M

緩沖區(qū)中的數(shù)據(jù):partition key value 三元組數(shù)據(jù)
{“1”, “are” : 1}
{“2”, “at” : 1}
{“1”, “we” : 1}

Spill:

內(nèi)存緩沖區(qū)達到閾值時英古,溢寫spill線程鎖住這80M 的緩沖區(qū),開始將數(shù)據(jù)寫出到本地磁盤中昙读,然后釋 放內(nèi)存召调。
每次溢寫都生成一個數(shù)據(jù)文件。 溢出的數(shù)據(jù)到磁盤前會對數(shù)據(jù)進行key排序sort蛮浑, 以及合并combiner
發(fā)送相同Reduce的key數(shù)量唠叛,會拼接到一起,減少 partition的索引數(shù)量沮稚。

Sort:

緩沖區(qū)數(shù)據(jù)按照key進行排序

Combiner:

數(shù)據(jù)合并艺沼,相同的key的數(shù)據(jù),value值合并蕴掏,減少輸 出傳輸量 Combiner函數(shù)事實上是reducer函數(shù)澳厢,滿足 combiner處理不影響{sum,max等}最終reduce的 結(jié)果時囚似,可以極大提升性能
{“1”剩拢, “are”, 1} {“1”饶唤, “are”徐伐, 1} {“1”, “we”募狂, 1}==》
{“1”办素, “are”, 2} {“1”祸穷, “we”性穿, 1}

Reducer

多個reduce任務(wù)輸入的數(shù)據(jù)都屬于不同的partition,因此結(jié)果數(shù)據(jù)的key不會重復(fù)雷滚。
合并reduce的輸出文件即可得到最終的結(jié)果需曾。

MapReduce物理配置

? 文件句柄個數(shù) – ulimit
? cpu

– 多核

? 內(nèi)存

– 8G以上

? 合適的slot

– 單機map、reduce個數(shù)
– mapred.tasktracker.map.tasks.maximum(默認(rèn)2)
– mapreduce.tasktracker.tasks.reduce.maximum(默認(rèn)2) – 內(nèi)存限制
– cpu核數(shù)-1
– 多機集群分離

? 磁盤情況

– 合適單機多磁盤
– mapred.local.dir和dfs.data.dir

? 確定map任務(wù)數(shù)時依次優(yōu)先參考如下幾個原則:

– 每個map任務(wù)使用的內(nèi)存不超過800M,盡量在500M以下
– 每個map任務(wù)運行時間控制在大約20分鐘呆万,最好1-3分鐘
– 每個map任務(wù)處理的最大數(shù)據(jù)量為一個HDFS塊大小商源,一個map任務(wù)處理的輸入不能跨文件
– map任務(wù)總數(shù)不超過平臺可用的任務(wù)槽位

? 配置加載的問題

– 簡單配置通過提交作業(yè)時-file分發(fā)
– 復(fù)雜較大配置
? 傳入hdfs
? map中打開文件讀取
? 建立內(nèi)存結(jié)構(gòu)

? map個數(shù)為split的份數(shù)
? 壓縮文件不可切分
? 非壓縮文件和sequence文件可以切分
? dfs.block.size決定block大小
? 確定reduce任務(wù)數(shù)時依次優(yōu)先參考如下幾個方面:

– 每個reduce任務(wù)使用的內(nèi)存不超過800M,盡量在500M以下
– 每個reduce任務(wù)運行時間控制在大約20分鐘谋减,最好1-3分鐘 – 整個reduce階段的輸入數(shù)據(jù)總量
– 每個reduce任務(wù)處理的數(shù)據(jù)量控制在500MB以內(nèi)
– map任務(wù)數(shù)與reduce任務(wù)數(shù)的乘積
– 輸出數(shù)據(jù)要求

? reduce個數(shù)設(shè)置

– mapred.reduce.tasks – 默認(rèn)為1

? reduce個數(shù)太少 – 單次執(zhí)行慢

– 出錯再試成本高

? reduce個數(shù)太多 – shuffle開銷大

– 輸出大量小文件

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末牡彻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子出爹,更是在濱河造成了極大的恐慌庄吼,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件严就,死亡現(xiàn)場離奇詭異总寻,居然都是意外死亡,警方通過查閱死者的電腦和手機盈蛮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門废菱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人抖誉,你說我怎么就攤上這事殊轴。” “怎么了袒炉?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長我磁。 經(jīng)常有香客問我夺艰,道長,這世上最難降的妖魔是什么减牺? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任拔疚,我火速辦了婚禮稚失,結(jié)果婚禮上恰聘,老公的妹妹穿的比我還像新娘。我一直安慰自己诫钓,他們只是感情好菌湃,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布惧所。 她就那樣靜靜地躺著绪杏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蕾久。 梳的紋絲不亂的頭發(fā)上僧著,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機與錄音栅迄,去河邊找鬼皆怕。 笑死,一個胖子當(dāng)著我的面吹牛憋活,可吹牛的內(nèi)容都是我干的虱黄。 我是一名探鬼主播礁鲁,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼仅醇,長吁一口氣:“原來是場噩夢啊……” “哼析二!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起属韧,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤宵喂,失蹤者是張志新(化名)和其女友劉穎锅棕,沒想到半個月后拙泽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡裸燎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了德绿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡移稳,死狀恐怖蕴纳,靈堂內(nèi)的尸體忽然破棺而出秒裕,到底是詐尸還是另有隱情袱蚓,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布几蜻,位于F島的核電站喇潘,受9級特大地震影響梭稚,放射性物質(zhì)發(fā)生泄漏颖低。R本人自食惡果不足惜弧烤,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一暇昂、第九天 我趴在偏房一處隱蔽的房頂上張望从铲。 院中可真熱鬧,春花似錦澄暮、人聲如沸伸辟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽信夫。三九已至窃蹋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間忙迁,已是汗流浹背脐彩。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工碎乃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留姊扔,地道東北人。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓梅誓,卻偏偏與公主長得像恰梢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子梗掰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 努力生活及穗,別把年齡當(dāng)回事 妍初 1 晚高峰摧茴,在地鐵一號線轉(zhuǎn)二號線水泄不通的電梯上,接到小葉的電話埂陆。周圍人聲鼎沸苛白,...
    妍初0閱讀 537評論 0 0
  • 那天,閃著藍色光芒的流星劃過天際焚虱,一條優(yōu)美的拋物線橫于萬里晴空购裙;街道上、天橋上鹃栽、陽臺上躏率,人們欣賞它的絢麗。 “...
    九月紅葉閱讀 222評論 0 0
  • 我有夢想。我希望把自己的足跡留在世界上的每一個無人問津的角落丰嘉,描述出我所見到的高尚與卑鄙夯到、冷漠與熱情、智慧與愚蠢供嚎、...
    說啥看心情閱讀 1,665評論 25 32