hadoop最早只是單純的值分布式計算系統,但隨著時代的發展,目前hadoop已成了乙個完整的技術家族。從底層的分布式檔案系統(hdfs)到頂層的資料解析執行工具(hive, pig),再到分布式協調服務(zookeeper),以及流行的分布式資料庫(hbase),都屬於hadoop家族,幾乎涵蓋了大部分大資料應用場景。在spark沒流行之前,hadoop一直是大資料應用中的絕對主流,即使是現在,依舊有大量的中小型公司,還是依靠hadoop搭建大資料系統。
雖然如今hadoop家族龐大,但早年hadoop結構非常簡單,幾乎只有兩塊:乙個是分布式檔案系統,乙個是mapreduce演算法。
大資料時代,資料動輒以tb,pb計算。那麼海量的資料,用常規的方法非常困難,因為即使是o(n)的演算法,將所有資料都遍歷一遍,所消耗的時間也是以小時計,這顯然是不能接受的。不僅如此,像mysql這樣的資料庫對於資料規模也是有限制的,一旦資料規模巨大,超過了資料庫的承載能力,那幾乎是系統級的噩夢。
既然我們把資料全部儲存在一起,會導致系統問題,那麼我們可不可以把資料分成很多份,在分別儲存;當我們需要處理這些資料的時候,我們對這些分成許多小份的資料分別處理,最後再合併再一起?
答案當然是可行的,hadoop檔案系統正式基於這個思路。
在hdfs中,將資料分割成乙個個小份,每個小份叫做乙個資料塊,每個儲存塊為64mb。這樣乙個巨大的檔案會被打散儲存在許多儲存塊中。當我們需要操作這些資料的時候,hadoop會同時啟動許多個執行器(executor)來併發執行這些儲存塊。理論上來說,執行器的數量越多,執行的速度也越快。只要我們有足夠多的執行器,就可以在短時間內完成海量資料的計算工作。
原因也很簡單,因為資料儲存在磁碟上,當我們查詢資料的時候,cpu其實是不知道資料究竟存放在什麼地方的。需要有乙個專門的程式去查詢資料的位置,這個過程被稱為定址。定址的時候回伴隨硬碟的高速旋轉。硬碟的旋轉速度是有限的,所以我們查詢檔案的速度也存在瓶頸。如果儲存塊太小,那麼儲存塊的數量就會很多,我們定址的時間就會變長。
如果儲存塊設定的大一些行不行?也不行,因為我們在執行的時候,需要把儲存塊的資料copy到執行器的記憶體裡執行,這個copy是伴隨著讀寫和網路傳輸操作,傳輸資料同樣耗時不少。儲存塊過大,會導致讀寫的時間過長,目前網路頻寬最多可嘴鷗到100mb/s,根據計算,每個塊大約在100mb左右最佳,也許程式設計師為了湊整,所以選了64mb這個大小。
那麼,hadoop怎樣做併發計算的呢?這就該mapreduce出場了。
嚴格說,mapreduce不是一種演算法,而是一種計算思想。他有map和reduce兩個階段組成。
為什麼要返回key->value的結構呢?直接返回value不行嗎?
為什麼一開始的時候,要處理成key->value結構呢?為什麼又要將key值相同的資料放入乙個reducer中呢?這有什麼意義?
這裡舉例說明:
mapreduce有乙個景點問題,叫做wordcount,就是給定一堆文字,最後計算出文字中每個單詞分別出現的次數。map階段很簡單,我們遍歷出文字當中的單詞,沒遇到乙個單詞,就輸出單詞和數字1.
這樣當然還是不夠的,我們還需要把相同的單詞聚合起來,清點一下看究竟出現了多少次,這時就要用到reducer了。reducer也很簡單,我們讀入的是map輸出的結果。由於key相同的資料都會進入到同乙個reducer當中,所以我們不需要擔心遺漏,只需要直接統計就行。
如果map結果不是key->value結構,那麼hadoop久沒辦法根據key進行排序,並將key相同的資料歸併在起義。那麼我們reduce的時候,同乙個單詞就可能出現在不同的reducer當中,這樣的結果顯然是不正確的。
當然,如果我們只做一些簡單的操作,也可以捨棄reduce階段,只保留map的結果。
現在看mapreduce的思想並不複雜,但當年大資料還未興起的時候,mapreduce橫空出世,既提公升了計算效能,又保證結果準確。一舉解決了大規模資料平行計算的問題。雖然如今技術更新,尤其是spark的流行,搶走了hadoop的許多榮光,但mapreduce思想依舊在許多領域廣泛使用,比如python就支援mapreduce操作,允許使用者自定義map和reduce函式,對資料進行並行處理。
不過,mapreduce也有短板,比如像資料庫表join操作通過mapreduce就很難實現。而且相比後來的hive赫爾spark sql來說,mapreduce的編碼複雜度要更大一些。
hadoop批量計算框架 MapReduce
結合自身的經驗記錄,mapreduce中的一些知識點以及乙個wordcount小實踐 核心思想 分而治之 map程式 需要根據自己的需求開發 shuffle 緩衝區大小設定 core site.xml設定為100m io.file.buffer.size 100000000 以位元組為單位 hdfs...
Hadoop的分布式計算 MapReduce
什麼是mapreduce?你想數出一摞牌中有多少張黑桃。直觀方式是一張一張檢查並且數出有多少張是黑桃。mapreduce方法則是 1.給在座的所有玩家中分配這摞牌 2.讓每個玩家數自己手中的牌有幾張是黑桃,然後把這個數目匯報給你 3.你把所有玩家告訴你的數字加起來,得到最後的結論 1 mapredu...
Hadoop基本原理之一 MapReduce
1 為什麼需要hadoop 目前,一塊硬碟容量約為1tb,讀取速度約為100m s,因此完成一塊硬碟的讀取需時約2.5小時 寫入時間更長 若把資料放在同一硬碟上,且全部資料均需要同乙個程式進行處理,此程式的處理時間將主要浪費在i o時間上。在過去幾十年,硬碟的讀取速度並未明顯增長,而網路傳輸速度此飛...