2. TeraSort在Hadoop分散式叢集中的執行
2. TeraSort
**1TB排序通常用於衡量分散式資料處理框架的資料處理能力。**Terasort是Hadoop中的的一個排序作業,在2008年,Hadoop在1TB排序基準評估中贏得第一名,耗時209秒。
執行環境:
- 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
- 三臺虛擬機器上節點分配:
hadoop100:DataNode NameNode NodeManager
hadoop200: ResourceManager NodeManager DataNode
hadoop300:NodeManager DataNode JobHistoryServer
- 程式的開發驗證由PC機實現
Intellij IDEA 2018.4 + hadoop-2.7.7 + JDK-8-251 + Maven-3.3.9
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 參考
- 演算法分析的部落格:
- 跑演算法的部落格
- MPI程式設計思想,收藏一下
相關文章
- hadoop分散式叢集搭建Hadoop分散式
- Hadoop完全分散式叢集配置Hadoop分散式
- Hadoop分散式叢集搭建_1Hadoop分散式
- 一鍵在本地搭建執行Istio 1.0的分散式Kubernetes叢集分散式
- Hadoop-叢集執行Hadoop
- 列出叢集中所有執行容器的映象
- Hadoop 及Spark 分散式HA執行環境搭建HadoopSpark分散式
- Hadoop叢集中Hbase的介紹、安裝、使用Hadoop
- hadoop叢集搭建——單節點(偽分散式)Hadoop分散式
- [Hadoop踩坑]叢集分散式環境配置Hadoop分散式
- 完全分散式模式hadoop叢集安裝與配置分散式模式Hadoop
- Hadoop3.0完全分散式叢集安裝部署Hadoop分散式
- 分散式叢集與多執行緒高併發分散式執行緒
- hadoop基準測試_Hadoop TeraSort基準測試Hadoop
- Hadoop框架:叢集模式下分散式環境搭建Hadoop框架模式分散式
- 虛擬機器裝Hadoop叢集完全分散式虛擬機Hadoop分散式
- hadoop偽分散式叢集的安裝(不是單機版)Hadoop分散式
- 在 Ubuntu 22 的基礎上進行 Hadoop 偽分散式(HDFS)的搭建UbuntuHadoop分散式
- Centos7搭建hadoop3.3.4分散式叢集CentOSHadoop分散式
- IDEA本地執行hadoop程式成功,叢集執行找不到自定義的Mapper類IdeaHadoopAPP
- CentOS 7上搭建Spark 3.0.1 + Hadoop 3.2.1分散式叢集CentOSSparkHadoop分散式
- hadoop window 遠端提交job到叢集並執行Hadoop
- Mars如何分散式地執行分散式
- centos7 hadoop3.2.0分散式叢集搭建步驟CentOSHadoop分散式
- 【Azure 儲存服務】Hadoop叢集中使用ADLS(Azure Data Lake Storage)過程中遇見執行PUT操作報錯Hadoop
- 在kubernetes叢集中部署open-falcon
- hadoop+spark偽分散式HadoopSpark分散式
- 分散式鎖 (資源在程式而非執行緒之間共享)分散式執行緒
- 好程式設計師大資料培訓分享Hadoop分散式叢集程式設計師大資料Hadoop分散式
- CentOS 7上搭建Spark3.0.1+ Hadoop3.2.1分散式叢集CentOSSparkHadoop分散式
- java大資料最全課程學習筆記(2)--Hadoop完全分散式執行模式Java大資料筆記Hadoop分散式模式
- ElasticSearch 分散式叢集Elasticsearch分散式
- Hadoop環境搭建(二)分散式Hadoop分散式
- hadoop完全分散式環境搭建Hadoop分散式
- Hadoop hdfs完全分散式搭建教程Hadoop分散式
- CentOS7 hadoop3.3.1安裝(單機分散式、偽分散式、分散式)CentOSHadoop分散式
- {Submarine} 在 Apache Hadoop 中執行深度學習框架ApacheHadoop深度學習框架
- hadoop的mapreduce串聯執行Hadoop