使用hadoop進行大規模資料的全域性排序

2021-06-21 22:36:00 字數 3105 閱讀 1771

hadoop(某人兒子的乙隻虛擬大象的名字)是乙個複雜到極致,又簡單到極致的東西。

說它複雜,是因為乙個hadoop集群往往有幾十台甚至成百上千臺low cost的計算機組成,你執行的每乙個任務都要在這些計算機上做任務的分發,執行中間資料排序以及最後的彙總,期間還包含節點發現,任務的重試,故障節點替換等等等等的維護以及異常情況處理。誰叫hadoop集群往往都是由一些平民計算機組成,沒事兒罷個工什麼的,實在是再尋常不過的事情。

而說其簡單,則是因為,上面說到的那些,你通通不用管,你所需要做的,就是寫乙個程式,當然也可以是指令碼,從標準輸入讀入一條資料,處理完之後,把結果輸出到標準輸出。

現在,或許你就明白了,hadoop就是乙個計算模型。乙個分布式的計算模型。

天下大事,分久必合、合久必分。

所謂分布式計算,就是把一大堆用於計算的資料材料切了,扔到多個鍋裡面,該焯水的焯水,該油炸的油炸。然後都準備的差不多了,按著一定的先後順序,比如不好熟的先放,好熟的後放什麼的,一塊下鍋炒成一盤菜出來,端出來上桌。

前面的步驟,就是map,分發。map的作用就是把輸入資料打散,做簡單的處理,輸出。而hadoop則要先將中間資料排序,這個稱為shuffle,然後由reduce把中間資料合併到一起。將最終結果輸出。

舉個簡單的例子:公安局要根據資料庫內身份證號獲得全國每個地市人口數情況(好吧,這個應該是統計局做的),這個任務落到你的頭上了,你應該先把所有的身份證號匯出到檔案中,每行乙個,然後把這些檔案交給map。map中的要做的就是擷取身份證號的前面六位,把這六位數字直接輸出。然後hadoop會把這些身份證號的前六位排序,把相同的資料都排到一起,交給reduce,reduce判斷每次輸入的號碼是否與上乙個處理的相同,相同則累加,不同則把之前的號碼,和統計的數值輸出。這樣,你就獲得了各地市的人口數統計。

下面這個圖就是map和reduce處理的圖示。

上圖是mapreduce的資料處理檢視。分為map,shuffle,reduce三個部分。各map任務讀入切分後的大規模資料進行處理並將資料作為一系列key:value對輸出,輸出的中間資料按照定義的方式通過shuffle程式分發到相應的reduce任務。shuffle程式還會按照定義的方式對傳送到乙個reduce任務的資料進行排序。reduce進行最後的資料處理。

mapreduce計算框架適用於超大規模的資料(100tb量級)且各資料之間相關性較低的情況。

之前,或許你聽說過ntfs,vfs,nfs等等等等,沒錯,hdfs就是hadoop file system。

為什麼需要一種專門的檔案系統呢?

這是因為hadoop使用過網路鬆散(說其鬆散,是因為hadoop集群中的任意乙個計算機故障了或是不相干了,都不會對集群造成影響)的組合到一起的。多個計算機需要乙個統一的檔案訪問方式。也就是根據乙個路徑,不同的計算機可以定位同乙個檔案。

hdfs就是這樣一種分布式檔案系統,提供了較好的容錯功能和擴充套件性。

hadoop集群是由很多low cost的計算機組成的,這些計算機被稱為節點。組成hadoop的計算機通常都是全功能的,沒有特別的專門用於計算和儲存的部分。

這樣帶來的好處是明顯的,因為特別大的硬碟和特別快的cpu,總是意味著難以接受的**。而且這樣乙個配置「特別的」節點計算機掛掉了,找個他的替身將是很困難的事情。

計算節點和儲存節點統一的另乙個好處是,任務在計算過程中產生的檔案,可以直接放在本機的儲存節點上,減少網路頻寬占用和延遲。

在衡量hadoop的map和reduce的處理能力的時候通常都是以槽位為單位的。槽位就是集群內每個計算機的cpu併發數(cpu數*核心數*超執行緒數)的總和。每個任務都會安排在乙個槽位內允許,安排不到槽位的任務則會等待。

hadoop平台沒有提供全域性資料排序,而在大規模資料處理中進行資料的全域性排序是非常普遍的需求。大量的將大規模資料任務切分成小資料規模的資料處理任務都必須先將大規模資料進行全域性排序。例如處理兩組大的資料集的屬性合併,可以對兩組資料進行全域性排序然後分解成一系列小的二路歸併問題實現。

使用hadoop進行大量的資料排序排序最直觀的方法是把檔案所有內容給map之後,map不做任何處理,直接輸出給乙個reduce,利用hadoop的自己的shuffle機制,對所有資料進行排序,而後由reduce直接輸出。

然而這樣的方法跟單機毫無差別,完全無法用到多機分布式計算的便利。因此這種方法是不行的。

利用hadoop分而治之的計算模型,可以參照快速排序的思想。在這裡我們先簡單回憶一下快速排序。快速排序基本步驟就是需要現在所有資料中選取乙個作為支點。然後將大於這個支點的放在一邊,小於這個支點的放在另一邊。

設想如果我們有n個支點(這裡可以稱為標尺),就可以把所有的資料分成n+1個part,將這n+1個part丟給reduce,由hadoop自動排序,最後輸出n+1個內部有序的檔案,再把這n+1個檔案首尾相連合併成乙個檔案,收工。

由此我們可以歸納出這樣乙個用hadoop對大量資料排序的步驟:

1)  對待排序資料進行抽樣;

2)  對抽樣資料進行排序,產生標尺;

3)  map對輸入的每條資料計算其處於哪兩個標尺之間;將資料發給對應區間id的reduce

4)  reduce將獲得資料直接輸出。

這裡使用對一組url進行排序來作為例子:

這裡還有一點小問題要處理:如何將資料發給乙個指定id的reduce?hadoop提供了多種分割槽演算法。這些演算法根據map輸出的資料的key來確定此資料應該發給哪個reduce(reduce的排序也依賴key)。因此,如果需要將資料發給某個reduce,只要在輸出資料的同時,提供乙個key(在上面這個例子中就是reduce的id+url),資料就該去哪兒去哪兒了。

1)         標尺的抽取應該盡可能的均勻,這與快速排序很多變種演算法均是強調支點的選取是一致的。

2)         hdfs是一種讀寫效能很不對稱的檔案系統。應該盡可能的利用其讀效能很強的特點。減少對寫檔案和shuffle操作的依賴。舉例來說,當需要根據資料的統計情況來決定對資料的處理的時候。將統計和資料處理分成兩輪map-reduce比將統計資訊合併和資料處理都放到乙個reduce中要快速的多。

hadoop實際是一種以資料為驅動的計算模型,結合mapreduce和hdfs,將任務執行在資料存放的計算節點上,充分利用了計算節點的儲存和計算資源,同時也大大節省了網路傳輸資料的開銷。

hadoop提供了簡便利用集群進行平行計算的平台。各種可以隔離資料集之間相關性的運算模型都能夠在hadoop上被良好應用。之後會有更多的利用hadoop實現的大規模資料基礎計算方法的介紹。

使用hadoop進行大規模資料的全域性排序

hadoop 某人兒子的乙隻虛擬大象的名字 是乙個複雜到極致,又簡單到極致的東西。說它複雜,是因為乙個hadoop集群往往有幾十台甚至成百上千臺low cost的計算機組成,你執行的每乙個任務都要在這些計算機上做任務的分發,執行中間資料排序以及最後的彙總,期間還包含節點發現,任務的重試,故障節點替換...

使用hadoop進行大規模資料的全域性排序

hadoop 某人兒子的乙隻虛擬大象的名字 是乙個複雜到極致,又簡單到極致的東西。說它複雜,是因為乙個hadoop集群往往有幾十台甚至成百上千臺low cost的計算機組成,你執行的每乙個任務都要在這些計算機上做任務的分發,執行中間資料排序以及最後的彙總,期間還包含節點發現,任務的重試,故障節點替換...

如何使用hadoop進行大規模資料的全域性排序?

hadoop實際是一種以資料為驅動的計算模型,結合mapreduce和hdfs,將任務執行在資料存放的計算節點上,充分利用了計算節點的儲存和計算資源,同時也大大節省了網路傳輸資料的開銷。hadoop是乙個複雜到極致,又簡單到極致的東西。說它複雜,是因為乙個hadoop集群往往有幾十台甚至成百上千臺l...