以前聽別人說起雲計算的時候,總覺得它是乙個高大上的乙個東西,因為自己不知道,會覺得它會很難吧。但這幾天自己自己靜下心來,看了一些相關方面的書後,發現它沒有想象中的那麼深奧,只是時代發展的產物罷了,是隨著網際網路的發展產生的大資料應運而生的一種東西。
hadoop系統可以高效的儲存、管理、分析海量資料,hadoop的核心是mapreduce和hdfs,先談一下hdfs的基本架構吧,hdfs採用主從檔案架構對檔案系統進行管理。乙個hdfs集群是由乙個namenode和一定數目的datanode組成的。預設hdfs資料塊大小是64mb,hdfs上的檔案也進行分塊,塊是hdfs的檔案儲存處理的單元。和普通檔案系統不同的是,hdfs中,如果乙個檔案小於乙個資料塊的大小,並不占用整個資料塊儲存空間。namenode是乙個中心伺服器,負責管理檔案系統的名字空間以及客戶端對檔案的訪問。集群中的datanode一般是乙個節點執行乙個datanode程序,負責管理他所在節點上的儲存。hdfs展示了檔案系統的名字空間,使用者能夠以檔案的形式在上面儲存資料。從內部看,乙個檔案其實被分成乙個或多個資料塊,這些塊儲存在一組datanode上。datanode執行檔案系統的名字空間模組,比如開啟、關閉、重新命名檔案或目錄。它也負責資料塊到具體datanode節點的對映。datanode負責處理檔案系統客戶端的讀/寫請求,在namenode的統一排程下進行資料塊的建立、刪除和複製。
下面說一下hdfs中的讀和寫檔案流程,先說一下讀檔案的流程:
如上圖所示:
1、客戶端(client)用filesystem的open()函式開啟檔案,對應於具體的hdfs檔案系統,dfs建立輸入流fsdatainputstream返回給客戶端,客戶端使用這個輸入流讀取資料;
2、dfs用rpc呼叫namnode節點,得到檔案的資料塊的位址,對於每乙個資料塊,namenodf返回儲存資料塊的資料節點的位址;
3、客戶端呼叫fsdatainputstream.read()方法讀取檔案資料時,dfsinputstream物件通過和datanode間的「讀資料「介面,和最近的datanode建立聯絡,客戶端反覆呼叫read()方法,資料會通過datanode和客戶端連線上的資料報返回客戶端。當到達塊的末端時,dfsinputstream會關閉和資料節點間的連線,並通過遠端呼叫getblocklocations()方法得到下乙個資料塊的datanode資訊,再讀取資料;
4、由於客戶端的getblocklocation()不會一次返回檔案的所有的資料塊的資訊,dfsinpustream可能需要多次使用該遠端方法,檢索下一組資料塊的位置資訊,對於客戶端來說,他讀取的是乙個連續的資料流,當客戶端完成讀取任務時,通過close()方法關閉輸入流。
然後介紹一下客戶端寫檔案的過程:
如上圖所示:
1、客戶端呼叫dfs的create()方法建立檔案,這是dfs建立dfsoutputstream,並由遠端過程呼叫,讓namdnode執行同名方法,在檔案系統的命名空間中建立乙個新檔案。datanode建立乙個新檔案後,並將記錄建立操作到編輯日誌edits,遠端方法呼叫結束後,dfs將dfsoutputstream物件包裹到fsdataouputstream例項中,返回給客戶端;(如圖1,2)
2、客戶端寫入檔案時,由於create()方法呼叫建立了乙個空檔案,所以,dfsoutputstream例項首先需要向namenode申請資料塊,addblock()方法成功執行後,返回乙個locatedblock物件,該物件包含了新資料塊的資料塊標示和版本號。
3、通過上述資訊,dfsoutputstream就可以和datanode聯絡,通過寫資料介面建立資料流管道。客戶端寫入fsdataoutputstream流中的資料,被打包成乙個乙個的檔案包,放入dfsoutputstream物件的內部佇列,該佇列中的檔案包最終被打包成資料報,發往資料流管道,流經資料流管道上的各個datanode,並持久化。確認包逆流而上,從資料流管道依次次發往客戶端,客戶端收到應答時,他將對應的包內部佇列移除。
4、dfsoutputstream在寫完乙個資料塊時,資料流管道上的節點,會通過和namdnode的遠端介面的blockreceived()方法,向datanode提交資料塊,如果資料佇列中還有等待輸出的資料,dfsinputstream物件再次呼叫addblock()方法,為檔案新增新的資料塊。
5、客戶端完成資料的寫入後,呼叫close方法關閉流,關閉意味著客戶端不會再往流中寫入資料,所以,當dfsoutputstream資料佇列中的檔案包都收到應答後,就可以使用客戶端的clientprotocol.complete()方法通知namenode關閉檔案,完成一次正常的寫檔案流程;
從上述檔案的讀寫過程可以看出,客戶端讀寫資料是直接和datanode建立資料流管道來讀寫資料的,而namenode是用來管理datanode的。
理解了hdfs的基本架構後,下面來談一下mapredude:
如圖所示:在hadoop中,每個mapreduce任務都被初始化為乙個job,每個job又可以分為兩種階段:map階段和reduce階段。這兩個階段分別用兩個函式表示,即map函式和reduce函式。map函式接收乙個形式的輸入,然後同樣產生乙個形式的中間輸出,hadoop函式接收乙個如形式的輸入,然後對這個value集合進行處理,每個reduce產生0或1個輸出,reduce的輸出也是形式的。其實map的過程就是乙個乙個統計的過程,而reduce的過程則是對map統計的結果進行再統計的過程,即是對每乙個key出現的次數進行統計的過程,即將相同的統計在一起。
例項中如果我們要統計**引用的次數的話,需要遍歷**,一一計數,因為文章數量很多,需要進行很多次內外存交換,這無疑會延長程式的執行時間,用mapreduce會高效率的解決這個問題。
其實這些框架,只有我們真正地用在例項中,才會理解地更深入,期待進一步的發現。
UML之初感悟
uml是什麼?它不是乙個程式語言,不是乙個形式化語言,它是用來設計軟體藍圖的視覺化建模語言。uml貫徹著軟體開發的整個過程,被omg object management group 物件管理組織採納作為業界的標準。uml包括什麼?uml語義 描述基於uml的精確元模型定義。元模型為uml的所有元素在...
騰躍雲 我的感悟
當初走進網路的時候是迫不及待 懷揣夢想的。當自己真正踏入小小的網路賺錢以後感覺和當初想的有好大的差距。幻想和現實始終是乙個天上乙個地上。每天看著父母起早貪黑的努力打工。早上剛剛濛濛亮他們就要起床穿上冰涼而潮濕的衣服 誰也不想打工誰也想玩耍。但是父母沒得選擇 父母為了在資本控制的房價裡為自己的兒女買一...
智慧型計算快速入門之初識
智慧型計算,也稱為計算智慧型,包括遺傳演算法 模擬退火演算法 禁忌搜尋演算法 進化演算法 啟發式演算法 蟻群演算法 人工魚群演算法,粒子群演算法 混合智慧型演算法 免疫演算法 人工智慧 神經網路 機器學習 生物計算 dna計算 量子計算 智慧型計算與優化 模糊邏輯 模式識別 知識發現 資料探勘等。所...