




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、MapReduce工作原理1 MapReduce原理(一)1.1 MapReduce編程模型MapReduce采用 分而治之 的思想,把對(duì)大規(guī)模數(shù)據(jù)集的操作,分發(fā)給一個(gè)主節(jié)點(diǎn)管理下的 各個(gè)分節(jié)點(diǎn)共同完成, 然后通過整合各個(gè)節(jié)點(diǎn)的中間結(jié)果, 得到最終結(jié)果。 簡(jiǎn)單地說, MapReduce 就是 任務(wù)的分解與結(jié)果的匯總 。在 Hadoop中,用于執(zhí)行 MapReduce任務(wù)的機(jī)器角色有兩個(gè):一個(gè)是 JobTracker ;另一個(gè)是 TaskTracker , JobTracker 是用于調(diào)度工作的, TaskTracker 是用于執(zhí)行工作的。一個(gè) Hadoop集 群中只有一臺(tái) JobTracker
2、 。在分布式計(jì)算中, MapReduce框架負(fù)責(zé)處理了并行編程中分布式存儲(chǔ)、工作調(diào)度、 負(fù)載均衡、容錯(cuò)均衡、 容錯(cuò)處理以及網(wǎng)絡(luò)通信等復(fù)雜問題, 把處理過程高度抽象為兩個(gè)函數(shù): map和 reduce , map負(fù)責(zé)把任務(wù)分解成多個(gè)任務(wù), reduce 負(fù)責(zé)把分解后多任務(wù)處理的結(jié)果匯總起來。需要注意的是,用 MapReduce來處理的數(shù)據(jù)集(或任務(wù))必須具備這樣的特點(diǎn):待處理的數(shù) 據(jù)集可以分解成許多小的數(shù)據(jù)集,而且每一個(gè)小數(shù)據(jù)集都可以完全并行地進(jìn)行處理。1.2 MapReduce處理過程在 Hadoop中,每個(gè) MapReduce任務(wù)都被初始化為一個(gè) Job ,每個(gè) Job 又可以分為兩種階段:
3、 map 階段和 reduce 階段。這兩個(gè)階段分別用兩個(gè)函數(shù)表示,即map函數(shù)和 reduce 函數(shù)。 map函數(shù)接收一個(gè) 形式的輸入,然后同樣產(chǎn)生一個(gè) 形式的中間輸出, Hadoop函數(shù)接 收一個(gè)如 形式的輸入,然后對(duì)這個(gè) value 集合進(jìn)行處理,每個(gè) reduce 產(chǎn) 生 0或1個(gè)輸出, reduce 的輸出也是 形式的。第1頁, 共 12頁一切都是從最上方的user program 開始的,user program 鏈接了 MapReduce庫,實(shí)現(xiàn)了最基本的 Map函數(shù)和 Reduce函數(shù)。圖中執(zhí)行的順序都用數(shù)字標(biāo)記了。1) MapReduce庫先把 user program 的輸
4、入文件劃分為 M份( M為用戶定義),每一份通常有 16MB到 64MB,如圖左方所示分成了 split04 ;然后使用 fork 將用戶進(jìn)程拷貝到集群內(nèi) 其它機(jī)器上。2) user program 的副本中有一個(gè)稱為 master ,其余稱為 worker , master 是負(fù)責(zé)調(diào)度的, 為空閑 worker 分配作業(yè)( Map作業(yè)或者 Reduce作業(yè)), worker 的數(shù)量也是可以由用戶指 定的。3) 被分配了 Map作業(yè)的 worker ,開始讀取對(duì)應(yīng)分片的輸入數(shù)據(jù), Map作業(yè)數(shù)量是由 M決定的, 和 split 一一對(duì)應(yīng); Map作業(yè)從輸入數(shù)據(jù)中抽取出鍵值對(duì),每一個(gè)鍵值對(duì)都作為
5、參數(shù)傳 遞給 map函數(shù), map函數(shù)產(chǎn)生的中間鍵值對(duì)被緩存在內(nèi)存中。4) 緩存的中間鍵值對(duì)會(huì)被定期寫入本地磁盤,而且被分為R個(gè)區(qū), R的大小是由用戶定義的,將來每個(gè)區(qū)會(huì)對(duì)應(yīng)一個(gè) Reduce作業(yè);這些中間鍵值對(duì)的位置會(huì)被通報(bào)給master ,master 負(fù)責(zé)將信息轉(zhuǎn)發(fā)給 Reduce worker 。5) master 通知分配了 Reduce作業(yè)的 worker 它負(fù)責(zé)的分區(qū)在什么位置(肯定不止一個(gè)地方,第2頁, 共 12頁每個(gè) Map作業(yè)產(chǎn)生的中間鍵值對(duì)都可能映射到所有R個(gè)不同分區(qū)),當(dāng) Reduce worker 把所有它負(fù)責(zé)的中間鍵值對(duì)都讀過來后,先對(duì)它們進(jìn)行排序,使得相同鍵的鍵值
6、對(duì)聚集 在一起。因?yàn)椴煌逆I可能會(huì)映射到同一個(gè)分區(qū)也就是同一個(gè)Reduce作業(yè)(誰讓分區(qū)少呢),所以排序是必須的。6)reduce worker 遍歷排序后的中間鍵值對(duì),對(duì)于每個(gè)唯一的鍵,都將鍵與關(guān)聯(lián)的值傳遞給 reduce 函數(shù), reduce 函數(shù)產(chǎn)生的輸出會(huì)添加到這個(gè)分區(qū)的輸出文件中。7)當(dāng)所有的 Map和 Reduce作業(yè)都完成了, master 喚醒正版的 user program , MapReduce函 數(shù)調(diào)用返回 user program 的代碼。所有執(zhí)行完畢后, MapReduce輸出放在了 R個(gè)分區(qū)的輸出文件中 (分別對(duì)應(yīng)一個(gè) Reduce作業(yè))。 用戶通常并不需要合并這
7、R個(gè)文件,而是將其作為輸入交給另一個(gè)MapReduce程序處理。整個(gè)過程中,輸入數(shù)據(jù)是來自底層分布式文件系統(tǒng)(GFS)的,中間數(shù)據(jù)是放在本地文件系統(tǒng)的,最終輸出數(shù)據(jù)是寫入底層分布式文件系統(tǒng)(GFS)的。而且我們要注意 Map/Reduce作業(yè)和 map/reduce函數(shù)的區(qū)別: Map作業(yè)處理一個(gè)輸入數(shù)據(jù)的分片,可能需要調(diào)用多次map函數(shù)來處理每個(gè)輸入鍵值對(duì); Reduce作業(yè)處理一個(gè)分區(qū)的中間鍵值對(duì),期間要對(duì)每個(gè)不同的鍵調(diào)用一次reduce 函數(shù),Reduce作業(yè)最終也對(duì)應(yīng)一個(gè)輸出文件。第3頁, 共 12頁2 MapReduce原理(二)2.1 MapReduce作業(yè)運(yùn)行流程流程分析:1)
8、在客戶端啟動(dòng)一個(gè)作業(yè)。2) 向 JobTracker 請(qǐng)求一個(gè) Job ID 。3) 將運(yùn)行作業(yè)所需要的資源文件復(fù)制到HDFS上,包括 MapReduce程序打包的 JAR文件、配置文件和客戶端計(jì)算所得的輸入劃分信息。這些文件都存放在 JobTracker 專門為該作業(yè)創(chuàng)建的文件夾中。文件夾名為該作業(yè)的 Job ID 。JAR文件默認(rèn)會(huì)有 10個(gè)副本( mapred.submit.replication屬性控制);輸入劃分信息告訴了 JobTracker 應(yīng)該為這個(gè)作業(yè)啟動(dòng)多少個(gè) map任務(wù)等信息。4) JobTracker 接收到作業(yè)后,將其放在一個(gè)作業(yè)隊(duì)列里,等待作業(yè)調(diào)度器對(duì)其進(jìn)行調(diào)度,當(dāng)
9、 作業(yè)調(diào)度器根據(jù)自己的調(diào)度算法調(diào)度到該作業(yè)時(shí),會(huì)根據(jù)輸入劃分信息為每個(gè)劃分創(chuàng)建一 個(gè) map任務(wù),并將 map任務(wù)分配給 TaskTracker 執(zhí)行。對(duì)于 map和 reduce 任務(wù), TaskTracker 根 據(jù)主機(jī)核的數(shù)量和內(nèi)存的大小有固定數(shù)量的map槽和 reduce 槽。這里需要強(qiáng)調(diào)的是: map任務(wù)不是隨隨便便地分配給某個(gè) TaskTracker 的,這里有個(gè)概念叫: 數(shù)據(jù)本地化 ( Data-Local )。第4頁, 共 12頁意思是:將 map任務(wù)分配給含有該 map處理的數(shù)據(jù)塊的 TaskTracker 上,同時(shí)將程序 JAR包復(fù)制到該 TaskTracker 上來運(yùn)行,
10、這叫“運(yùn)算移動(dòng),數(shù)據(jù)不移動(dòng)”。而分配 reduce 任務(wù)時(shí)并不 考慮數(shù)據(jù)本地化。5) TaskTracker 每隔一段時(shí)間會(huì)給 JobTracker 發(fā)送一個(gè)心跳,告訴 JobTracker 它依然在運(yùn)行, 同時(shí)心跳中還攜帶著很多的信息,比如當(dāng)前map任務(wù)完成的進(jìn)度等信息。當(dāng) JobTracker 收到作業(yè)的最后一個(gè)任務(wù)完成信息時(shí),便把該作業(yè)設(shè)置成“成功”。當(dāng) JobClient 查詢狀態(tài)時(shí), 它將得知任務(wù)已完成,便顯示一條消息給用戶。以上是在客戶端、 JobTracker 、 TaskTracker 的層次來分析 MapReduce的工作原理的,下面 我們?cè)偌?xì)致一點(diǎn),從 map任務(wù)和 red
11、uce 任務(wù)的層次來分析分析吧。2.2 Map、 Reduce任務(wù)中 Shuffle 和排序的過程流程分析:Map端:1)每個(gè)輸入分片會(huì)讓一個(gè) map任務(wù)來處理, 默認(rèn)情況下, 以 HDFS的一個(gè)塊的大小 (默認(rèn)為 64M) 為一個(gè)分片,當(dāng)然我們也可以設(shè)置塊的大小。map輸出的結(jié)果會(huì)暫且放在一個(gè)環(huán)形內(nèi)存緩沖區(qū)中 (該緩沖區(qū)的大小默認(rèn)為 100M,由 io.sort.mb 屬性控制) ,當(dāng)該緩沖區(qū)快要溢出時(shí) (默 認(rèn)為緩沖區(qū)大小的 80%,由 io.sort.spill.percent屬性控制),會(huì)在本地文件系統(tǒng)中創(chuàng)建一個(gè)溢出文件,將該緩沖區(qū)中的數(shù)據(jù)寫入這個(gè)文件。2)在寫入磁盤之前,線程首先根據(jù)
12、 reduce 任務(wù)的數(shù)目將數(shù)據(jù)劃分為相同數(shù)目的分區(qū),也就是 一個(gè) reduce 任務(wù)對(duì)應(yīng)一個(gè)分區(qū)的數(shù)據(jù)。這樣做是為了避免有些 reduce 任務(wù)分配到大量數(shù)據(jù),第5頁, 共 12頁而有些 reduce 任務(wù)卻分到很少數(shù)據(jù),甚至沒有分到數(shù)據(jù)的尷尬局面。其實(shí)分區(qū)就是對(duì)數(shù)據(jù)進(jìn)行 hash的過程。然后對(duì)每個(gè)分區(qū)中的數(shù)據(jù)進(jìn)行排序,如果此時(shí)設(shè)置了Combiner ,將排序后的結(jié)果進(jìn)行 Combia操作,這樣做的目的是讓盡可能少的數(shù)據(jù)寫入到磁盤。3)當(dāng) map任務(wù)輸出最后一個(gè)記錄時(shí),可能會(huì)有很多的溢出文件,這時(shí)需要將這些文件合并。合 并的過程中會(huì)不斷地進(jìn)行排序和 combia 操作,目的有兩個(gè):( 1)盡
13、量減少每次寫入磁盤的 數(shù)據(jù)量;( 2)盡量減少下一復(fù)制階段網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量。最后合并成了一個(gè)已分區(qū)且已排 序的文件。為了減少網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量,這里可以將數(shù)據(jù)壓縮,只要將 press.map.out 設(shè)置為 true 就可以了。4)將分區(qū)中的數(shù)據(jù)拷貝給相對(duì)應(yīng)的 reduce 任務(wù)。有人可能會(huì)問:分區(qū)中的數(shù)據(jù)怎么知道它對(duì) 應(yīng)的 reduce 是哪個(gè)呢?其實(shí) map任務(wù)一直和其父 TaskTracker 保持聯(lián)系,而 TaskTracker 又一 直和 JobTracker 保持心跳。所以 JobTracker 中保存了整個(gè)集群中的宏觀信息。只要reduce任務(wù)向 JobTracker 獲取對(duì)應(yīng)的
14、map輸出位置就 ok 了哦。到這里, map端就分析完了。那到底什么是 Shuffle 呢? Shuffle 的中文意思是“洗牌”,如 果我們這樣看:一個(gè) map產(chǎn)生的數(shù)據(jù),結(jié)果通過 hash 過程分區(qū)卻分配給了不同的 reduce 任務(wù),是 不是一個(gè)對(duì)數(shù)據(jù)洗牌的過程呢?Reduce端:1)Reduce會(huì)接收到不同 map任務(wù)傳來的數(shù)據(jù), 并且每個(gè) map傳來的數(shù)據(jù)都是有序的。 如果 reduce 端接受的數(shù)據(jù)量相當(dāng)小,則直接存儲(chǔ)在內(nèi)存中(緩沖區(qū)大小由 mapred.job.shuffle.input.buffer.percent 屬性控制,表示用作此用途的堆空間的百分 比),如果數(shù)據(jù)量超過
15、了該緩沖區(qū)大小的一定比例 (由 mapred.job.shuffle.merge.percent 決定),則對(duì)數(shù)據(jù)合并后溢寫到磁盤中。2)隨著溢寫文件的增多,后臺(tái)線程會(huì)將它們合并成一個(gè)更大的有序的文件,這樣做是為了給 后面的合并節(jié)省時(shí)間。其實(shí)不管在 map端還是 reduce 端, MapReduce都是反復(fù)地執(zhí)行排序, 合并操作,現(xiàn)在終于明白了有些人為什么會(huì)說:排序是hadoop 的靈魂。3)合并的過程中會(huì)產(chǎn)生許多的中間文件(寫入磁盤了),但MapReduce會(huì)讓寫入磁盤的數(shù)據(jù)盡可能地少,并且最后一次合并的結(jié)果并沒有寫入磁盤,而是直接輸入到 reduce 函數(shù)。第6頁, 共 12頁3 Map
16、Reduce原理(三)3.1 物理實(shí)體談 mapreduce運(yùn)行機(jī)制,可以從很多不同的角度來描述,比如說從mapreduce運(yùn)行流程來講解,也可以從計(jì)算模型的邏輯流程來進(jìn)行講解,也許有些深入理解了mapreduce運(yùn)行機(jī)制還會(huì)從更好的角度來描述,但是將 mapreduce 運(yùn)行機(jī)制有些東西是避免不了的,就是一個(gè)個(gè)參入的實(shí)例 對(duì)象,一個(gè)就是計(jì)算模型的邏輯定義階段。首先講講物理實(shí)體,參入 mapreduce 作業(yè)執(zhí)行涉及 4個(gè)獨(dú)立的實(shí)體:1)客戶端( client ):編寫 mapreduce 程序,配置作業(yè),提交作業(yè),這就是程序員完成的 工作;2)JobTracker :初始化作業(yè),分配作業(yè),與
17、 TaskTracker 通信,協(xié)調(diào)整個(gè)作業(yè)的執(zhí)行;3)TaskTracker :保持與 JobTracker 的通信, 在分配的數(shù)據(jù)片段上執(zhí)行 Map或 Reduce任務(wù), TaskTracker 和 JobTracker 的不同有個(gè)很重要的方面,就是在執(zhí)行任務(wù)時(shí)候TaskTracker 可以有 n多個(gè),JobTracker 則只會(huì)有一個(gè) ( JobTracker 只能有一個(gè)就和 hdfs 里 namenode一樣存在單點(diǎn)故障,我會(huì)在后面的 mapreduce的相關(guān)問題里講到這個(gè)問題的)4)Hdfs :保存作業(yè)的數(shù)據(jù)、配置信息等等,最后的結(jié)果也是保存在 hdfs 上面。3.2 運(yùn)行原理第7頁
18、, 共 12頁第8頁, 共 12頁第9頁, 共 12頁首先是客戶端要編寫好 mapreduce程序,配置好 mapreduce 的作業(yè)也就是 job ,接下來就是提 交 job 了,提交 job 是提交到 JobTracker 上的,這個(gè)時(shí)候 JobTracker 就會(huì)構(gòu)建這個(gè) job ,具體就是 分配一個(gè)新的 job 任務(wù)的 ID 值,接下來它會(huì)做檢查操作,這個(gè)檢查就是確定輸出目錄是否存在, 如果存在那么 job 就不能正常運(yùn)行下去, JobTracker 會(huì)拋出錯(cuò)誤給客戶端,接下來還要檢查輸入 目錄是否存在, 如果不存在同樣拋出錯(cuò)誤, 如果存在 JobTracker 會(huì)根據(jù)輸入計(jì)算輸入分片
19、 ( Input Split ),如果分片計(jì)算不出來也會(huì)拋出錯(cuò)誤,至于輸入分片我后面會(huì)做講解的,這些都做好了 JobTracker 就會(huì)配置 Job 需要的資源了。分配好資源后, JobTracker 就會(huì)初始化作業(yè),初始化主 要做的是將 Job 放入一個(gè)內(nèi)部的隊(duì)列,讓配置好的作業(yè)調(diào)度器能調(diào)度到這個(gè)作業(yè),作業(yè)調(diào)度器會(huì) 初始化這個(gè) job ,初始化就是創(chuàng)建一個(gè)正在運(yùn)行的 job 對(duì)象(封裝任務(wù)和記錄信息),以便 JobTracker 跟蹤 job 的狀態(tài)和進(jìn)程。初始化完畢后,作業(yè)調(diào)度器會(huì)獲取輸入分片信息( input split ),每個(gè)分片創(chuàng)建一個(gè) map 任務(wù)。接下來就是任務(wù)分配了,這個(gè)時(shí)候
20、 tasktracker 會(huì)運(yùn)行一個(gè)簡(jiǎn)單的循環(huán)機(jī)制定期發(fā)送心跳 給 jobtracker ,心跳間隔是 5秒,程序員可以配置這個(gè)時(shí)間, 心跳就是 jobtracker 和 tasktracker 溝通的橋梁,通過心跳, jobtracker 可以監(jiān)控 tasktracker 是否存活,也可以獲取 tasktracker 處理的狀態(tài)和問題,同時(shí) tasktracker 也可以通過心跳里的返回值獲取 jobtracker 給它的操作指 令。任務(wù)分配好后就是執(zhí)行任務(wù)了。在任務(wù)執(zhí)行時(shí)候 jobtracker 可以通過心跳機(jī)制監(jiān)控 tasktracker 的狀態(tài)和進(jìn)度,同時(shí)也能計(jì)算出整個(gè) job 的狀態(tài)
21、和進(jìn)度,而 tasktracker 也可以本地 監(jiān)控自己的狀態(tài)和進(jìn)度。當(dāng) jobtracker 獲得了最后一個(gè)完成指定任務(wù)的 tasktracker 操作成功的 通知時(shí)候, jobtracker 會(huì)把整個(gè) job 狀態(tài)置為成功, 然后當(dāng)客戶端查詢 job 運(yùn)行狀態(tài)時(shí)候 (注意: 這個(gè)是異步操作),客戶端會(huì)查到 job 完成的通知的。如果 job 中途失敗, mapreduce 也會(huì)有相應(yīng) 機(jī)制處理,一般而言如果不是程序員程序本身有bug, mapreduce錯(cuò)誤處理機(jī)制都能保證提交的job 能正常完成。下面我從邏輯實(shí)體的角度講解 mapreduce 運(yùn)行機(jī)制,這些按照時(shí)間順序包括: 輸入分片(
22、 input split )、 map階段、 combiner 階段、 shuffle 階段和 reduce 階段。1) 輸入分片( input split ): 在進(jìn)行 map計(jì)算之前, mapreduce 會(huì)根據(jù)輸入文件計(jì)算輸入分片( input split ),每個(gè)輸入分片 ( input split )針對(duì)一個(gè) map任務(wù),輸入分片( input split ) 存儲(chǔ)的并非數(shù)據(jù)本身,而是一個(gè) 分片長(zhǎng)度 和一個(gè) 記錄數(shù)據(jù)的位置的數(shù)組 ,輸入分片( input split )往往和 hdfs 的 block (塊)關(guān)系很密切,假如我們?cè)O(shè)定 hdfs 的塊的大小是 64mb,如 果我們輸入有
23、三個(gè)文件,大小分別是3mb、65mb和 127mb,那么 mapreduce會(huì)把 3mb文件分為第10 頁, 共12頁一個(gè)輸入分片( input split), 65mb則是兩個(gè)輸入分片( input split)而 127mb也是兩個(gè)輸入分片( input split ),換句話說我們?nèi)绻?map計(jì)算前做輸入分片調(diào)整,例如合并小 文件,那么就會(huì)有 5個(gè) map任務(wù)將執(zhí)行,而且每個(gè) map執(zhí)行的數(shù)據(jù)大小不均,這個(gè)也是 mapreduce優(yōu)化計(jì)算的一個(gè)關(guān)鍵點(diǎn)。2) map階段: 就是程序員編寫好的 map函數(shù)了,因此 map函數(shù)效率相對(duì)好控制,而且一般 map操 作都是本地化操作也就是在數(shù)據(jù)存
24、儲(chǔ)節(jié)點(diǎn)上進(jìn)行;3) combiner 階段: combiner 階段是程序員可以選擇的, combiner 其實(shí)也是一種 reduce 操作, 因此我們看見 WordCount類里是用 reduce 進(jìn)行加載的。 Combiner 是一個(gè)本地化的 reduce 操作, 它是 map運(yùn)算的后續(xù)操作,主要是在 map計(jì)算出中間文件前做一個(gè)簡(jiǎn)單的合并重復(fù)key值的操作,例如我們對(duì)文件里的單詞頻率做統(tǒng)計(jì),map計(jì)算時(shí)候如果碰到一個(gè) hadoop 的單詞就會(huì)記錄為 1,但是這篇文章里 hadoop可能會(huì)出現(xiàn) n多次,那么 map輸出文件冗余就會(huì)很多,因此在 reduce 計(jì)算前對(duì)相同的 key 做一個(gè)合
25、并操作,那么文件會(huì)變小,這樣就提高了寬帶的傳輸效 率,畢竟 hadoop計(jì)算力寬帶資源往往是計(jì)算的瓶頸也是最為寶貴的資源,但是 combiner 操 作是有風(fēng)險(xiǎn)的, 使用它的原則是 combiner 的輸入不會(huì)影響到 reduce 計(jì)算的最終輸入, 例如: 如果計(jì)算只是求總數(shù), 最大值, 最小值可以使用 combiner ,但是做平均值計(jì)算使用 combiner 的話,最終的 reduce 計(jì)算結(jié)果就會(huì)出錯(cuò)。4) shuffle 階段: 將 map的輸出作為 reduce 的輸入的過程就是 shuffle 了,這個(gè)是 mapreduce優(yōu) 化的重點(diǎn)地方。這里我不講怎么優(yōu)化 shuffle 階段
26、,講講 shuffle 階段的原理,因?yàn)榇蟛糠?的書籍里都沒講清楚 shuffle 階段。Shuffle 一開始就是 map階段做輸出操作, 一般 mapreduce 計(jì)算的都是海量數(shù)據(jù), map輸出時(shí)候不可能把所有文件都放到內(nèi)存操作,因此map寫入磁盤的過程十分的復(fù)雜,更何況 map輸出時(shí)候要對(duì)結(jié)果進(jìn)行排序,內(nèi)存開銷是很大的,map在做輸出時(shí)候會(huì)在內(nèi)存里開啟一個(gè)環(huán)形內(nèi)存緩沖區(qū),這個(gè)緩沖區(qū)專門用來輸出的,默認(rèn)大小是 100mb,并且在配置文件里為這個(gè)緩沖區(qū)設(shè)定了一個(gè)閥值,默認(rèn)是0.80 (這個(gè)大小和閥值都是可以在配置文件里進(jìn)行配置的),同時(shí)map還會(huì)為輸出操作啟動(dòng)一個(gè)守護(hù)線程,如果緩沖區(qū)的內(nèi)存達(dá)到了閥值的 80%時(shí)候,這個(gè)守護(hù)線程就會(huì)把內(nèi)容寫到磁盤上, 這個(gè)過程叫 spill , 另外的 20%內(nèi)存可以繼續(xù)寫入要寫進(jìn)磁盤的數(shù)據(jù),寫入磁盤和寫入內(nèi)存操作是互不干擾的, 如果緩存區(qū)被撐滿了,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國(guó)鋁鎳鈷永磁市場(chǎng)前景趨勢(shì)及發(fā)展?jié)摿Ψ治鰣?bào)告
- 2025重慶市安全員-A證考試題庫附答案
- 2025-2030年中國(guó)金屬鈷市場(chǎng)發(fā)展趨勢(shì)規(guī)劃研究報(bào)告
- 2025-2030年中國(guó)袋式除塵器行業(yè)運(yùn)營(yíng)趨勢(shì)規(guī)劃研究報(bào)告
- 2025-2030年中國(guó)芝麻素市場(chǎng)運(yùn)行狀況與前景趨勢(shì)分析報(bào)告
- 2025-2030年中國(guó)翻譯行業(yè)競(jìng)爭(zhēng)狀況及發(fā)展趨勢(shì)分析報(bào)告
- 2025-2030年中國(guó)砂巖行業(yè)市場(chǎng)運(yùn)行態(tài)勢(shì)及發(fā)展風(fēng)險(xiǎn)分析報(bào)告
- 2025-2030年中國(guó)電熱水龍頭市場(chǎng)運(yùn)行現(xiàn)狀及發(fā)展前景預(yù)測(cè)報(bào)告
- 廣西民族大學(xué)《建筑設(shè)備自動(dòng)化A》2023-2024學(xué)年第二學(xué)期期末試卷
- 廣東外語外貿(mào)大學(xué)《法律與人生》2023-2024學(xué)年第二學(xué)期期末試卷
- 咖啡店合同咖啡店合作經(jīng)營(yíng)協(xié)議
- 2025年山東鋁業(yè)職業(yè)學(xué)院高職單招職業(yè)技能測(cè)試近5年??及鎱⒖碱}庫含答案解析
- 全套電子課件:技能成就夢(mèng)想
- 2024年教育公共基礎(chǔ)知識(shí)筆記
- 2025年江蘇農(nóng)林職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測(cè)試近5年??及鎱⒖碱}庫含答案解析
- 異構(gòu)數(shù)據(jù)融合技術(shù)-深度研究
- 北京市朝陽區(qū)2024-2025學(xué)年七年級(jí)上學(xué)期期末考試數(shù)學(xué)試卷(含答案)
- 《銷售合同執(zhí)行》課件
- 2025年春新外研版(三起)英語三年級(jí)下冊(cè)課件 Unit4第2課時(shí)Speedup
- 山東2024年山東經(jīng)貿(mào)職業(yè)學(xué)院第二批招聘102人歷年參考題庫(頻考版)含答案解析
- 急性呼吸窘迫綜合征的護(hù)理課件(演示)
評(píng)論
0/150
提交評(píng)論