MapReduce海量數(shù)據(jù)并行處理 總結(jié)_第1頁
MapReduce海量數(shù)據(jù)并行處理 總結(jié)_第2頁
MapReduce海量數(shù)據(jù)并行處理 總結(jié)_第3頁
MapReduce海量數(shù)據(jù)并行處理 總結(jié)_第4頁
MapReduce海量數(shù)據(jù)并行處理 總結(jié)_第5頁
已閱讀5頁,還剩77頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、mapreduce海量數(shù)據(jù)并行處理復(fù)習(xí)大綱ch. 1. 并行計算技術(shù)簡介1.為什么需要并行計算?提高計算機(jī)性能有哪些基本技術(shù)手段提高字長,流水線微體系結(jié)構(gòu)技術(shù),提高集成度,提升主頻迫切需要發(fā)展并行計算技術(shù)的主要原因1)單處理器性能提升達(dá)到極限2)爆炸性增長的大規(guī)模數(shù)據(jù)量2)超大的計算量/計算復(fù)雜度2. 并行計算技術(shù)的分類有哪些主要的并行計算分類方法?1) 按數(shù)據(jù)和指令處理結(jié)構(gòu):弗林(flynn)分類2)按并行類型3)按存儲訪問構(gòu)架4)按系統(tǒng)類型5)按計算特征6)按并行程序設(shè)計模型/方法1)按數(shù)據(jù)和指令處理結(jié)構(gòu):弗林(flynn)分類sisd:單指令單數(shù)據(jù)流 傳統(tǒng)的單處理器串行處理simd:單指

2、令多數(shù)據(jù)流 向量機(jī),信號處理系統(tǒng)misd:多指令單數(shù)據(jù)流 很少使用mimd:多指令多數(shù)據(jù)流 最常用,top500高性能計算機(jī) 基本都屬于mimd類型2) 按并行類型分類 位級并行(bit-level parallelism) 指令級并行(ilp:instruction-level parallelism) 線程級并行(thread-level parallelism) 數(shù)據(jù)級并行:一個大的數(shù)據(jù)塊劃分為小塊,分別由不同的處理器/線程處理 任務(wù)級并行:一個大的計算任務(wù)劃分為子任務(wù)分別由不同的處理器/線程來處理3) 按存儲訪問結(jié)構(gòu)分類a.共享內(nèi)存(shared memory) 所有處理器通過總線共享

3、內(nèi)存 多核處理器,smp 也稱為uma結(jié)構(gòu) (uniform memory access)b. 分布共享存儲體系結(jié)構(gòu) 各個處理器有本地存儲器 同時再共享一個全局的存儲器c. 分布式內(nèi)存(distributed memory) 各個處理器使用本地獨立的存儲器 b和c也統(tǒng)稱為numa結(jié)構(gòu) (non-uniform memory access)4)按系統(tǒng)類型分類 多核/眾核并行計算系統(tǒng)mc(multicore/manycore) 或chip-level multiprocessing, cmp 對稱多處理系統(tǒng)smp(symmetric multiprocessing) 多個相同類型處理器通過總線連接

4、并共享存儲器 大規(guī)模并行處理mpp(massive parallel processing) 專用內(nèi)聯(lián)網(wǎng)連接一組處理器形成的一個計算系統(tǒng) 集群(cluster) 網(wǎng)絡(luò)連接的一組商品計算機(jī)構(gòu)成的計算系統(tǒng) 網(wǎng)格(grid) 用網(wǎng)絡(luò)連接遠(yuǎn)距離分布的一組異構(gòu)計算機(jī)構(gòu)成的計算系統(tǒng)5)按并行程序設(shè)計模型/方法分類共享內(nèi)存變量 (shared memory variables) 消息傳遞方式(message passing)mapreduce方式3.并行計算的主要技術(shù)問題并行計算有哪些方面的主要技術(shù)問題?多核/多處理器網(wǎng)絡(luò)互連結(jié)構(gòu)技術(shù)存儲訪問體系結(jié)構(gòu)分布式數(shù)據(jù)與文件管理并行計算任務(wù)分解與算法設(shè)計并行程序設(shè)計

5、模型和方法數(shù)據(jù)同步訪問和通信控制可靠性設(shè)計與容錯技術(shù)并行計算軟件框架平臺系統(tǒng)性能評價和程序并行度評估如何評估程序的可并行度(amdahl定律)程序能得到多大并行加速依賴于該程序有多少可并行計算的比例。經(jīng)典的程序并行加速評估公式amdahl定律: 其中,s是加速比,p是程序可并行比例,n是處理器數(shù)目根據(jù)amdahl定律:一個并行程序可加速程度是有限制的,并非可無限加速,并非處理器越多越好并行比例vs加速比50%=>最大2倍75%=>最大4倍90%=>最大10倍95%=>最大20倍4.mpi并行程序設(shè)計message passing interface,基于消息傳遞的高性能

6、并行計算編程接口5.什么是mapreduce概念mapreduce是面向大規(guī)模數(shù)據(jù)并行處理的:(1)基于集群的高性能并行計算平臺(cluster infrastructure),(硬件層) 允許用市場上現(xiàn)成的普通pc或性能較高的刀架或機(jī)架式服務(wù)器,構(gòu)成一個包含數(shù)千個節(jié)點的分布式并行計算集群(2)并行程序開發(fā)與運行框架(software framework) (邏輯層)系統(tǒng)自動提供了一個龐大但設(shè)計精良的并行計算軟件構(gòu)架,能自動完成計算任務(wù)的并行化處理,自動劃分計算數(shù)據(jù)和計算任務(wù),在集群節(jié)點上自動分配和執(zhí)行子任務(wù)以及收集計算結(jié)果,將數(shù)據(jù)分布存儲、數(shù)據(jù)通信、容錯處理等并行計算中的很多復(fù)雜細(xì)節(jié)交由系統(tǒng)

7、負(fù)責(zé)處理,大大減少了軟件開發(fā)人員的負(fù)擔(dān)(3)并行程序設(shè)計模型與方法(programming model & methodology) (用戶層) 借助于函數(shù)式lisp語言中的設(shè)計思想,提供了一種簡便的并行程序設(shè)計方法,用map和reduce兩個函數(shù)編程實現(xiàn)基本的并行計算任務(wù),提供了完整的并行編程接口,完成大規(guī)模數(shù)據(jù)處理6.為什么mapreduce如此重要?1)高效的大規(guī)模數(shù)據(jù)處理方法2)第一個不同于馮諾依曼結(jié)構(gòu)的、基于集群而非單機(jī)的計算方式的重大突破3)目前為止最為成功的基于大規(guī)模計算資源的并行計算抽象方法ch.2. mapreduce簡介1. mapreduce的基本模型和處理思想1

8、) 對大數(shù)據(jù)分而治之;2) 構(gòu)建抽象模型-map和reduce,用戶僅需要描述做什么,不需要關(guān)心怎么做3) 提供統(tǒng)一的構(gòu)架并完成以下的主要功能·任務(wù)調(diào)度·數(shù)據(jù)/代碼互定位·出錯處理·分布式數(shù)據(jù)文件管理·combiner和partitioner(設(shè)計目的和作用)2. combiner和partitioner設(shè)計目的和作用帶寬優(yōu)化(combiner的設(shè)計目的和作用),不會改變key-value的形式用數(shù)據(jù)分區(qū)解決數(shù)據(jù)相關(guān)性問題(partitioner的設(shè)計目的和作用)例如:有一個巨大的數(shù)組,其最終結(jié)果需要排序,每個map節(jié)點數(shù)據(jù)處理好后,為了避免在

9、每個reduce節(jié)點本地排序完成后還需要進(jìn)行全局排序,我們可以使用一個分區(qū)策略如:(d%r),d為數(shù)據(jù)大小,r為reduce節(jié)點的個數(shù),則可根據(jù)數(shù)據(jù)的大小將其劃分到指定數(shù)據(jù)范圍的reduce節(jié)點上,每個reduce將本地數(shù)據(jù)拍好序后即為最終結(jié)果ch.3. google /hadoop mapreduce基本構(gòu)架1. google mapreduce的基本工作原理1)google mapreduce并行處理的基本過程1. 有一個待處理的大數(shù)據(jù),被劃分為大小相同的數(shù)據(jù)塊(如64mb),及與此相應(yīng)的用戶作業(yè)程序2. 系統(tǒng)中有一個負(fù)責(zé)調(diào)度的主節(jié)點(master),以及數(shù)據(jù)map和reduce工作節(jié)點(

10、worker)3. 用戶作業(yè)程序提交給主節(jié)點4. 主節(jié)點為作業(yè)程序?qū)ふ液团鋫淇捎玫膍ap節(jié)點,并將程序傳送給map節(jié)點 5. 主節(jié)點也為作業(yè)程序?qū)ふ液团鋫淇捎玫膔educe節(jié)點,并將程序傳送給reduce節(jié)點 6. 主節(jié)點啟動每個map節(jié)點執(zhí)行程序,每個map節(jié)點盡可能讀取本地或本機(jī)架的數(shù)據(jù)進(jìn)行計算 7. 每個map節(jié)點處理讀取的數(shù)據(jù)塊,并做一些數(shù)據(jù)整理工作(combining, sorting等)并將中間結(jié)果存放在本地;同時通知主節(jié)點計算任務(wù)完成并告知中間結(jié)果數(shù)據(jù)存儲位置 8. 主節(jié)點等所有map節(jié)點計算完成后,開始啟動reduce節(jié)點運行;reduce節(jié)點從主節(jié)點所掌握的中間結(jié)果數(shù)據(jù)位置信

11、息,遠(yuǎn)程讀取這些數(shù)據(jù)9. reduce節(jié)點計算結(jié)果匯總輸出到一個結(jié)果文件即獲得整個處理結(jié)果2) 失效處理主節(jié)點失效主節(jié)點中會周期性地設(shè)置檢查點(checkpoint),檢查整個計算作業(yè)的執(zhí)行情況,一旦某個任務(wù)失效,可以從最近有效的檢查點開始重新執(zhí)行,避免從頭開始計算的時間浪費,主節(jié)點采用熱備。工作節(jié)點失效工作節(jié)點失效是很普遍發(fā)生的,主節(jié)點會周期性地給工作節(jié)點發(fā)送檢測命令,如果工作節(jié)點沒有回應(yīng),這認(rèn)為該工作節(jié)點失效,主節(jié)點將終止該工作節(jié)點的任務(wù)并把失效的任務(wù)重新調(diào)度到其它工作節(jié)點上重新執(zhí)行。3)計算優(yōu)化問題如果有一個計算量大、或者由于某個問題導(dǎo)致很慢結(jié)束的map節(jié)點,則會成為嚴(yán)重的“拖后腿者”。

12、解決方案把一個map計算任務(wù)讓多個map節(jié)點同時做,取最快完成者的計算結(jié)果2. 分布式文件系統(tǒng)gfs的基本工作原理1) google gfs的基本設(shè)計原則廉價本地磁盤分布存儲多數(shù)據(jù)自動備份解決可靠性為上層的mapreduce計算框架提供支撐2) google gfs的基本構(gòu)架和工作原理gfs mastermaster上保存了gfs文件系統(tǒng)的三種元數(shù)據(jù) :命名空間(name space),即整個分布式文件系統(tǒng)的目錄結(jié)構(gòu) chunk與文件名的映射表chunk副本的位置信息,每一個chunk默認(rèn)有3個副本前兩種元數(shù)據(jù)可通過操作日志提供容錯處理能力;第3個元數(shù)據(jù)直接保存在chunkserver上, m

13、aster 啟動或chunk server注冊時自動完成在chunk server上元數(shù)據(jù)的生成;因此,當(dāng)master失效時,只要chunkserver數(shù)據(jù)保存完好,可迅速恢復(fù)master上的元數(shù)據(jù)。gfs chunkserver 即用來保存大量實際數(shù)據(jù)的數(shù)據(jù)服務(wù)器。gfs中每個數(shù)據(jù)塊劃分默認(rèn)為64mb,這是因為處理的文件都比較大,所以設(shè)置成64mb比較合理每個數(shù)據(jù)塊會分別在3個(缺省情況下)不同的地方復(fù)制副本;對每一個數(shù)據(jù)塊,僅當(dāng)3個副本都更新成功時,才認(rèn)為數(shù)據(jù)保存成功。當(dāng)某個副本失效時,master會自動將正確的副本數(shù)據(jù)進(jìn)行復(fù)制以保證足夠的副本數(shù)gfs上存儲的數(shù)據(jù)塊副本,在物理上以一個本地

14、的linux操作系統(tǒng)的文件形式存儲,每一個數(shù)據(jù)塊再劃分為64kb的子塊,每個子快有一個32位的校驗和,讀數(shù)據(jù)時會檢查校驗和以保證使用為有效的數(shù)據(jù)。數(shù)據(jù)訪問工作過程1. 在程序運行前,數(shù)據(jù)已經(jīng)存儲在gfs文件系統(tǒng)中;程序?qū)嵭袝r應(yīng)用程序會告訴gfs server所要訪問的文件名或者數(shù)據(jù)塊索引是什么2. gfs server根據(jù)文件名會數(shù)據(jù)塊索引在其文件目錄空間中查找和定位該文件或數(shù)據(jù)塊,并找數(shù)據(jù)塊在具體哪些chunkserver上;將這些位置信息回送給應(yīng)用程序3. 應(yīng)用程序根據(jù)gfsserver返回的具體chunk數(shù)據(jù)塊位置信息,直接訪問相應(yīng)的chunk server優(yōu)點:并發(fā)訪問,解決mater

15、擁堵。3.分布式結(jié)構(gòu)化數(shù)據(jù)表bigtable1) bigtable設(shè)計動機(jī)和目標(biāo)需要存儲管理海量的結(jié)構(gòu)化半結(jié)構(gòu)化數(shù)據(jù)海量的服務(wù)請求商用數(shù)據(jù)庫無法適用2)目標(biāo)廣泛的適用性:為一系列服務(wù)和應(yīng)用而設(shè)計的數(shù)據(jù)存儲系統(tǒng),可滿足對不同類型數(shù)據(jù)的存儲和操作需求很強(qiáng)的可擴(kuò)展性:根據(jù)需要可隨時自動加入或撤銷服務(wù)器節(jié)點高吞吐量數(shù)據(jù)訪問:提供p級數(shù)據(jù)存儲能力,每秒數(shù)百萬次的訪問請求高可用性和容錯性:保證系統(tǒng)在各種情況下度能正常運轉(zhuǎn),服務(wù)不中斷自動管理能力:自動加入和撤銷服務(wù)器,自動負(fù)載平衡簡單性:系統(tǒng)設(shè)計盡量簡單以減少復(fù)雜性和出錯率2) bigtable數(shù)據(jù)模型多維表通過行、列、時間戳一個行關(guān)鍵字(row key)

16、一個列關(guān)鍵字(column key)一個時間戳(time stamp)進(jìn)行索引和查詢定位的。行:列:時間戳:3) bigtable基本構(gòu)架主服務(wù)器新子表分配子表監(jiān)控:通過chubby完成。負(fù)債均衡:子表服務(wù)器負(fù)載均衡操作index64k block64k block64k blocksstable子表服務(wù)器bigtable中的數(shù)據(jù)都以子表形式保存在子表服務(wù)器上,客戶端程序也直接和子表服務(wù)器通信。子表的基本存儲結(jié)構(gòu)sstable,一個sstable實際上對應(yīng)于gfs中的一個64mb的數(shù)據(jù)塊(chunk),sstable中的數(shù)據(jù)進(jìn)一步劃分為64kb的子塊。一個子表服務(wù)器上的子表將進(jìn)一步由很多個ss

17、table構(gòu)成,每個sstable構(gòu)成最終的在底層gfs中的存儲單位。一個sstable還可以為不同的子表所共享,以避免同樣數(shù)據(jù)的重復(fù)存儲。子表尋址 子表地址以3級b+樹形式進(jìn)行索引;首先從chubby服務(wù)器中取得根子表,由根子表找到二級索引子表,最后獲取最終的sstable的位置4. hadoop 分布式文件系統(tǒng)hdfs1)hdfs基本構(gòu)架2) hdfs數(shù)據(jù)分布設(shè)計多副本數(shù)據(jù)塊形式存儲,按照塊的方式隨機(jī)選擇存儲節(jié)點,默認(rèn)副本數(shù)目是33) hdfs可靠性與出錯恢復(fù)datanode節(jié)點的檢測心跳:namenode 不斷檢測datanode是否有效若失效,則尋找新的節(jié)點替代,將失效節(jié)點數(shù)據(jù)重新分布

18、集群負(fù)載均衡數(shù)據(jù)一致性: 校驗和checksum主節(jié)點元數(shù)據(jù)失效multiple fsimage and editlogcheckpoint5. hadoop mapreduce的基本工作原理1) hadoop mapreduce基本構(gòu)架與工作過程hadoop mapreduce基本工作過程1、運行作業(yè)2、獲取作業(yè)id3、復(fù)制作業(yè)資源job.xml: 作業(yè)配置,例如mapper, combiner, reducer的類型,輸入輸出格式的類型等。job.jar: jar包,里面包含了執(zhí)行此任務(wù)需要的各種類,比如 mapper,reducer等實現(xiàn)。 job.spli

19、t: 文件分塊的相關(guān)信息,比如有數(shù)據(jù)分多少個塊,塊的大小(默認(rèn)64m)等。4、提交作業(yè)調(diào)用jobtracker對象的submitjob()方法來提交作業(yè).jobtracker會把將jobid放入taskscheduler變量中,然后以fifo的方式進(jìn)行調(diào)度。當(dāng)客戶作業(yè)被調(diào)度時,jobtracker會創(chuàng)建一個對象jobinprogress,將有關(guān)此作也的任務(wù)和記錄信息封裝其中,以便跟蹤任務(wù)的狀態(tài)和進(jìn)進(jìn)程信息。5、作業(yè)初始化從hdfs中讀取要執(zhí)行的作業(yè)所對應(yīng)的job.split,為初始化map任務(wù)的分配做好準(zhǔn)備。創(chuàng)建map 任務(wù)和reduce任務(wù). tasktracker和jobtrac

20、ker之間通過心跳機(jī)制來進(jìn)行通信。 tasktracker首先將自身的狀態(tài)發(fā)送到j(luò)obtracker,并根據(jù)自身條件選擇是向jobtracker請求新的task。jobtracker接收到tasktracker的心跳后,如果發(fā)現(xiàn)tasktracker在請求新的task,那么任務(wù)調(diào)度器就會將任務(wù)和任務(wù)信息封裝起來,返回給tasktracker。當(dāng)tasktracker從jobtracker返回的心跳信息中獲取新的任務(wù)信息時,它會將map 任務(wù)或者reduce 任務(wù)加入到對應(yīng)的任務(wù)槽中。6、執(zhí)行作業(yè)1.將job.split拷貝到本地;2. 將job.jar拷貝到本地;    3

21、. 將job的配置信息寫入job.xml;    4. 創(chuàng)建本地目錄,解壓job.jar;    5. 調(diào)用lunchtaskforjob()方法發(fā)布任務(wù)7、結(jié)果輸出對于執(zhí)行的任務(wù),所有tasktracker任務(wù)的執(zhí)行進(jìn)度信息都會匯總到j(luò)obtracker中,當(dāng)jobtracker接收到最后一個任務(wù)的已完成通知后,便把作業(yè)狀態(tài)設(shè)置為“成功” ,同時jobclient也會收到任務(wù)成功完成的通知,至此一個mapreduce任務(wù)就結(jié)束了。2) hadoop mapreduce主要組件文件輸入格式inputformat定義了數(shù)據(jù)文件如何分割和讀取,inputfi

22、le提供了以下一些功能:選擇文件或者其它對象,用來作為輸入定義inputsplits,將一個文件分開成為任務(wù)為recordreader提供一個工廠,用來讀取這個文件有一個抽象的類fileinputformat,所有的輸入格式類都從這個類繼承這個類的功能以及特性。當(dāng)啟動一個hadoop任務(wù)的時候,一個輸入文件所在的目錄被輸入到fileinputformat對象中。fileinputformat從這個目錄中讀取所有文件。然后fileinputformat將這些文件分割為一個或者多個inputsplits。通過在jobconf對象上設(shè)置jobconf.setinputformat設(shè)置文件輸入的格式。

23、輸入數(shù)據(jù)分塊inputsplitsinputsplit定義了輸入到單個map任務(wù)的輸入數(shù)據(jù)一個mapreduce程序被統(tǒng)稱為一個job,可能有上百個任務(wù)構(gòu)成inputsplit將文件分為64mb的大小,配置文件hadoop-site.xml中的mapred.min.split.size參數(shù)控制這個大小mapred.tasktracker.map.taks.maximum用來控制某一個節(jié)點上所有map任務(wù)的最大數(shù)目數(shù)據(jù)記錄讀入recordreaderinputsplit定義了一項工作的大小,但是沒有定義如何讀取數(shù)據(jù)recordreader實際上定義了如何從數(shù)據(jù)上轉(zhuǎn)化為一個(key,value)對

24、的詳細(xì)方法,并將數(shù)據(jù)輸出到mapper類中textinputformat提供了linerecordreader,讀入一個文本行記錄數(shù)據(jù)。mapper每一個mapper類的實例生成了一個java進(jìn)程(在某一個inputsplit上執(zhí)行)有兩個額外的參數(shù)outputcollector以及reporter,前者用來收集中間結(jié)果,后者用來獲得環(huán)境參數(shù)以及設(shè)置當(dāng)前執(zhí)行的狀態(tài)?,F(xiàn)在的版本用mapper.context提供給每一個mapper函數(shù),用來提供上面兩個對象的功能combiner合并相同key的鍵值對,減少partitioner時候的數(shù)據(jù)通信開銷conf.setcombinerclass(redu

25、ce.class);是在本地執(zhí)行的一個reducer,滿足一定的條件才能夠執(zhí)行。partitioner & shuffle在map工作完成之后,每一個 map函數(shù)會將結(jié)果傳到對應(yīng)的reducer所在的節(jié)點,此時,用戶可以提供一個partitioner類,用來決定一個給定的(key,value)對傳輸?shù)木唧w位置。sort傳輸?shù)矫恳粋€節(jié)點上的所有的reduce函數(shù)接收到得key,value對會被hadoop自動排序(即map生成的結(jié)果傳送到某一個節(jié)點的時候,會被自動排序)reducer做用戶定義的reduce操作接收到一個outputcollector的類作為輸出最新的編程接口是reduc

26、er.context文件輸出格式outputformat寫入到hdfs的所有outputformat都繼承自fileoutputformat每一個reducer都寫一個文件到一個共同的輸出目錄,文件名是part-nnnnn,其中nnnnn是與每一個reducer相關(guān)的一個號(partition id)fileoutputformat.setoutputpath()jobconf.setoutputformat()recordwritertextoutputformat實現(xiàn)了缺省的linerecordwriter,以”key,value”形式輸出一行結(jié)果。3) 容錯處理與計算性能優(yōu)化由hadoo

27、p系統(tǒng)自己解決主要方法是將失敗的任務(wù)進(jìn)行再次執(zhí)行tasktracker會把狀態(tài)信息匯報給jobtracker,最終由jobtracker決定重新執(zhí)行哪一個任務(wù)為了加快執(zhí)行的速度,hadoop也會自動重復(fù)執(zhí)行同一個任務(wù),以最先執(zhí)行成功的為準(zhǔn)(投機(jī)執(zhí)行)mapred.map.tasks.speculative.executionmapred.reduce.tasks.speculative.execution6. hadoop 分布式文件系統(tǒng)hdfs編程filesystem基類filesystem是一個用來與文件系統(tǒng)交互的抽象類,可以通過實現(xiàn)filesystem的子類來處理具體的文件系統(tǒng),比如hd

28、fs或者其它文件系統(tǒng)通過factory方法filesystem.get(configuration conf)獲得所需的文件系統(tǒng)實例configuration conf = new configuration();filesystemhdfs= filesystem.get(conf);hadoop中,使用path類的對象來編碼目錄或者文件的路徑,使用filestatus類來存放目錄和文件的信息。創(chuàng)建文件create方法有很多種定義形式,但一般僅需使用簡單的幾種public fsdataoutputstreamcreate(pathf);public fsdataoutputstreamcre

29、ate(pathf,booleanoverwrite);public fsdataoutputstreamcreate(pathf,booleanoverwrite,intbuffersize);打開文件filesystem.open方法有2個,參數(shù)最多的一個定義如下:public abstract fsdatainputstreamopen(path f,intbuffersize)throws ioexceptionf: 文件名buffersize:文件緩存大小。默認(rèn)值:configuration中io.file.buffer.size的值,如果configuration中未顯式設(shè)置該值則

30、是4096。獲取文件信息filesystem.getfilestatus方法格式如下:public abstract filestatusgetfilestatus(path f) throws ioexception;返回一個filestatus對象。filestatus保存文件的很多信息,包括:path:文件路徑length:文件長度isdir:是否為目錄block_replication: 數(shù)據(jù)塊副本因子blocksize:文件長度(數(shù)據(jù)塊數(shù))modification_time: 最近一次修改時間access_time: 最近一次訪問時間owner:文件所屬用戶group:文件所屬組如果

31、想了解文件的這些信息,可以在獲得文件的filestatus實例之后,調(diào)用相應(yīng)的getxxx方法(比如,filestatus.getmodificationtime()獲得最近修改時間)獲取目錄信息獲取目錄信息,不僅是目錄本身,還有目錄之下的文件和子目錄信息:public filestatus liststatus(pathf) throws ioexception;如果f是目錄,那么將目錄之下的每個目錄或文件信息保存在filestatus數(shù)組中返回。如果f是文件,和getfilestatus功能一致。另外,liststatus還有參數(shù)為path的版本的接口定義以及參數(shù)帶路徑過濾器pathfil

32、ter的接口定義,參數(shù)為path的liststatus就是對這個數(shù)組中的每個path都調(diào)用上面的參數(shù)為path的liststatus。參數(shù)中的pathfilter則是一個接口,實現(xiàn)接口的accept方法可以自定義文件過濾規(guī)則。文件讀取調(diào)用open打開文件之后,使用了一個fsdatainputstream對象來負(fù)責(zé)數(shù)據(jù)的讀取。通過fsdatainputstream進(jìn)行文件讀取時,提供的api就是fsdatainputstream.read方法:public intread(longposition, bytebuffer,intoffset, intlength) throws ioexcept

33、ion從文件的指定位置position開始,讀取最多l(xiāng)ength字節(jié)的數(shù)據(jù),保存到buffer中從offset個元素開始的空間中;返回值為實際讀取的字節(jié)數(shù)。此函數(shù)不改變文件當(dāng)前offset值。但使用更多的還有一種簡化版本:public final intread(byteb)throws ioexception從文件當(dāng)前位置讀取最多長度為b.len的數(shù)據(jù)保存到b中,返回值為實際讀取的字節(jié)數(shù)。文件寫入從接口定義可以看出,調(diào)用create創(chuàng)建文件以后,使用了一個fsdataoutputstream對象來負(fù)責(zé)數(shù)據(jù)的寫入。通過fsdataoutputstream進(jìn)行文件寫入時,最常用的api就是wri

34、te方法:public void write(byte b,int off,int len)throws ioexception函數(shù)的意義是:將b中從off開始的最多l(xiāng)en個字節(jié)的數(shù)據(jù)寫入文件當(dāng)前位置。返回值為實際寫入的字節(jié)數(shù)。關(guān)閉關(guān)閉為打開的逆過程,filesystem.close定義如下:public void close()throws ioexception不需要其它操作而關(guān)閉文件。釋放所有持有的鎖。刪除public abstract booleandelete(path f,boolean recursive)throws ioexceptionf: 待刪除文件名recursive:

35、如果recursive為true,并且f是目錄,那么會遞歸刪除f下所有文件。f是文件的話,recursive為true還是false無影響。另外,類似java中file的接口deleteonexit,如果某些文件需要刪除,但是當(dāng)前不能被刪;或者說當(dāng)時刪除代價太大,想留到退出時再刪除的話,filesystem中也提供了一個deleteonexit接口:public booleandeleteonexit(pathf) throws ioexception標(biāo)記文件f,當(dāng)文件系統(tǒng)關(guān)閉時才真正刪除此文件,但是這個文件f必須存在。ch.5. mapreduce算法設(shè)計1. mapreduce可解決哪些算

36、法問題?mapreduce可廣泛應(yīng)用于搜索引擎(文檔倒排索引,網(wǎng)頁鏈接圖分析與頁面排序等)、web日志分析、文檔分析處理、機(jī)器學(xué)習(xí)、機(jī)器翻譯等各種大規(guī)模數(shù)據(jù)并行計算應(yīng)用領(lǐng)域各類大規(guī)模數(shù)據(jù)并行處理算法。2. mapreduce排序算法3. mapreduce單詞同現(xiàn)分析算法語料we are not whatwe want to bebut at leastwe are not whatwe used to beafter map(<we, are>, 1)(<are, not>, 1)(<not, what>, 1)(<we, want>, 1)(

37、<want, to>, 1)(<to, be>, 1)(<but, at>,1)(<at, least>,1)(<we, are>,1)(<are, not>,1)(<not, what>,1)(<we , used>,1)(<used, to>,1)(<to, be>,1)after shuffle and sort(<we, are>,1,1)(<are, not>,1,1)(<not, what>,1,1)(<we, want&

38、gt;,1)(<want, to>,1)(<to, be>,1,1)(<but, at>, 1)(<at, least>, 1)(<we, used>, 1)(<used, to>, 1)after reduce(<we, are>,2)(<are, not>,2)(<not, what>,2)(<we, want>,1)(<want, to>,1)(<to, be>,2)(<but, at>,1)(<at, least>,1)

39、(<we, used>,1)(<used, to>,1)4. 文檔倒排索引算法改進(jìn):map輸出的key除了文件名,還給出了該詞所在行的偏移值:格式:filename#offsetmapper:text filename_lineoffset= new text(filename+”#”+key.tostring();stringtokenizeritr= new stringtokenizer(value.tostring();for(; itr.hasmoretokens(); ) word.set(itr.nexttoken();context.write(word

40、, filename_lineoffset);reducerprotected void reduce(text key, iterable<text> values, context context)throws ioexception, interruptedexceptioniterator<text> it = values.iterator();stringbuilderall = new stringbuilder();if(it.hasnext() all.append(it.next().tostring();for(; it.hasnext(); )

41、all.append(“;");all.append(it.next().tostring();context.write(key, new text(all.tostring(); /最終輸出鍵值對示例:(“fish", “doc1#0; doc1#8;doc2#0;doc2#8 ")5. 專利文獻(xiàn)數(shù)據(jù)分析patent description data set “apat63_99.txt” “patent”,”gyear”,”gdate”,”appyear”,”country”, ”postate”,”assignee”, ”asscode”,”claims”

42、,”nclass”,”cat”,”subcat”,”cmade”,”creceive”, ”ratiocit”,”general”,”original”,”fwdaplag”,”bckgtlag”,”selfctub”, ”selfctlb”,”secdupbd”,”secdlwbd”3070801,1963,1096,”be”,”,1,269,6,69,1,0,3070802,1963,1096,”us”,”tx”,1,2,6,63,0,3070803,1963,1096,”us”,”il”,1,2,6,63,9,0.3704,3070804,1963,1096,”us”,”oh”,1,2,

43、6,63,3,0.6667,3070805,1963,1096,”us”,”ca”,1,2,6,63,1,0,public void map(longwritable key, text value, context context)throws ioexception, interruptedexception / 輸入key: 行偏移值;value: “citing專利號, cited專利號” 數(shù)據(jù)對string citation = value.tostring().split(“,”);context.write(new text(citation1), new text(citati

44、on0); / 輸出key: cited 專利號;value: citing專利號public void reduce(text key, iterable<text> values, context context)throws ioexception, interruptedexception string csv = “”;for (text val:values) if (csv.length() > 0) csv += “,”; csv += val.tostring();context.write(key, new text(csv); / 輸出key: cite

45、d專利號;value: “citing專利號1, cited專利號2,” 專利被引次數(shù)直方圖統(tǒng)計直接用hadoop內(nèi)置的keyvalue文本輸入格式讀取以key-value對形式保存的專利被引次數(shù)統(tǒng)計輸出結(jié)果job.setinputformat(keyvaluetextinputformat.class);年份/國家專利數(shù)統(tǒng)計patent description data set “apat63_99.txt”“patent”,”gyear”,”gdate”,”appyear”,”country”, ”postate”,”assignee”, ”asscode”,”claims”,”nclas

46、s”,”cat”,”subcat”,”cmade”,”creceive”, ”ratiocit”,”general”,”original”,”fwdaplag”,”bckgtlag”,”selfctub”, ”selfctlb”,”secdupbd”,”secdlwbd”3070801,1963,1096,”be”,”,1,269,6,69,1,0,3070802,1963,1096,”us”,”tx”,1,2,6,63,0,3070803,1963,1096,”us”,”il”,1,2,6,63,9,0.3704,3070804,1963,1096,”us”,”oh”,1,2,6,63,3,

47、0.6667,3070805,1963,1096,”us”,”ca”,1,2,6,63,1,0,主要設(shè)計思想是:分析以上的專利描述數(shù)據(jù)集,根據(jù)要統(tǒng)計的列名(年份或國家等),取出對應(yīng)列上的年份(col_idx=1)或國家(col_idx=4),然后由map發(fā)出(year,1)或(country,1),再由reduce累加。年份專利統(tǒng)計輸出每年申請美國專利的國家數(shù)統(tǒng)計 假如我們需要從專利描述數(shù)據(jù)集中統(tǒng)計每年有多少個國家申請了美國專利,并得出如下的統(tǒng)計直方圖,該如何實現(xiàn)map和reduce?每年申請美國專利的國家數(shù)統(tǒng)計solution 11. map中用<year, country>作為

48、key輸出,emit(<year, country>,1) (<1963, be>, 1), (<1963, us>, 1), (<1963, us>, 1), 2. 實現(xiàn)一個定制的partitioner,保證同一年份的數(shù)據(jù)劃分到同一個reduce節(jié)點3. reduce中對每一個(<year, country>, 1, 1,1,)輸入,忽略后部的出現(xiàn)次數(shù),僅考慮key部分:<year, country> 問題:如每碰到一個<year, country >,即emit(year, 1)有問題嗎?答案:有問題。因為

49、可能會有從不同map節(jié)點發(fā)來的同樣的<year, country>, 因此會出現(xiàn)對同一國家的重復(fù)計數(shù)解決辦法:在reduce中僅計數(shù)同一年份下不同的國家個數(shù)問題: map結(jié)果(<year, country>, 1, 1,1,)數(shù)據(jù)通信量較大解決辦法:實現(xiàn)一個combiner將1, 1,1,合并為1solution 21. map中用一個數(shù)據(jù)結(jié)構(gòu)保存<year, country>,并檢查一個新的<year, country>是否已經(jīng)出現(xiàn),若未出現(xiàn)則emit(year,country)并將<year, country>加入數(shù)據(jù)結(jié)構(gòu);否則跳

50、過。如此在每個map節(jié)點上可保證一個年份下一個國家僅出現(xiàn)一次2. reduce中對每一個(year, country,country,country)輸入直接計數(shù)其中的country個數(shù)有問題嗎?答案:有問題。因為可能會有從不同map節(jié)點發(fā)來的同樣的<year, country>, 因此會出現(xiàn)對同一國家的重復(fù)計數(shù)解決辦法:在reduce中僅計數(shù)同一年份下不同的國家個數(shù)ch.6. hbase與hive程序設(shè)計1. hbase基本工作原理可與mapreduce協(xié)同工作,為mapreduce提供數(shù)據(jù)輸入輸出,以完成數(shù)據(jù)的并行化處理與bigtable類似,一個行關(guān)鍵字(row key)、一

51、個列關(guān)鍵字(column key)、一個時間戳(time stamp)進(jìn)行索引和查詢定位的。hbase物理存儲格式物理存儲格式上按邏輯模型中的行進(jìn)行分割,并按照列族存儲。值為空的列不予存儲,節(jié)省存儲空間。a. hbase的基本構(gòu)架由一個masterserver和由一組子表數(shù)據(jù)區(qū)服務(wù)器regionserver構(gòu)成,分別存儲邏輯大表中的部分?jǐn)?shù)據(jù).大表中的底層數(shù)據(jù)存于hdfs中b. hbase數(shù)據(jù)存儲管理方法與bigtable類似,大表被分為很多個子表(region),每個子表存儲在一個子表服務(wù)器regionserver上每個子表中的數(shù)據(jù)區(qū)region由很多個數(shù)據(jù)存儲塊store構(gòu)成.而每個stor

52、e數(shù)據(jù)塊又由存放在內(nèi)存中的memstore和存放在文件中的storefile構(gòu)成hbase子表數(shù)據(jù)存儲與子表服務(wù)器c. hbase數(shù)據(jù)的訪問1)當(dāng)客戶端需要進(jìn)行數(shù)據(jù)更新時,先查到子表服務(wù)器,然后向子表提交數(shù)據(jù)更新請求。提交的數(shù)據(jù)并不直接存儲到磁盤上的數(shù)據(jù)文件中,而是添加到一個基于內(nèi)存的子表數(shù)據(jù)對象memstore中,當(dāng)memstore中的數(shù)據(jù)達(dá)到一定大小時,系統(tǒng)將自動將數(shù)據(jù)寫入到文件數(shù)據(jù)塊storefile中。2) 每個文件數(shù)據(jù)塊storefile最后都寫入到底層基于hdfs的文件中3) 需要查詢數(shù)據(jù)時,子表先查memstore。如果沒有,則再查磁盤上的storefile。每個storefil

53、e都有類似b樹的結(jié)構(gòu),允許進(jìn)行快速的數(shù)據(jù)查詢。storefile將定時壓縮,多個壓縮為一個4) 兩個小的子表可以進(jìn)行合并;子表大到超過某個指定值時,子表服務(wù)器就需要調(diào)用hregion.closeandsplit(),把它分割為兩個新的子表。d. hbase主服務(wù)器hserver與bigtable類似,hbase使用主服務(wù)器hserver來管理所有子表服務(wù)器。主服務(wù)器維護(hù)所有子表服務(wù)器在任何時刻的狀態(tài)。當(dāng)一個新的子表服務(wù)器注冊時,主服務(wù)器讓新的子表服務(wù)器裝載子表。若主服務(wù)器與子表服務(wù)器連接超時,那么子表服務(wù)器將自動停止,并重新啟動;而主服務(wù)器則假定該子表服務(wù)器已死機(jī),將其上的數(shù)據(jù)轉(zhuǎn)移至其它子表服

54、務(wù)器,將其上的子表標(biāo)注為空閑,并在重新啟動后另行分配使用。e. hbase數(shù)據(jù)記錄的查詢定位描述所有子表和子表中數(shù)據(jù)塊的元數(shù)據(jù)都存放在專門的元數(shù)據(jù)表中,并存儲在特殊的子表中。子表元數(shù)據(jù)會不斷增長,因此會使用多個子表來保存。而所有元數(shù)據(jù)子表的元數(shù)據(jù)都保存在根子表中。主服務(wù)器會掃描根子表,從而得到所有的元數(shù)據(jù)子表位置,再進(jìn)一步掃描這些元數(shù)據(jù)子表即可獲得所尋找子表的位置。hbase使用三層類似b+樹的結(jié)構(gòu)來保存region位置第一層是保存zookeeper里面的文件,它持有root region的位置。第二層root region是.meta.表的第一個region其中保存了.meta.表其它reg

55、ion的位置。通過root region,我們就可以訪問.meta.表的數(shù)據(jù)。.meta.是第三層,它是一個特殊的表,保存了hbase中所有數(shù)據(jù)表的region 位置信息。2. hbase基本操作與編程方法示例a. hbase shell 操作(命令行操作)創(chuàng)建表格create 表名,字段1,字段2,與列舉表格list插入表格記錄put 表名,值1,值2,描述表信息(列出表格的基本信息,元數(shù)據(jù))describe 表名掃描數(shù)據(jù)(列出表格的記錄信息)scan 表名限制列進(jìn)行掃描scan 表名,columns=>字段b. hbase中的disable和enabledisable和enable都

56、是hbase中比較常見的操作,很多對table的修改都需要表在disable的狀態(tài)下才能進(jìn)行.disable students將表students的狀態(tài)更改為disable的時候,hbase會在zookeeper中的table結(jié)點下做記錄.在zookeeper記錄下該表的同時,還會將表的region全部下線,region為offline狀態(tài).enable的過程和disable相反,會把表的所有region上線,并刪除zookeeper下的標(biāo)志。如果在enable前,meta中有region的server信息,那么此時會在該server上將該region online;如果沒有server的信息,那么此時還要隨機(jī)選擇一臺機(jī)器作為該region的serverc. hbase的java編程創(chuàng)建表創(chuàng)建

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論