2. TeraSort在Hadoop分散式叢集中的執行

BuerAkun1024發表於2020-06-11

2. TeraSort

**1TB排序通常用於衡量分散式資料處理框架的資料處理能力。**Terasort是Hadoop中的的一個排序作業,在2008年,Hadoop在1TB排序基準評估中贏得第一名,耗時209秒。

執行環境

  1. CentOS-7.6-Minimal * 3 由Vmware平臺搭建

三臺主機對應IP地址:192.168.239.100 hadoop100

​ 192.168.239.101 hadoop101

​ 192.168.239.102 hadoop102

環境:hadoop-2.7.7 + JDK-8-251

  1. 三臺虛擬機器上節點分配:

hadoop100:DataNode NameNode NodeManager

hadoop200: ResourceManager NodeManager DataNode

hadoop300:NodeManager DataNode JobHistoryServer

  1. 程式的開發驗證由PC機實現

Intellij IDEA 2018.4 + hadoop-2.7.7 + JDK-8-251 + Maven-3.3.9

  1. 三個驗證實驗:

2.1 演算法思想

  • 解決大規模資料排序問題首先想到的是分而治之的策略,但是這在Hadoop中並不適用,因為,儘管map可以並行,但是這在reduce階段並不能做到,於是Hadoop官方提出了TeraSort排序演算法,這個演算法在Hadoop的原始碼中。
  • 為了提高reduce階段的並行度,TeraSort作業對分而治之的演算法進行如下改進:在map階段,每個map task都會將資料劃分成R個資料塊(R為reduce task個數),其中第i(i>0)個資料塊的所有資料都會比第i+1箇中的資料大;在reduce階段,第i個reduce task處理(進行排序)所有map task的第i塊,這樣第i個reduce task產生的結果均會比第i+1個大,最後將1~R個reduce task的排序結果順序輸出,即為最終的排序結果。
  • 這種設計思路很明顯比第一種高效,但實現難度較大,它需要解決以下兩個技術難點:第一,如何確定每個map task資料的R個資料塊的範圍? 第二,對於某條資料,如果快速的確定它屬於哪個資料塊?答案分別為【取樣】和【trie樹】。

2.2 演算法流程

  • 對於Hadoop的Terasort排序演算法,主要由3步組成:取樣 –>> map task對於資料記錄做標記 –>> reduce task進行區域性排序。
  • 資料取樣在JobClient端進行,首先從輸入資料中抽取一部分資料,將這些資料進行排序,然後將它們劃分成R個資料塊,找出每個資料塊的資料上限和下線(稱為“分割點”),並將這些分割點儲存到分散式快取中。
  • 在map階段,每個map task首先從分散式快取中讀取分割點,並對這些分割點建立trie樹(兩層trie樹,樹的葉子節點上儲存有該節點對應的reduce task編號)。然後正式開始處理資料,對於每條資料,在trie樹中查詢它屬於的reduce task的編號,並儲存起來。
  • 在reduce階段,每個reduce task從每個map task中讀取其對應的資料進行區域性排序,最後將reduce task處理後結果按reduce task編號依次輸出即可。

2.3 在hadoop分散式叢集上執行TeraSort

Hadoop原始碼中包含了TeraSort,打包在hadoop-2.7.7\share\hadoop\mapreduce包:hadoop-mapreduce-examples-2.7.7.jar

使用teragen產生資料

使用Teragen來產生資料,示例如下:

hadoop jar hadoop-*-examples.jar teragen 引數1 引數2

teragen的引數解釋:

  • 引數1:表示要產生的資料的行數。Teragen每行資料的大小是100B
    要產生1T的資料,需要的行數=102410241024*1024/100=10995116277行
  • 引數2 : 產生的資料放置的資料夾地址

預設的teragen的啟動的map數比較少,只有2個,如果要指定map數可以加-Dmapred.map.tasks=map數的方式。比如我們來產生1T的資料

# 產生資料:1000000標定資料大小
$ hadoop jar /opt/module/hadoop-2.7.7/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar teragen -Dmapred.map.tasks=100 1000000 /output

ls一下目錄是否產出

$ hadoop fs -ls /output
# 1 + 100 個條目會在命令執行後展出
[hadoop1@hadoop100 application]$ hadoop fs -ls /output
Found 101 items
-rw-r--r--   3 hadoop1 supergroup          0 2020-06-09 06:10 /output/_SUCCESS
-rw-r--r--   3 hadoop1 supergroup    1000000 2020-06-09 06:09 /output/part-m-00000
-rw-r--r--   3 hadoop1 supergroup    1000000 2020-06-09 06:09 /output/part-m-00001
-rw-r--r--   3 hadoop1 supergroup    1000000 2020-06-09 06:09 /output/part-m-00002
-rw-r--r--   3 hadoop1 supergroup    1000000 2020-06-09 06:09 /output/part-m-00003
-rw-r--r--   3 hadoop1 supergroup    1000000 2020-06-09 06:09 /output/part-m-00004
......

使用Terasort排序

使用terasort對剛才使用teragen產生的資料進行排序,排序結果輸出到/output_rst。
預設的reduce數目是1,會導致任務跑得非常慢。通過-Dmapred.reduce.tasks指定reduce數目,這裡我們設定50個

$ hadoop jar /opt/module/hadoop-2.7.7/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar terasort -Dmapred.reduce.tasks=50 /output /output_rst
# 2 + 50 條資料  50條資料對應50個reduce產生的結果
[hadoop1@hadoop100 application]$ hadoop fs -ls /output_rst
Found 52 items
-rw-r--r--   1 hadoop1 supergroup          0 2020-06-09 06:29 /output_rst/_SUCCESS
-rw-r--r--  10 hadoop1 supergroup        539 2020-06-09 06:24 /output_rst/_partition.lst
-rw-r--r--   1 hadoop1 supergroup    1947700 2020-06-09 06:29 /output_rst/part-r-00000
-rw-r--r--   1 hadoop1 supergroup    2015000 2020-06-09 06:29 /output_rst/part-r-00001
-rw-r--r--   1 hadoop1 supergroup    2035900 2020-06-09 06:29 /output_rst/part-r-00002
-rw-r--r--   1 hadoop1 supergroup    1990400 2020-06-09 06:29 /output_rst/part-r-00003
-rw-r--r--   1 hadoop1 supergroup    1967000 2020-06-09 06:29 /output_rst/part-r-00004
......

啟動Teragen之後,會提交mapre reduce任務來,產生TeraSort需要的資料

使用Teravalidate 進行驗證

使用TeraValidate 對Terasort的結果進行驗證:

$ hadoop jar /opt/module/hadoop-2.7.7/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar teravalidate /output_rst /validate
# 提示成功
20/06/09 06:38:04 INFO mapreduce.Job: Job job_1591628181590_0007 completed successfully

最終運算的時長:資料大小為100M (非標準1024算的) 執行時間:Gen: 1’50" Sort:5’4"
在這裡插入圖片描述

注意

  • 在樹莓派的實驗中,這裡的引數需要進行相應的調整,比如跑10個map,跑1個reduce

2.4 參考

相關文章