Hadoop-MapReduce-TeraSort-大資料排序例子

碼農SW發表於2012-07-24
1TB(或1分鐘)排序的冠軍  
作為分散式資料處理的框架,叢集的資料處理能力究竟有多快?或許1TB排序可以作為衡量的標準之一。 

1TB排序,就是對1TB(1024GB,大約100億行資料)的資料進行排序。2008年, Hadoop贏得1TB排序基準評估第一名 ,排序1TB資料耗時209秒。後來, 1TB排序被1分鐘排序所取代 ,1分鐘排序指的是在一分鐘內儘可能多的排序。 2009年,在一個1406個節點組成的hadoop叢集,在59秒裡對500GB完成了排序;而在1460個節點的叢集,排序1TB資料只花了62秒 。 

這麼驚人的資料處理能力,是不是讓你印象深刻呢?呵呵 

TeraSort 例子分為3個模組:

1. TeraGen,用於生成排序的原始資料。

2. TeraSort, 用於完成對原始資料的排序工作。

3. TeraValida, 用於完成對排序結果的驗證。




1. TeraGen生成什麼樣的資料?
1TB的資料?100億條資料?都是什麼樣的資料呢?讓我們來看幾條: 
  1. .t^#\|v$2\         0AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFFFFGGGGGGGGGGHHHHHHHH  
  2. 75@~?'WdUF         1IIIIIIIIIIJJJJJJJJJJKKKKKKKKKKLLLLLLLLLLMMMMMMMMMMNNNNNNNNNNOOOOOOOOOOPPPPPPPP  
  3. w[o||:N&H,         2QQQQQQQQQQRRRRRRRRRRSSSSSSSSSSTTTTTTTTTTUUUUUUUUUUVVVVVVVVVVWWWWWWWWWWXXXXXXXX  
  4. ^Eu)<n#kdP         3YYYYYYYYYYZZZZZZZZZZAAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFF  
  5. +l-$$OE/ZH         4GGGGGGGGGGHHHHHHHHHHIIIIIIIIIIJJJJJJJJJJKKKKKKKKKKLLLLLLLLLLMMMMMMMMMMNNNNNNNN  
  6. LsS8)|.ZLD         5OOOOOOOOOOPPPPPPPPPPQQQQQQQQQQRRRRRRRRRRSSSSSSSSSSTTTTTTTTTTUUUUUUUUUUVVVVVVVV  
  7. le5awB.$sm         6WWWWWWWWWWXXXXXXXXXXYYYYYYYYYYZZZZZZZZZZAAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDD  
  8. q__[fwhKFg         7EEEEEEEEEEFFFFFFFFFFGGGGGGGGGGHHHHHHHHHHIIIIIIIIIIJJJJJJJJJJKKKKKKKKKKLLLLLLLL  
  9. ;L+!2rT~hd         8MMMMMMMMMMNNNNNNNNNNOOOOOOOOOOPPPPPPPPPPQQQQQQQQQQRRRRRRRRRRSSSSSSSSSSTTTTTTTT  
  10. M^*dDE;6^<         9UUUUUUUUUUVVVVVVVVVVWWWWWWWWWWXXXXXXXXXXYYYYYYYYYYZZZZZZZZZZAAAAAAAAAABBBBBBBB  


描述一下:每一行,是一條資料。每一條,由2部分組成,前面是一個由10個隨即字元組成的key,後面是一個80個字元組成的value。 

排序的任務:按照key的順序排。 

那麼1TB的資料從何而來?答案是用程式隨即生成的,用一個只有map,沒有reduce的MapReduce job,在整個叢集上先隨即生成100億行資料。然後,在這個基礎上,再執行排序的MapReduce job,以測試叢集排序效能。 


2. TeraSort的工作原理

先說明一點,熟悉MapReduce的人都知道:排序是MapReduce的天然特性!在資料達到reducer之前,mapreduce框架已經對這些資料按鍵排序了。 

所以, 在這個排序的job裡,不需要特殊的Mapper和Reducer類。用預設的 
IdentityMapper和IdentityReducer
即可。 


既然排序是天然特性,那麼1TB排序的難點在哪裡呢??答:100億行的資料隨即分散在1000多臺機器上,mapper和reducer都是Identity的,這個難點就在MapReduce的shuffle階段!關鍵在如何取樣和怎麼寫Partitioner。 

好在這個排序的原始碼已近包含在hadoop的examples裡了,下面我們就來分析一下。 

在TeraSort原始碼中提供了兩種Partitioner,一種是SimplePartitioner,一種是TotalOrderPartitioner,

SimplePartitioner::GetPartition(),直接對key值的字首做了一些處理,視乎不能保證特定區域的key值分配到特定的bucket.

TotalOrderPartitioner: 是構建了一個3層的字典樹,用key的前兩個byte作為查詢關鍵字,查詢出以2個byte字首的key值應該屬於哪個bucket,應該由哪個reduce去做排序處理。這樣每個reduce的輸出結果就不需要再merge了。


下面博文是對teraGen,teraSort, teraValide進行測試的例子:

http://blog.csdn.net/zklth/article/details/6295517

其中提到的hadoop-0.20.1-examples.jar,在hadoop的release壓縮包裡就有,也可以自己下原始碼編譯。


參考文獻:

http://datacenter.watchstor.com/server-134830.htm

http://blog.csdn.net/zklth/article/details/6295517



相關文章