1.自己設計一個并行計算框架,應該需要考慮那些問題呢?
第一個問題是:并行計算肯定是多臺計算機嗎,多臺計算機他們之間如何劃分任務?
這個地方總歸有一個模塊來分發任務,也就意味這它就是老大,它來維護任務或者資源
mapreduce在hadoop 1.x版本上是jobtracker,hadoop 2.x版本是通過yarn來管理的,它是ResourceManager,來管理其他節點以及如何分布任務的。
小弟在Hadoop 1.x版本上是tasktracker,在hadoop2版本上是NodeManager,NodeManager在啟動一個進程YARNchild來運行處理計算數據。
第二個問題是:并行計算所需的計算數據從哪里來?
一個任務很大,如果都讓放在老大那邊,是不是壓力很大嗎?所以他們使用現成的可以存儲數據的hdfs來負責存儲數據,客戶端向ResourceManager得到任務允許之后,然后將所需jar包,依賴都放在hdfs節點上,讓他們自己都去取所需任務,老大只要告訴他們一定的標志就可以了嗎。
第三個問題是:并行計算計算出來的結果,如何進行匯總?
并行計算計算出來的數據,最終還是寫給了hdfs,不可能寫給老大,老大可能還要連續接受別人給的新任務,也不可能放在每個節點上,這樣數據過于離散,最后還是選擇了繼續放在hdfs上,放在hdfs上,根據需要可以是多個文件,也可以是一個文件。
第四個問題是:如何在這個過程中有的任務失敗了,會想什么辦法來彌補呢?
他們通過rpc通信,(也就是所謂的心臟跳動機制,來時不時給老大反饋,)老大在讓其它nodeManager來繼續干這些事情,來彌補計算。
2.mapreduce的運行流程是什么?
client
jobtracker
inputsplit ->mapper()
mapoutput ----shuffle---reducer() ------>output
inputsplit ->mapper()
inputsplit:一個inputsplit對應這一個map函數 :也就一行作為一個mapper函數來處理。
mapper輸出[hello 1] [zhang 1] [san 1]
shuffle:對起所需結果,進行分組。如hello 一組,[hello, (1,1,1)]
reduceer:輸出 hello 5
zhangsan 1
序列化講解:
序列化可以將內存中的類寫入文件或數據庫中。比如將某個類序列化后存為文件,下次讀取時只需將文件中的數據反序列化就可以將原先的類還原到內存中。也可以將類序列化為流數據進行傳輸。(objectinputstream這個類就是干這個用的)。對象、文件、數據,有許多不同的格式,很難統一傳輸和保存
序列化以后就都是字節流了,無論原來是什么東西,都能變成一樣的東西,就可以進行通用的格式傳輸或保存,傳輸結束以后,要再次使用,就進行反序列化還原,這樣對象還是對象,文件還是文件。
hadoop中數據要在網絡之間傳輸,必須實現序列化(將內存中對象以流的形式寫給其他節點)
Hadoop使用自己的高效序列化機制來代替Java版的序列化機制(string,long等都實現seriable),
hadoop序列化機制必須實現writable接口。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。