主頁 > 資料庫 > 大資料Hadoop原理介紹+安裝+實戰操作(HDFS+YARN+MapReduce)

大資料Hadoop原理介紹+安裝+實戰操作(HDFS+YARN+MapReduce)

2022-04-05 07:58:18 資料庫

目錄
  • 一、Hadoop概述
  • 二、HDFS詳解
    • 1)HDFS概述
      • HDFS的設計特點
    • 2)HDFS組成
      • 1、Client
      • 2、NameNode(NN)
      • 3、DataNode(DN)
      • 4、Secondary NameNode(2NN)
    • 3)HDFS具體作業原理
      • 1、兩個核心的資料結構: Fslmage和EditLog
      • 2、作業流程
      • 3、HDFS讀檔案流程
      • 4、HDFS檔案寫入流程
  • 三、Yarn詳解
    • 1)Yarn概述
    • 2)YARN架構組件
      • 1、ResourceManager(RM)
      • 2、ApplicationMaster(AM)
      • 3、NodeManager(NM)
      • 4、Container
    • 3)YARN運行流程
    • 4)YARN三種資源調度器
      • 1、FIFO調度器(FIFO Scheduler)
      • 2、容量調度器(Capacity Scheduler)
      • 3、資源調度器- Fair
  • 四、MapReduce詳解
    • 1)MapReduce概述
    • 2)MapReduce運行流程
      • 1、作業的提交
      • 2、作業的初始化
      • 3、作業任務的分配
      • 4、作業任務的執行
      • 5、作業任務的狀態更新
      • 6、作業的完成
    • 3)MapReduce中的shuffle程序
      • 1、map端
      • 2、reduce端
  • 五、安裝Hadoop(HDFS+YARN)
    • 1)環境準備
    • 2)下載最新的Hadoop安裝包
    • 3)進行服務器及Hadoop的初始化配置
    • 4)開始安裝Hadoop
      • 1、解壓上面我編譯好的安裝包
      • 2、安裝包目錄說明
      • 3、修改組態檔
      • 4、分發同步hadoop安裝包到另外幾臺機器
      • 5、將hadoop添加到環境變數(所有節點)
      • 6、Hadoop集群啟動(hadoop-node1上執行)
        • 1)(首次啟動)格式化namenode(只能執行一次
        • 2)手動逐個行程啟停
        • 3)通過shell腳本一鍵啟動
        • 4)通過web頁面訪問
  • 六、Hadoop實戰操作
    • 1)HDFS實戰操作
    • 2)MapReduce+YARN實戰操作
    • 3)Yarn的常用命令

一、Hadoop概述

Hadoop是Apache軟體基金會下一個開源分布式計算平臺,以HDFS(Hadoop Distributed File System)、MapReduce(Hadoop2.0加入了YARN,Yarn是資源調度框架,能夠細粒度的管理和調度任務,還能夠支持其他的計算框架,比如spark)為核心的Hadoop為用戶提供了系統底層細節透明的分布式基礎架構,hdfs的高容錯性、高伸縮性、高效性等優點讓用戶可以將Hadoop部署在低廉的硬體上,形成分布式系統,目前最新版本已經是3.x了,官方檔案,也可以參考我之前的文章:Hadoop生態系統介紹


二、HDFS詳解

1)HDFS概述

HDFS(Hadoop Distributed File System)是Hadoop專案的核心子專案,是分布式計算中資料存盤管理的基礎,是基于流資料模式訪問和處理超大檔案的需求而開發的,可以運行于廉價的商用服務器上,它所具有的高容錯、高可靠性、高可擴展性、高獲得性、高吞吐率等特征為海量資料提供了不怕故障的存盤,為超大資料集(Large Data Set)的應用處理帶來了很多便利,HDFS 源于 Google 在2003年10月份發表的GFS(Google File System) 論文, 它其實就是 GFS(Google File System) 的一個克隆版本,

在這里插入圖片描述

HDFS的設計特點

之所以選擇 HDFS 存盤資料,因為 HDFS 具有以下優點:

  • 高容錯性:資料自動保存多個副本,它通過增加副本的形式,提高容錯性,某一個副本丟失以后,它可以自動恢復,這是由 HDFS 內部機制實作的,我們不必關心,
  • 適合批處理:它是通過移動計算而不是移動資料,它會把資料位置暴露給計算框架,
  • 適合大資料處理:處理資料達到 GB、TB、甚至PB級別的資料,能夠處理百萬規模以上的檔案數量,數量相當之大,能夠處理10K節點的規模,
  • 流式檔案訪問:一次寫入,多次讀取,檔案一旦寫入不能修改,只能追加,它能保證資料的一致性,
  • 可構建在廉價機器上:它通過多副本機制,提高可靠性,它提供了容錯和恢復機制,比如某一個副本丟失,可以通過其它副本來恢復,

當然 HDFS 也有它的劣勢,并不適合所有的場合:

  • 低延時資料訪問:它適合高吞吐率的場景,就是在某一時間內寫入大量的資料,但是它在低延時的情況下是不行的,比如毫秒級以內讀取資料,這樣它是很難做到的,

  • 小檔案存盤:存盤大量小檔案(這里的小檔案是指小于HDFS系統的Block大小的檔案(Hadoop 3.x默認128M)的話,它會占用 NameNode大量的記憶體來存盤檔案、目錄和塊資訊,這樣是不可取的,因為NameNode的記憶體總是有限的,小檔案存盤的尋道時間會超過讀取時間,它違反了HDFS的設計目標,

  • 并發寫入、檔案隨機修改:一個檔案只能有一個寫,不允許多個執行緒同時寫,僅支持資料 append(追加),不支持檔案的隨機修改,

2)HDFS組成

在這里插入圖片描述

HDFS 采用Master/Slave的架構來存盤資料,這種架構主要由四個部分組成,分別為HDFS Client、NameNode、DataNode和Secondary NameNode,下面我們分別介紹這四個組成部分 :

1、Client

Client就是客戶端

  • 檔案切分,檔案上傳 HDFS 的時候,Client 將檔案切分成 一個一個的- Block,然后進行存盤,
  • 與 NameNode 互動,獲取檔案的位置資訊,
  • 與 DataNode 互動,讀取或者寫入資料,
  • Client 提供一些命令來管理 HDFS,比如啟動或者關閉HDFS,
  • Client 可以通過一些命令來訪問 HDFS,

2、NameNode(NN)

NameNode就是 master,它是一個主管、管理者,

3、DataNode(DN)

DataNode就是Slave,NameNode 下達命令,DataNode 執行實際的操作,

  • 存盤實際的資料塊,
  • 執行資料塊的讀/寫操作,

4、Secondary NameNode(2NN)

Secondary NameNode并非 NameNode 的熱備,當NameNode 掛掉的時候,它并不能馬上替換 NameNode 并提供服務,

  • Secondary NameNode僅僅是NameNode的一個工具,這個工具幫助NameNode管理元資料資訊,
  • 定期合并 fsimage和fsedits,并推送給NameNode,
  • 在緊急情況下,可輔助恢復 NameNode,

3)HDFS具體作業原理

在這里插入圖片描述

1、兩個核心的資料結構: Fslmage和EditLog

  • FsImage負責維護檔案系統樹和樹中所有檔案和檔案夾的元資料,
    ———維護檔案結構和檔案元資訊的鏡像
  • EditLog操作日志檔案中記錄了所有針對檔案的創建,洗掉,重命名操作,
    ———記錄對檔案的操作

PS:
1.NN的元資料為了讀寫速度塊是寫在記憶體里的,FsImage只是它的一個鏡像保存檔案
2.當每輸入一個增刪改操作,EditLog都會單獨生成一個檔案,最后EL會生成多個檔案
3.2NN不是NN的備份(但可以做備份),它的主要作業是幫助NN合并edits log,減少NN啟動時間,
4.拓撲距離:根據節點網路構成的樹形結構計算最短路徑
5.機架感知:根據拓撲距離得到的節點擺放位置

2、作業流程

  • 第一步: 當客戶端對元資料進行增刪改請求時,由于hadoop安全性要求比較高,它會先將操作寫入到editlog檔案里,先持久化
  • 第二步: 然后將具體增刪改操作,將FSimage和edit寫入記憶體里進行具體的操作,先寫檔案,即使宕機了也可以恢復資料,不然先記憶體資料就會消失,此時2NN發現時間到了,或者edit資料滿了或者剛開機時,就會請求執行輔助操作,NN收到后將edit瞬間復制一份,這個時候客戶端傳過來的資料繼續寫到edit里,
  • 第三步:我們把復制的edit和fsimage拷貝到2NN(SecondaryNameNode)里,操作寫在2NN的記憶體里合并,合并后將檔案回傳給NN做為新的Fsimage,所以一旦NN宕機2NN比NN差一個edit部分,無法完全恢復原先狀態,只能說輔助恢復,

3、HDFS讀檔案流程

在這里插入圖片描述
【第一步】Client呼叫FileSystem.open()方法

  • FileSystem通過RPC與NN通信,NN回傳該檔案的部分或全部block串列(含有block拷貝的DN地址),
  • 選取舉栗客戶端最近的DN建立連接,讀取block,回傳FSDataInputStream,

【第二步】Client呼叫輸入流的read()方法

  • 當讀到block結尾時,FSDataInputStream關閉與當前DN的連接,并未讀取下一個block尋找最近DN,
  • 讀取完一個block都會進行checksum驗證,如果讀取DN時出現錯誤,客戶端會通知NN,然后再從下一個擁有該block拷貝的DN繼續讀,
  • 如果block串列讀完后,檔案還未結束,FileSystem會繼續從NN獲取下一批block串列,

【第三步】關閉FSDataInputStream

4、HDFS檔案寫入流程

在這里插入圖片描述
【第一步】Client呼叫FileSystem的create()方法

  • FileSystem向NN發出請求,在NN的namespace里面創建一個新的檔案,但是并不關聯任何塊,
  • NN檢查檔案是否已經存在、操作權限,如果檢查通過,NN記錄新檔案資訊,并在某一個DN上創建資料塊,
  • 回傳FSDataOutputStream,將Client引導至該資料塊執行寫入操作,

【第二步】Client呼叫輸出流的write()方法

  • HDFS默認將每個資料塊放置3份,FSDataOutputStream將資料首先寫到第一節點,第一節點將資料包傳送并寫入第二節點,第二節點 --> 第三節點,

【第三步】Client呼叫流的close()方法

  • flush緩沖區的資料包,block完成復制份數后,NN回傳成功訊息,

三、Yarn詳解

1)Yarn概述

Apache Yarn(Yet Another Resource Negotiator的縮寫)是hadoop集群資源管理器系統,Yarn從hadoop 2引入,最初是為了改善MapReduce的實作,但是它具有通用性,同樣執行其他分布式計算模式,

Yarn特點:

  • 支持非mapreduce應用的需求
  • 可擴展性
  • 提高資源是用率
  • 用戶敏捷性
  • 可以通過搭建為高可用

2)YARN架構組件

Yarn從整體上還是屬于master/slave模型,主要依賴于三個組件來實作功能,第一個就是ResourceManager,是集群資源的仲裁者,它包括兩部分:一個是可插拔式的調度Scheduler,一個是ApplicationManager,用于管理集群中的用戶作業,第二個是每個節點上的NodeManager,管理該節點上的用戶作業和作業流,也會不斷發送自己Container使用情況給ResourceManager,第三個組件是ApplicationMaster,用戶作業生命周期的管理者它的主要功能就是向ResourceManager(全域的)申請計算資源(Containers)并且和NodeManager互動來執行和監控具體的task,架構圖如下:

在這里插入圖片描述

1、ResourceManager(RM)

RM是一個全域的資源管理器,管理整個集群的計算資源,并將這些資源分配給應用程式,包括:

  • 與客戶端互動,處理來自客戶端的請求
  • 啟動和管理ApplicationMaster,并在它運行失敗時重新啟動它
  • 管理NodeManager ,接收來自NodeManager 的資源匯報資訊,并向NodeManager下達管理指令
  • 資源管理與調度,接收來自ApplicationMaster 的資源申請請求,并為之分配資源

RM關鍵配置引數:

  • 最小容器記憶體: yarn.scheduler.minimum-allocation-mb
  • 容器記憶體增量: yarn.scheduler.increment-allocation-mb
  • 最大容器記憶體: yarn.scheduler.maximum-allocation-mb
  • 最小容器虛擬 CPU 內核數量: yarn.scheduler.minimum-allocation-mb
  • 容器虛擬 CPU 內核增量: yarn.scheduler.increment-allocation-vcores
  • 最大容器虛擬 CPU 內核數量: yarn.scheduler.maximum-allocation-mb
  • ResourceManager Web 應用程式 HTTP 埠: yarn.resourcemanager.webapp.address

2、ApplicationMaster(AM)

應用程式級別的,管理運行在YARN上的應用程式,包括:

  • 用戶提交的每個應用程式均包含一個AM,它可以運行在RM以外的機器上,
  • 負責與RM調度器協商以獲取資源(用Container表示)
  • 將得到的資源進一步分配給內部的任務(資源的二次分配)
  • 與NM通信以啟動/停止任務,
  • 監控所有任務運行狀態,并在任務運行失敗時重新為任務申請資源以重啟任務

AM關鍵配置引數:

  • ApplicationMaster 最大嘗試次數: yarn.resourcemanager.am.max-attempts
  • ApplicationMaster 監控過期: yarn.am.liveness-monitor.expiry-interval-ms

3、NodeManager(NM)

YARN中每個節點上的代理,它管理Hadoop集群中單個計算節點,包括:

  • 啟動和監視節點上的計算容器(Container)
  • 以心跳的形式向RM匯報本節點上的資源使用情況和各個Container的運行狀態(CPU和記憶體等資源)
  • 接收并處理來自AM的Container啟動/停止等各種請求

NM關鍵配置引數:

  • 節點記憶體: yarn.nodemanager.resource.memory-mb
  • 節點虛擬 CPU 內核: yarn.nodemanager.resource.cpu-vcores
  • NodeManager Web 應用程式 HTTP 埠: yarn.nodemanager.webapp.address

4、Container

Container是YARN中資源的抽象,它封裝了某個節點上的多維度資源,如記憶體、CPU、磁盤、網路等,Container由AM向RM申請的,由RM中的資源調度器異步分配給AM,Container的運行是由AM向資源所在的NM發起,

一個應用程式所需的Container分為兩大類:

  • 運行AM的Container:這是由RM(向內部的資源調度器)申請和啟動的,用戶提交應用程式時,可指定唯一的AM所需的資源;
  • 運行各類任務的Container:這是由AM向RM申請的,并由AM與NM通信以啟動之,

以上兩類Container可能在任意節點上,它們的位置通常而言是隨機的,即AM可能與它管理的任務運行在一個節點上,

3)YARN運行流程

Application在Yarn中的執行程序如下圖所示:
在這里插入圖片描述

  1. 客戶端程式向ResourceManager提交應用并請求一個ApplicationMaster實體,ResourceManager在應答中給出一個applicationID以及有助于客戶端請求資源的資源容量資訊,

  2. ResourceManager找到可以運行一個Container的NodeManager,并在這個Container中啟動ApplicationMaster實體

    • Application Submission Context發出回應,其中包含有:ApplicationID,用戶名,佇列以及其他啟動ApplicationMaster的資訊,Container Launch Context(CLC)也會發給ResourceManager,CLC提供了資源的需求,作業檔案,安全令牌以及在節點啟動ApplicationMaster所需要的其他資訊,
    • 當ResourceManager接收到客戶端提交的背景關系,就會給ApplicationMaster調度一個可用的container(通常稱為container0),然后ResourceManager就會聯系NodeManager啟動ApplicationMaster,并建立ApplicationMaster的RPC埠和用于跟蹤的URL,用來監控應用程式的狀態,
  3. ApplicationMaster向ResourceManager進行注冊,注冊之后客戶端就可以查詢ResourceManager獲得自己ApplicationMaster的詳細資訊,以后就可以和自己的ApplicationMaster直接互動了,在注冊回應中,ResourceManager會發送關于集群最大和最小容量資訊,

  4. 在平常的操作程序中,ApplicationMaster根據resource-request協議向ResourceManager發送resource-request請求,ResourceManager會根據調度策略盡可能最優的為ApplicationMaster分配container資源,作為資源請求的應答發個ApplicationMaster

  5. 當Container被成功分配之后,ApplicationMaster通過向NodeManager發送container-launch-specification資訊來啟動Container, container-launch-specification資訊包含了能夠讓Container和ApplicationMaster交流所需要的資料,一旦container啟動成功之后,ApplicationMaster就可以檢查他們的狀態,Resourcemanager不在參與程式的執行,只處理調度和監控其他資源,Resourcemanager可以命令NodeManager殺死container,

  6. 應用程式的代碼在啟動的Container中運行,并把運行的進度、狀態等資訊通過application-specific協議發送給ApplicationMaster,隨著作業的執行,ApplicationMaster將心跳和進度資訊發給ResourceManager,在這些心跳資訊中,ApplicationMaster還可以請求和釋放一些container,

  7. 在應用程式運行期間,提交應用的客戶端主動和ApplicationMaster交流獲得應用的運行狀態、進度更新等資訊,交流的協議也是application-specific協議

  8. 一但應用程式執行完成并且所有相關作業也已經完成,ApplicationMaster向ResourceManager取消注冊然后關閉,用到所有的Container也歸還給系統,當container被殺死或者回收,Resourcemanager都會通知NodeManager聚合日志并清理container專用的檔案,

4)YARN三種資源調度器

1、FIFO調度器(FIFO Scheduler)

FIFO調度器的優點是簡單易懂不需要任何配置,但是不適合共享集群,大型應用會占用集群中的所有資源,所以每個應用必須等待直到輪到自己運行,在一個共享集群中,更適合使用容量調度器或公平調度器,這兩種調度器都允許長時間運行的作業能及時完成,同時也允許正在進行較小臨時查詢的用戶能夠在合理時間內得到回傳結果,

在這里插入圖片描述

2、容量調度器(Capacity Scheduler)

容量調度器允許多個組織共享一個Hadoop集群,每個組織可以分配到全部集群資源的一部分,每個組織被配置一個專門的佇列,每個佇列被配置為可以使用一定的集群資源,佇列可以進一步按層次劃分,這樣每個組織內的不同用戶能夠共享該組織佇列所分配的資源,在一個佇列內,使用FIFO調度策略對應用進行調度,

  • 單個作業使用的資源不會超過其佇列容量,然而如果佇列中有多個作業,并且佇列資源不夠了呢?這時如果仍有可用的空閑資源那么容量調度器可能會將空余的資源分配給佇列中的作業,哪怕這會超出佇列容量,這被稱為彈性佇列(queue elasticity),

在這里插入圖片描述

3、資源調度器- Fair

公平調度是一種對于全域資源,對于所有應用作業來說,都均勻分配的資源分配方法,默認情況,公平調度器FairScheduler基于記憶體來安排公平調度策略,也可以配置為同時基于記憶體和CPU來進行調度(Dominant Resource Fairness),在一個佇列內,可以使用FIFO、FAIR、DRF調度策略對應用進行調度,FairScheduler允許保障性的分配最小資源到佇列,

  • 【注意】在下圖 Fair 調度器中,從第二個任務提交到獲得資源會有一定的延遲,因為它需要等待第一個任務釋放占用的 Container,小任務執行完成之后也會釋放自己占用的資源,大任務又獲得了全部的系統資源,最終效果就是 Fair 調度器即得到了高的資源利用率又能保證小任務及時完成,

在這里插入圖片描述


四、MapReduce詳解

1)MapReduce概述

MapReduce是一種編程模型(沒有集群的概念,會把任務提交到yarn集群上跑),用于大規模資料集(大于1TB)的并行運算,概念"Map(映射)"和"Reduce(歸約)",是它們的主要思想,都是從函式式編程語言里借來的,還有從矢量編程語言里借來的特性,它極大地方便了編程人員在不會分布式并行編程的情況下,將自己的程式運行在分布式系統上, 當前的軟體實作是指定一個Map(映射)函式,用來把一組鍵值對映射成一組新的鍵值對,指定并發的Reduce(歸約)函式,用來保證所有映射的鍵值對中的每一個共享相同的鍵組,(MapReduce在企業里幾乎不再使用了,稍微了解即可)

2)MapReduce運行流程

作業的運行程序主要包括如下幾個步驟:

1、作業的提交
2、作業的初始化
3、作業任務的分配
4、作業任務的執行
5、作業執行狀態更新
6、作業完成

具體作業執行程序的流程圖如下圖所示:
在這里插入圖片描述

1、作業的提交

在MR的代碼中呼叫waitForCompletion()方法,里面封裝了Job.submit()方法,而Job.submit()方法里面會創建一個JobSubmmiter物件,當我們在waitForCompletion(true)時,則waitForCompletion方法會每秒輪詢作業的執行進度,如果發現與上次查詢到的狀態有差別,則將詳情列印到控制臺,如果作業執行成功,就顯示作業計數器,否則將導致作業失敗的記錄輸出到控制臺,

其中JobSubmmiter實作的大概程序如下:

  1. 向資源管理器resourcemanager提交申請,用于一個mapreduce作業ID,如圖步驟2所示
  2. 檢查作業的輸出配置,判斷目錄是否已經存在等資訊
  3. 計算作業的輸入分片的大小
  4. 將運行作業的jar,組態檔,輸入分片的計算資源復制到一個以作業ID命名的hdfs臨時目錄下,作業jar的復本比較多,默認為10個(通過引數mapreduce.client.submit.file.replication控制),
  5. 通過資源管理器的submitApplication方法提交作業

2、作業的初始化

  1. 當資源管理器通過方法submitApplication方法被呼叫后,便將請求傳給了yarn的調度器,然后調度器在一個節點管理器上分配一個容器(container0)用來啟動application master(主類是MRAppMaster)行程,該行程一旦啟動就會向resourcemanager注冊并報告自己的資訊,application master并且可以監控map和reduce的運行狀態,因此application master對作業的初始化是通過創建多個薄記物件以保持對作業進度的跟蹤,

  2. application master接收作業提交時的hdfs臨時共享目錄中的資源檔案,jar,分片資訊,配置資訊等,并對每一個分片創建一個map物件,以及通過mapreduce.job.reduces引數(作業通過setNumReduceTasks()方法設定)確定reduce的數量,

  3. application master會判斷是否使用uber(作業與application master在同一個jvm運行,也就是maptask和reducetask運行在同一個節點上)模式運行作業,uber模式運行條件:map數量小于10個,1個reduce,且輸入資料小于一個hdfs塊

可以通過引數:

mapreduce.job.ubertask.enable   #是否啟用uber模式
mapreduce.job.ubertask.maxmaps   #ubertask的最大map數
mapreduce.job.ubertask.maxreduces #ubertask的最大reduce數
mapreduce.job.ubertask.maxbytes #ubertask最大作業大小
  1. application master呼叫setupJob方法設定OutputCommiter,FileOutputCommiter為默認值,表示建立做的最終輸出目錄和任務輸出的臨時作業空間

3、作業任務的分配

  1. 在application master判斷作業不符合uber模式的情況下,那么application master則會向資源管理器為map和reduce任務申請資源容器,

  2. 首先就是為map任務發出資源申請請求,直到有5%的map任務完成時,才會為reduce任務所需資源申請發出請求,

  3. 在任務的分配程序中,reduce任務可以在任何的datanode節點運行,但是map任務執行的時候需要考慮到資料本地化的機制,在給任務指定資源的時候每個map和reduce默認為1G記憶體,可以通過如下引數配置:

mapreduce.map.memory.mb
mapreduce.map.cpu.vcores
mapreduce.reduce.memory.mb
mapreduce.reduce.cpu.vcores

4、作業任務的執行

application master提交申請后,資源管理器為其按需分配資源,這時,application master就與節點管理器通信來啟動容器,該任務由主類YarnChild的一個java應用程式執行,在運行任務之前,首先將所需的資源進行本地化,包括作業的配置,jar檔案等,接下來就是運行map和reduce任務,YarnChild在單獨的JVM中運行,

5、作業任務的狀態更新

每個作業和它的每個任務都有一個狀態:作業或者任務的狀態(運行中,成功,失敗等),map和reduce的進度,作業計數器的值,狀態訊息或描述當作業處于正在運行中的時候,客戶端可以直接與application master通信,每秒(可以通過引數mapreduce.client.progressmonitor.pollinterval設定)輪詢作業的執行狀態,進度等資訊,

6、作業的完成

  • 當application master收到最后一個任務已完成的通知,便把作業的狀態設定為成功,
  • 在job輪詢作業狀態時,知道任務已經完成,然后列印訊息告知用戶,并從waitForCompletion()方法回傳,
  • 當作業完成時,application master和container會清理中間資料結果等臨時問題,OutputCommiter的commitJob()方法被呼叫,作業資訊由作業歷史服務存檔,以便用戶日后查詢,

3)MapReduce中的shuffle程序

mapreduce確保每個reduce的輸入都是按照鍵值排序的,系統執行排序,將map的輸入作為reduce的輸入程序稱之為shuffle程序,shuffle也是我們優化的重點部分,shuffle流程圖如下圖所示:

在這里插入圖片描述

1、map端

  • 在生成map之前,會計算檔案分片的大小

  • 然后會根據分片的大小計算map的個數,對每一個分片都會產生一個map作業,或者是一個檔案(小于分片大小*1.1)生成一個map作業,然后通過自定的map方法進行自定義的邏輯計算,計算完畢后會寫到本地磁盤,

    1. 在這里不是直接寫入磁盤,為了保證IO效率,采用了先寫入記憶體的環形緩沖區,并做一次預排序(快速排序),緩沖區的大小默認為100MB(可通過修改配置項mpareduce.task.io.sort.mb進行修改),當寫入記憶體緩沖區的大小到達一定比例時,默認為80%(可通過mapreduce.map.sort.spill.percent配置項修改),將啟動一個溢寫執行緒將記憶體緩沖區的內容溢寫到磁盤(spill to disk),這個溢寫執行緒是獨立的,不影響map向緩沖區寫結果的執行緒,在溢寫到磁盤的程序中,map繼續輸入到緩沖中,如果期間緩沖區被填滿,則map寫會被阻塞到溢寫磁盤程序完成,溢寫是通過輪詢的方式將緩沖區中的記憶體寫入到本地mapreduce.cluster.local.dir目錄下,在溢寫到磁盤之前,我們會知道reduce的數量,然后會根據reduce的數量劃分磁區,默認根據hashpartition對溢寫的資料寫入到相對應的磁區,在每個磁區中,后臺執行緒會根據key進行排序,所以溢寫到磁盤的檔案是磁區且排序的,如果有combiner函式,它在排序后的輸出運行,使得map輸出更緊湊,減少寫到磁盤的資料和傳輸給reduce的資料,

    2. 每次環形換沖區的記憶體達到閾值時,就會溢寫到一個新的檔案,因此當一個map溢寫完之后,本地會存在多個磁區切排序的檔案,在map完成之前會把這些檔案合并成一個磁區且排序(歸并排序)的檔案,可以通過引數mapreduce.task.io.sort.factor控制每次可以合并多少個檔案,

    3. 在map溢寫磁盤的程序中,對資料進行壓縮可以提交速度的傳輸,減少磁盤io,減少存盤,默認情況下不壓縮,使用引數mapreduce.map.output.compress控制,壓縮演算法使用mapreduce.map.output.compress.codec引數控制,

2、reduce端

  • map任務完成后,監控作業狀態的application master便知道map的執行情況,并啟動reduce任務,application master并且知道map輸出和主機之間的對應映射關系,reduce輪詢application master便知道主機所要復制的資料,
  • 一個Map任務的輸出,可能被多個Reduce任務抓取,每個Reduce任務可能需要多個Map任務的輸出作為其特殊的輸入檔案,而每個Map任務的完成時間可能不同,當有一個Map任務完成時,Reduce任務就開始運行,Reduce任務根據磁區號在多個Map輸出中抓取(fetch)對應磁區的資料,這個程序也就是Shuffle的copy程序,,reduce有少量的復制執行緒,因此能夠并行的復制map的輸出,默認為5個執行緒,可以通過引數mapreduce.reduce.shuffle.parallelcopies控制,
  • 這個復制程序和map寫入磁盤程序類似,也有閥值和記憶體大小,閥值一樣可以在組態檔里配置,而記憶體大小是直接使用reduce的tasktracker的記憶體大小,復制時候reduce還會進行排序操作和合并檔案操作,
  • 如果map輸出很小,則會被復制到Reducer所在節點的記憶體緩沖區,緩沖區的大小可以通過mapred-site.xml檔案中的mapreduce.reduce.shuffle.input.buffer.percent指定,一旦Reducer所在節點的記憶體緩沖區達到閥值,或者緩沖區中的檔案數達到閥值,則合并溢寫到磁盤,
  • 如果map輸出較大,則直接被復制到Reducer所在節點的磁盤中,隨著Reducer所在節點的磁盤中溢寫檔案增多,后臺執行緒會將它們合并為更大且有序的檔案,當完成復制map輸出,進入sort階段,這個階段通過歸并排序逐步將多個map輸出小檔案合并成大檔案,最后幾個通過歸并合并成的大檔案作為reduce的輸出

五、安裝Hadoop(HDFS+YARN)

1)環境準備

這里準備三臺VM虛擬機

OS hostname ip 運行角色
Centos8.x hadoop-node1 192.168.0.113 namenode,datanode ,resourcemanager,nodemanager
Centos8.x hadoop-node2 192.168.0.114 secondarynamedata,datanode,nodemanager
Centos8.x hadoop-node3 192.168.0.115 datanode,nodemanager

2)下載最新的Hadoop安裝包

下載地址:https://dlcdn.apache.org/hadoop/common/
在這里插入圖片描述
在這里插入圖片描述
這里下載原始碼包安裝,默認的編譯好的檔案不支持snappy壓縮,因此我們需要自己重新編譯,

$ mkdir -p /opt/bigdata/hadoop && cd /opt/bigdata/hadoop
$ wget https://dlcdn.apache.org/hadoop/common/stable/hadoop-3.3.1-src.tar.gz
# 解壓
$ tar -zvxf hadoop-3.3.1-src.tar.gz

為什么需要重新編譯Hadoop原始碼?

匹配不同作業系統本地庫環境,Hadoop某些操作比如壓縮,IO需要呼叫系統本地庫(.so|.dll)

重構原始碼

原始碼包目錄下有個 BUILDING.txt,因為我這里的作業系統是Centos8,所以選擇Centos8的操作步驟,小伙伴們找到自己對應系統的操作步驟執行即可,

$ grep -n -A40 'Building on CentOS 8' BUILDING.txt

在這里插入圖片描述

Building on CentOS 8

----------------------------------------------------------------------------------


* Install development tools such as GCC, autotools, OpenJDK and Maven.
  $ sudo dnf group install --with-optional 'Development Tools'
  $ sudo dnf install java-1.8.0-openjdk-devel maven

* Install Protocol Buffers v3.7.1.
  $ git clone https://github.com/protocolbuffers/protobuf
  $ cd protobuf
  $ git checkout v3.7.1
  $ autoreconf -i
  $ ./configure --prefix=/usr/local
  $ make
  $ sudo make install
  $ cd ..

* Install libraries provided by CentOS 8.
  $ sudo dnf install libtirpc-devel zlib-devel lz4-devel bzip2-devel openssl-devel cyrus-sasl-devel libpmem-devel

* Install optional dependencies (snappy-devel).
  $ sudo dnf --enablerepo=PowerTools snappy-devel

* Install optional dependencies (libzstd-devel).
  $ sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
  $ sudo dnf --enablerepo=epel install libzstd-devel

* Install optional dependencies (isa-l).
  $ sudo dnf --enablerepo=PowerTools install nasm
  $ git clone https://github.com/intel/isa-l
  $ cd isa-l/
  $ ./autogen.sh
  $ ./configure
  $ make
  $ sudo make install

----------------------------------------------------------------------------------

將進入Hadoop原始碼路徑,執行maven命令進行Hadoop編譯

$ cd /opt/bigdata/hadoop/hadoop-3.3.1-src
# 編譯
$ mvn package -Pdist,native,docs -DskipTests -Dtar

【問題】Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:3.0.0-M1:enforce

[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 19:49 min
[INFO] Finished at: 2021-12-14T09:36:29+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:3.0.0-M1:enforce (enforce-banned-dependencies) on project hadoop-client-check-test-invariants: Some Enforcer rules have failed. Look above for specific messages explaining why the rule failed. -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR] mvn -rf :hadoop-client-check-test-invariants

【解決】

  • 方案一:跳過enforcer的強制約束,在構建的命令加上跳過的指令,如:-Denforcer.skip=true
  • 方案二:設定規則校驗失敗不影響構建流程,在構建的命令上加指令,如: -Denforcer.fail=false

具體原因目前還不明確,先使用上面兩個方案中的方案一跳過,有興趣的小伙伴,可以打開DEBUG模式(-X)查看具體報錯

$ mvn package -Pdist,native,docs,src -DskipTests -Dtar -Denforcer.skip=true

所以編譯命令

# 當然還有其它選項
$ grep -n -A1 '$ mvn package' BUILDING.txt

在這里插入圖片描述

$ mvn package -Pdist -DskipTests -Dtar -Dmaven.javadoc.skip=true
$ mvn package -Pdist,native,docs -DskipTests -Dtar
$ mvn package -Psrc -DskipTests
$ mvn package -Pdist,native,docs,src -DskipTests -Dtar
$ mvn package -Pdist,native -DskipTests -Dmaven.javadoc.skip \
  -Dopenssl.prefix=/usr/local/opt/openssl

在這里插入圖片描述

至此~Hadoop原始碼編譯完成,
編譯后的檔案位于原始碼路徑下 hadoop-dist/target/
在這里插入圖片描述
將編譯好的二進制包copy出來

$ cp hadoop-dist/target/hadoop-3.3.1.tar.gz /opt/bigdata/hadoop/
$ cd /opt/bigdata/hadoop/
$ ll

在這里插入圖片描述
這里也把編譯好的包放在百度云上,如果小伙伴不想自己編譯,可以直接用我這里的:

鏈接:https://pan.baidu.com/s/1hmdHY20zSLGyKw1OAVCg7Q
提取碼:8888

3)進行服務器及Hadoop的初始化配置

1、修改主機名

# 192.168.0.113機器上執行
$ hostnamectl set-hostname hadoop-node1
# 192.168.0.114機器上執行
$ hostnamectl set-hostname hadoop-node2
# 192.168.0.115機器上執行
$ hostnamectl set-hostname hadoop-node3

2、修改主機名和IP的映射關系(所有節點都執行)

$ echo "192.168.0.113 hadoop-node1" >> /etc/hosts
$ echo "192.168.0.114 hadoop-node2" >> /etc/hosts
$ echo "192.168.0.115 hadoop-node3" >> /etc/hosts

3、關閉防火墻和selinux(所有節點都執行)

$ systemctl stop firewalld
$ systemctl disable firewalld

# 臨時關閉(不用重啟機器):
$ setenforce 0                  ##設定SELinux 成為permissive模式

# 永久關閉修改/etc/selinux/config 檔案
將SELINUX=enforcing改為SELINUX=disabled

4、時間同步(所有節點都執行)

$ dnf install chrony -y
$ systemctl start chronyd
$ systemctl enable chronyd

/etc/chrony.conf組態檔內容

# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
#pool 2.centos.pool.ntp.org iburst (這一行注釋掉,增加以下兩行)
server ntp.aliyun.com iburst
server cn.ntp.org.cn iburst

重新加載配置并測驗

$ systemctl restart chronyd.service
$ chronyc sources -v

5、配置ssh免密(在hadoop-node1上執行)

# 1、在hadoop-node1上執行如下命令生成公私密鑰:
$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_dsa
# 2、然后將master公鑰id_dsa復制到hadoop-node1|hadoop-node2|hadoop-node3進行公鑰認證,
$ ssh-copy-id -i /root/.ssh/id_dsa.pub hadoop-node1
$ ssh-copy-id -i /root/.ssh/id_dsa.pub hadoop-node2
$ ssh-copy-id -i /root/.ssh/id_dsa.pub hadoop-node3
$ ssh hadoop-node1
$ exit
$ ssh hadoop-node2
$ exit
$ ssh hadoop-node3
$ exit

在這里插入圖片描述
6、安裝統一作業目錄(所有節點都執行)

# 軟體安裝路徑
$ mkdir -p /opt/bigdata/hadoop/server
# 資料存盤路徑
$ mkdir -p /opt/bigdata/hadoop/data
# 安裝包存放路徑
$ mkdir -p /opt/bigdata/hadoop/software

7、安裝JDK(所有節點都執行)
官網下載:https://www.oracle.com/java/technologies/downloads/
百度下載

鏈接:https://pan.baidu.com/s/1-rgW-Z-syv24vU15bmMg1w
提取碼:8888

$ cd /opt/bigdata/hadoop/software
$ tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/bigdata/hadoop/server/
# 在檔案加入環境變數/etc/profile
export JAVA_HOME=/opt/bigdata/hadoop/server/jdk1.8.0_212
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# source加載
$ source /etc/profile
# 查看jdk版本
$ java -version

在這里插入圖片描述

4)開始安裝Hadoop

1、解壓上面我編譯好的安裝包

$ cd /opt/bigdata/hadoop/software
$ tar -zxvf hadoop-3.3.1.tar.gz -C /opt/bigdata/hadoop/server/
$ cd /opt/bigdata/hadoop/server/
$ cd hadoop-3.3.1/
$ ls -lh

在這里插入圖片描述

2、安裝包目錄說明

目錄 說明
bin hadoop最基本的管理腳本和使用腳本的目錄,這些腳本是sbin目錄下管理腳本的基礎實作,用戶可以直接使用這些腳本管理和使用hadoop
etc hadoop組態檔所在的目錄
include 對外提供的編程庫頭檔案(具體動態庫和靜態庫在lib目錄中),這些檔案均是用c++定義,通常用于c++程式訪問HDFS或者撰寫MapReduce程式,
lib 該目錄包含了hadoop對外提供的編程動態庫和靜態庫,與include目錄中的頭檔案結合使用,
libexec 各個服務隊用的shell組態檔所在的免疫力,可用于配置日志輸出,啟動引數(比如JVM引數)等基本資訊,
sbin hadoop管理腳本所在的目錄,主要包含HDFS和YARN中各類服務的啟動、關閉腳本
share hadoop 各個模塊編譯后的jar包所在的目錄,官方示例也在其中

3、修改組態檔

組態檔目錄:/opt/bigdata/hadoop/server/hadoop-3.3.1/etc/hadoop
官方檔案:https://hadoop.apache.org/docs/r3.3.1/

  • 修改hadoop-env.sh
# 在hadoop-env.sh檔案末尾追加
export JAVA_HOME=/opt/bigdata/hadoop/server/jdk1.8.0_212
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
  • 修改core-site.xml #核心模塊配置

在<configuration></configuration>中間添加如下內容

<!-- 設定默認使用的檔案系統 Hadoop支持file、HDFS、GFS、ali|Amazon云等檔案系統 -->
<property>
  <name>fs.defaultFS</name>
  <value>hdfs://hadoop-node1:8082</value>
</property>

<!-- 設定Hadoop本地保存資料路徑 -->
<property>
  <name>hadoop.tmp.dir</name>
  <value>/opt/bigdata/hadoop/data/hadoop-3.3.1</value>
</property>

<!-- 設定HDFS web UI用戶身份 -->
<property>
  <name>hadoop.http.staticuser.user</name>
  <value>root</value>
</property>

<!-- 聚合hive 用戶代理設定 -->
<property>
  <name>hadoop.proxyuser.hosts</name>
  <value>*</value>
</property>

<!-- 用戶代理設定 -->
<property>
  <name>hadoop.proxyuser.root.groups</name>
  <value>*</value>
</property>

<!-- 檔案系統垃圾桶保存時間 -->
<property>
  <name>fs.trash.interval</name>
  <value>1440</value>
</property>
  • hdfs-site.xml #hdfs檔案系統模塊配置

在<configuration></configuration>中間添加如下內容

<!-- 設定SNN行程運行機器位置資訊 -->
<property>
  <name>dfs.namenode.secondary.http-address</name>
  <value>hadoop-node2:9868</value>
</property>

<!-- 必須將dfs.webhdfs.enabled屬性設定為true,否則就不能使用webhdfs的LISTSTATUS、LISTFILESTATUS等需要列出檔案、檔案夾狀態的命令,因為這些資訊都是由namenode來保存的, -->
<property>
  <name>dfs.webhdfs.enabled</name>
  <value>true</value>
</property>
  • 修改mapred.xml #MapReduce模塊配置

在<configuration></configuration>中間添加如下內容

<!-- 設定MR程式默認運行模式,yarn集群模式,local本地模式 -->
<property>
  <name>mapreduce.framework.name</name>
  <value>yarn</value>
</property>

<!-- MR程式歷史服務地址 -->
<property>
  <name>mapreduce.jobhistory.address</name>
  <value>hadoop-node1:10020</value>
</property>

<!-- MR程式歷史服務web端地址 -->
<property>
  <name>mapreduce.jobhistory.webapp.address</name>
  <value>hadoop-node1:19888</value>
</property>

<!-- yarn環境變數 -->
<property>
  <name>yarn.app.mapreduce.am.env</name>
  <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>

<!-- map環境變數 -->
<property>
  <name>mapreduce.map.env</name>
  <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>

<!-- reduce環境變數 -->
<property>
  <name>mapreduce.reduce.env</name>
  <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
  • 修改yarn-site.xml #yarn模塊配置

在<configuration></configuration>中間添加如下內容

<!-- 設定YARN集群主角色運行集群位置 -->
<property>
  <name>yarn.resourcemanager.hostname</name>
  <value>hadoop-node1</value>
</property>

<property>
  <name>yarn.nodemanager.aux-services</name>
  <value>mapreduce_shuffle</value>
</property>

<!-- 是否將對容器實施物理記憶體限制 -->
<property>
  <name>yarn.nodemanager.pmem-check-enabled</name>
  <value>false</value>
</property>

<!-- 是否將對容器實施虛擬記憶體限制 -->
<property>
  <name>yarn.nodemanager.vmem-check-enabled</name>
  <value>false</value>
</property>

<!-- 開啟日志聚集 -->
<property>
  <name>yarn.log-aggregation-enable</name>
  <value>true</value>
</property>

<!-- 設定yarn歷史服務器地址 -->
<property>
  <name>yarn.log.server.url</name>
  <value>http://hadoop-node1:19888/jobhistory/logs</value>
</property>

<!-- 設定yarn歷史日志保存時間 7天 -->
<property>
  <name>yarn.log-aggregation.retain-seconds</name>
  <value>604880</value>
</property>
  • 修改workers
    將下面內容覆寫檔案,默認只有localhost
hadoop-node1
hadoop-node2
hadoop-node3

在這里插入圖片描述

4、分發同步hadoop安裝包到另外幾臺機器

$ cd /opt/bigdata/hadoop/server/
$ scp -r hadoop-3.3.1 hadoop-node2:/opt/bigdata/hadoop/server/
$ scp -r hadoop-3.3.1 hadoop-node3:/opt/bigdata/hadoop/server/

5、將hadoop添加到環境變數(所有節點)

$ vi /etc/profile

export HADOOP_HOME=/opt/bigdata/hadoop/server/hadoop-3.3.1
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

# 加載
$ source /etc/profile

6、Hadoop集群啟動(hadoop-node1上執行)

1)(首次啟動)格式化namenode(只能執行一次
  • 首次啟動HDFS時,必須對其進行格式化操作
  • format本質上初始化作業,進行HDFS清理和準備作業
$ hdfs namenode -format

在這里插入圖片描述

2)手動逐個行程啟停

每臺機器每次手動啟動關閉一個角色行程,可以精確控制每個行程啟停,避免群起群停

1、HDFS集群啟動

$ hdfs --daemon start|stop namenode|datanode|secondarynamenode

2、YARN集群啟動

$ yarn --daemon start|stop resourcemanager|nodemanager
3)通過shell腳本一鍵啟動

在hadoop-node1上,使用軟體自帶的shell腳本一鍵啟動,前提:配置好機器之間的SSH免密登錄和works檔案

  • HDFS集群啟停
$ start-dfs.sh
$ stop-dfs.sh #這里不執行

在這里插入圖片描述
檢查java行程

$ jps

在這里插入圖片描述

  • YARN集群啟停
$ start-yarn.sh
$ stop-yarn.sh # 這里不執行
# 查看java行程
$ jps

在這里插入圖片描述
通過日志檢查,日志路徑:/opt/bigdata/hadoop/server/hadoop-3.3.1/logs

$ cd /opt/bigdata/hadoop/server/hadoop-3.3.1/logs
$ ll

在這里插入圖片描述

  • Hadoop集群啟停(HDFS+YARN)
$ start-all.sh
$ stop-all.sh
4)通過web頁面訪問

【注意】在window C:\Windows\System32\drivers\etc\hosts檔案配置域名映射,hosts檔案中增加如下內容:

192.168.0.113 hadoop-node1
192.168.0.114 hadoop-node2
192.168.0.115 hadoop-node3

1、HDFS集群

地址:http://namenode_host:9870

這里地址為:http://192.168.0.113:9870
在這里插入圖片描述
2、YARN集群

地址:http://resourcemanager_host:8088

這里地址為:http://192.168.0.113:8088
在這里插入圖片描述
到此為止,hadoop和yarn集群就已經部署完了~


六、Hadoop實戰操作

1)HDFS實戰操作

  • 命令介紹
# 訪問本地檔案系統
$ hadoop fs -ls file:///
# 默認不帶協議就是訪問hdfs檔案系統
$ hadoop fs -ls /
  • 查看配置
$ cd /opt/bigdata/hadoop/server/hadoop-3.3.1/etc/hadoop
$ grep -C5 'fs.defaultFS' core-site.xml

在這里插入圖片描述

# 這里加上hdfs協議與不帶協議等價
$ hadoop fs -ls hdfs://hadoop-node1:8082/

在這里插入圖片描述

【溫馨提示】所以默認不帶協議就是訪問HDFS檔案系統

  • 老版本的使用方式
$ hdfs dfs -ls /
$ hdfs dfs -ls hdfs://hadoop-node1:8082/

在這里插入圖片描述


1、創建和洗掉檔案

# 查看
$ hadoop fs -ls /
# 創建目錄
$ hadoop fs -mkdir /test20211214
$ hadoop fs -ls /
# 創建檔案
$ hadoop fs -touchz /test20211214/001.txt
$ hadoop fs -ls /test20211214

在這里插入圖片描述
2、web端查看
在這里插入圖片描述
在這里插入圖片描述

# 洗掉檔案
$ hadoop fs -rm /test20211214/001.txt
# 洗掉目錄
$ hadoop fs -rm -r /test20211214

3、推送檔案到hdfs

$ touch test001.txt
$ hadoop fs -put test001.txt /
$ hadoop fs -ls /

在這里插入圖片描述
4、從hdfs上拉取檔案

# 把test001.txt拉取下來,并改名為a.txt
$ hadoop fs -get /test001.txt a.txt

在這里插入圖片描述

2)MapReduce+YARN實戰操作

1、執行Hadoop官方自帶的MapReduce案例,評估圓周率Π的值

$ cd /opt/bigdata/hadoop/server/hadoop-3.3.1/share/hadoop/mapreduce
$ hadoop jar hadoop-mapreduce-examples-3.3.1.jar pi 2 4

在這里插入圖片描述
2、統計單詞
創建hello.txt,檔案內容如下:

hello hadoop yarn world
hello yarn hadoop
hello world

在hdfs創建存放檔案目錄

$ hadoop fs -mkdir -p /wordcount/input
# 把檔案上傳到hdfs
$ hadoop fs -put hello.txt /wordcount/input/

在這里插入圖片描述
執行

$ cd /opt/bigdata/hadoop/server/hadoop-3.3.1/share/hadoop/mapreduce
$ hadoop jar hadoop-mapreduce-examples-3.3.1.jar wordcount /wordcount/input /wordcount/output

在這里插入圖片描述
在這里插入圖片描述

3)Yarn的常用命令

使用語法:yarn application [options] #列印報告,申請和殺死任務

-appStates <States>         #與-list一起使用,可根據輸入的逗號分隔的應用程式狀態串列來過濾應用程式,有效的應用程式狀態可以是以下之一:ALL,NEW,NEW_SAVING,SUBMITTED,ACCEPTED,RUNNING,FINISHED,FAILED,KILLED
-appTypes <Types>           #與-list一起使用,可以根據輸入的逗號分隔的應用程式型別串列來過濾應用程式,
-list                       #列出RM中的應用程式,支持使用-appTypes來根據應用程式型別過濾應用程式,并支持使用-appStates來根據應用程式狀態過濾應用程式,
-kill <ApplicationId>       #終止應用程式,
-status <ApplicationId>     #列印應用程式的狀態,

簡單示例

# 列出在運行的應用程式
$ yarn application --list
# 列出FINISHED的應用程式
$ yarn application -appStates FINISHED --list  

在這里插入圖片描述
更多操作命令,可以自行查看幫助

$ yarn -help

[root@hadoop-node1 hadoop]# yarn -help
Usage: yarn [OPTIONS] SUBCOMMAND [SUBCOMMAND OPTIONS]
 or    yarn [OPTIONS] CLASSNAME [CLASSNAME OPTIONS]
  where CLASSNAME is a user-provided Java class

  OPTIONS is none or any of:

--buildpaths                       attempt to add class files from build tree
--config dir                       Hadoop config directory
--daemon (start|status|stop)       operate on a daemon
--debug                            turn on shell script debug mode
--help                             usage information
--hostnames list[,of,host,names]   hosts to use in worker mode
--hosts filename                   list of hosts to use in worker mode
--loglevel level                   set the log4j level for this command
--workers                          turn on worker mode

  SUBCOMMAND is one of:


    Admin Commands:

daemonlog            get/set the log level for each daemon
node                 prints node report(s)
rmadmin              admin tools
scmadmin             SharedCacheManager admin tools

    Client Commands:

app|application      prints application(s) report/kill application/manage long running application
applicationattempt   prints applicationattempt(s) report
classpath            prints the class path needed to get the hadoop jar and the required libraries
cluster              prints cluster information
container            prints container(s) report
envvars              display computed Hadoop environment variables
fs2cs                converts Fair Scheduler configuration to Capacity Scheduler (EXPERIMENTAL)
jar <jar>            run a jar file
logs                 dump container logs
nodeattributes       node attributes cli client
queue                prints queue information
schedulerconf        Updates scheduler configuration
timelinereader       run the timeline reader server
top                  view cluster information
version              print the version

    Daemon Commands:

nodemanager          run a nodemanager on each worker
proxyserver          run the web app proxy server
registrydns          run the registry DNS server
resourcemanager      run the ResourceManager
router               run the Router daemon
sharedcachemanager   run the SharedCacheManager daemon
timelineserver       run the timeline server

SUBCOMMAND may print help when invoked w/o parameters or with -h.


這里只是簡單的dmeo案例演示操作,后面會有企業級的案例+實戰操作分享,請耐心等待……

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/455629.html

標籤:其他

上一篇:實時流處理與分布式存盤程序中對檔案的操作

下一篇:我在撰寫Python程式以解決數學問題時遇到的型別錯誤

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more