文章目錄
- 前言
- 1.大資料簡介
- (1)知識體系
- (2)大資料定義及應用場景
- (3)大資料發展趨勢及從業人員發展路線
- 2.Hadoop簡介
- 3.Hadoop的重要組成
- 4.Apache Hadoop 完全分布式集群搭建
- (1)虛擬機環境準備
- (2)環境變數配置
- (3)集群規劃實施
- (4)撰寫集群分發腳本
- (5)集群啟動
- Ⅰ 單節點啟動
- Ⅱ 集群群起
- Ⅲ 集群停止
- (6)集群測驗
- (7)歷史日志服務器配置
- 總結
前言
本文主要介紹了Hadoop簡介及Apache Hadoop完全分布式集群搭建,包括大資料簡介、Hadoop簡介、Hadoop的重要組成和Apache Hadoop 完全分布式集群搭建,
1.大資料簡介
(1)知識體系
大資料技術解決的主要是海量資料的存盤和計算 ,
Hadoop的廣義和狹義之分:
(1)狹義的Hadoop:
狹義的Hadoop指的是一個框架,Hadoop是由三部分組成:
- HDFS
????分布式檔案系統,用于存盤,
- MapReduce
????分布式離線計算框架,用于計算,
- Yarn
????資源調度框架
(2)廣義的Hadoop:
廣義Hadoop不僅僅包含Hadoop框架,除了Hadoop框架之外還有一些輔助框架:
- Flume
????日志資料采集,
- Sqoop
????關系型資料庫資料的采集,
????
- Hive
????深度依賴Hadoop框架完成計算(SQL),
- Hbase
????大資料領域的資料庫(MySQL),
- Sqoop
????資料的匯出,
廣義Hadoop指的是一個生態圈,
核心知識體系如下:
-
大資料簡介(定義,特點,應用場景,發展趨勢,職業發展路線)
-
Hadoop簡介(歷史,發展路線-版本變更,發行版(CDH))
-
Hadoop的重要組成(hdfs,mapreduce,yarn)
-
Apache Hadoop完全分布式集群搭建
-
HDFS分布式檔案系統(架構,原理,常用api,元資料管理,權限,日志采集的綜合案例)
-
MapReduce分布式計算框架 (原理,常用的編程規范等,大量案例練習-磁區,排序-快排-歸并排序,壓縮,自定義組件,綜合案例)
-
Yarn資源調度框架(架構,原理,三種資源調度策略)
-
Apche Hadoop核心原始碼剖析(nn,dn啟動流程原始碼分析,nn高并發的支撐原理,hadoop3.0新特性)
-
調優及二次開發示例(hdfs,mr,yarn調優,nn常見GC問題,完成二次開發編譯原始碼)
(2)大資料定義及應用場景
大資料的定義:
大資料是指無法在一定時間范圍內用常規軟體工具進行捕捉、管理和處理的資料集合,是需要新處理模式才能具有更強的決策力、洞察發現力和流程優化能力的海量、高增長率和多樣化的資訊資產,
大資料的特點(5V):

- 大量
????采集、存盤和計算的資料量都非常大,
????隨著科學技術的發展和互聯網的普及,全球的資料量已經大到爆了,而傳統的關系型資料庫根本處理不了如此海量的資料,
- 高速
????在大資料時代,資料的創建、存盤、分析都要求被高速處理,比如電商網站的個性化推薦盡可能要求實時完成推薦,這也是大資料區別于傳統資料挖掘的顯著特征,
- 多樣
????資料形式和來源多樣化,包括結構化、半結構化和非結構化資料,具體表現為網路日志、音頻、視頻、圖片、地理位置資訊等,多型別的資料對資料的處理能力提出了更高的要求,
- 真實
????確保資料的真實性,才能保證資料分析的正確性,
- 低價值
????資料價值密度相對較低,或者說是浪里淘沙卻又彌足珍貴 ,
????互聯網發展催生了大量資料,資訊海量,但價值密度較低,如何結合業務邏輯并通過強大的機器演算法來挖掘資料價值,是大資料時代最需要解決的問題,也是一個有難度的課題,
隨著大資料的發展,大資料技術已經廣泛應用在眾多行業,比如倉儲物流、電商零售、汽車、電信、生物醫學、人工智能、智慧城市等等領域,包括在疫情防控戰中,大資料技術也發揮了重要的作用:
- 倉儲物流
????大資料技術驅動了倉儲物流領域的智能化發展,以蘇寧為例,蘇寧物流可在全國的各級倉庫間實作智能分倉、就近備貨和預測式調撥,實作“客戶需要的商品就在離客戶最近的配送中心”,

- 電商零售
????- 零售業“啤酒+紙尿褲”案例

????- 個性推薦

????- “雙11購物節”實時銷售額大屏

- 汽車
????利用了大資料和物聯網技術的無人駕駛汽車,在不遠的未來將走入我們的日常生活,
- 電信
????移動聯通根據用戶年齡、職業、消費情況,分析統計哪種套餐適合哪類人群,對市場人群精準定制,
- 生物醫學
????大資料可以幫助我們實作流行病預測、智慧醫療、健康管理,同時還可以幫助我們解讀DNA,了解更多的生命奧秘,比如影像大資料支撐下的早期肺癌支撐平臺,基于大量病例資料樣本,制定早期肺癌高危人群預警指標,
- 人工智能
????人工智能的基礎上就是大資料,在大量資料訓練的基礎上得到“經驗”,
????典型的例子是AlphaGo戰勝人類棋手,因為AlphaGo已經經過了大量的下棋訓練,訓練得到了“下棋經驗”,

- 智慧城市
????大資料有效支撐智慧城市發展,成為城市的”資料大腦“,比如,在智慧城市建設上,杭州始終走在全國前列,如覆寫面廣的移動支付、新穎的在線醫療模式、創新的物流運輸模式,都受到較大關注,

大資料的價值,遠遠不止于此,大資料對各行各業的滲透,大大推動了社會生產和生活,未來必將產生重大而深遠的影響,
(3)大資料發展趨勢及從業人員發展路線
大資料行業發展趨勢的兩個層面:
(1)國家政策層面
-
2015年黨的十八屆五中全會提出“實施國家大資料戰略”,國務院印發《促進大資料發展行動綱要》,大資料技術和應用處于創新突破期,國內市場需求處于爆發期,我國大資料產業面臨重要的發展機遇,
-
2017年十九大報告明確 “推動互聯網、大資料、人工智能和物體經濟深度融合”,
-
2020年全國政協十三屆三次會議新聞發布會上,更進一步強調:大資料、人工智能、5G是引領未來發展的戰略性技術,
顯然,發展大資料是我國的戰略性決策,前景自然不言而喻,
(2)高校教育和就業層面
-
2017年北京大學、中國人民大學、北京郵電大學等25所高校成功申請開設大資料課程
-
大資料屬于高新技術,大牛少,升職競爭小
-
2020年5月6日,人力資源和社會保障部發布《新職業—大資料工程技術人員就業景氣現狀分析報告》,報告顯示:預計2020年中國大資料行業人才需求規模將達210萬,2025年前大資料人才需求仍將保持30%~40%的增速,需求總量在2000萬人左右,
-
在北京大資料開發工程師的平均薪水已經超越 1.5w 直逼2w,而且目前還保持強勁的發展勢頭,
大資料職業發展路線:
目前大資料高、中、低三個檔次的人才都很缺, 現在我們談大資料,就像當年談電商一樣,未來前景已經很明確,接下來就是優勝劣汰,競爭上崗,不想當架構師的程式員不是好程式員!
大資料發展到現階段,涉及大資料相關的職業崗位也越來越精細,從職業發展來看,由大資料開發、挖掘、演算法、到架構,從級別來看,從工程師、高級工程師,再到架構師,甚至到科學家,而且,契合不同的行業領域,又有專屬于這些行業的崗位衍生,如涉及金融領域的資料分析師等,
大資料的相關作業崗位有很多,有資料分析師、資料挖掘工程師、大資料開發工程師、大資料產品經理、可視化工程師、爬蟲工程師、大資料運營經理、大資料架構師、資料科學家等
等,
從事大資料崗位包括:
-
ETL工程師—資料清洗
-
資料倉庫工程師—資料倉庫搭建
-
實時流處理工程師
-
用戶畫像工程師
-
資料挖掘
-
演算法工程師
-
推薦系統工程
2.Hadoop簡介
Hadoop 是一個適合大資料的分布式存盤和計算平臺 ,
前面已經提到,狹義上說Hadoop就是一個框架平臺,廣義上講Hadoop代表大資料的一個技術生態圈,包括很多其他軟體框架,如下:
| Hadoop生態圈技術堆疊 |
|---|
| Hadoop(HDFS + MapReduce + Yarn) |
| Hive 資料倉庫工具 |
| HBase 海量列式非關系型資料庫 |
| Flume 資料采集工具 |
| Sqoop ETL工具 |
| Kafka 高吞吐訊息中間件 |
| …… |
Hadoop 的發展歷程如下:
Nutch —> Google論文(GFS、MapReduce)
—> Hadoop產生
—> 成為Apache頂級專案
—> Cloudera公司成立(Hadoop快速發展)
(1)Hadoop最早起源于Nutch,創始人是Doug Cutting
Nutch 是一個開源 Java 實作的搜索引擎,它提供了我們運行自己的搜索引擎所需的全部工具,包括全文搜索和Web爬蟲,但隨著抓取網頁數量的增加,遇到了嚴重的可擴展性問題——如何解決數十億網頁的存盤和索引問題,
(2)2003年、2004年谷歌發表的兩篇論文為該問題提供了可行的解決方案:
GFS,可用于處理海量網頁的存盤;
MapReduce,可用于處理海量網頁的索引計算問題,
其中,Google的三篇論文(三駕馬車)分別是:
-
GFS:Google的分布式檔案系統(Google File System)
-
MapReduce:Google的分布式計算框架
-
BigTable:大型分布式資料庫
發展演變關系:
-
GFS —> HDFS
-
oogle MapReduce —> Hadoop MapReduce
-
BigTable —> HBase
隨后,Google公布了部分GFS和MapReduce思想的細節,Doug Cutting等人用2年的業余時間實作了DFS和MapReduce機制,使Nutch性能飆升,
(3)2005年,Hadoop 作為Lucene的子專案Nutch的一部分引入Apache,
(4)2006年,Hadoop從Nutch剝離出來獨立,
(5)2008年,Hadoop成為Apache的頂級專案,
Hadoop名字來源于Hadoop之父Doug Cutting兒子的毛絨玩具象:

Hadoop的特點如下:

Hadoop的發行版本指不同的分支:
目前Hadoop發行版非常多,有Cloudera發行版(CDH)、Hortonworks發行版、華為發行版、Intel發行版等,所有這些發行版均是基于Apache Hadoop衍生出來的,之所以有這么多的版本,是由Apache Hadoop的開源協議決定的(任何人可以對其進行修改,并作為開源或商業產品發布/銷售),
企業中主要用到的三個版本分別是:Apache Hadoop版本(最原始的,所有發行版均基于這個版本進行改進)、Cloudera版本(Cloudera’s Distribution Including Apache Hadoop,簡稱“CDH”)、Hortonworks版本(Hortonworks Data Platform,簡稱“HDP”),
分別如下:
- Apache Hadoop
????原始版本,學習環境使用,
????官網地址:http://hadoop.apache.org/,
????優點:擁有全世界的開源貢獻,代碼更新版本比較快,學習非常方便;
????缺點:版本的升級,版本的維護,以及版本之間的兼容性
????
????Apache所有軟體的下載地址(包括各種歷史版本):
????http://archive.apache.org/dist/,
- 軟體收費版本ClouderaManager
????CDH版本,生產環境使用,
????官網地址:https://www.cloudera.com/
????Cloudera主要是美國一家大資料公司,在Apache開源Hadoop的版本上,通過自己公司內部的各種補丁,實作版本之間的穩定運行,大資料生態圈的各個版本的軟體都提供了對應的版本,解決了版本的升級困難,版本兼容性等各種問題,生產環境強烈推薦使用,
- 免費開源版本HortonWorks
????HDP版本,生產環境使用,
????官網地址:https://hortonworks.com/
????hortonworks主要是雅虎主導Hadoop開發的副總裁,帶領二十幾個核心成員成立Hortonworks,核心產品軟體HDP(ambari),HDF免費開源,并且提供一整套的web管理界面,供我們可以通過web界面管理我們的集群狀態,
????web管理界面軟體HDF網址:http://ambari.apache.org/,
????因為HortonWorks已經被Cloudera收購,所以HDP的使用也可能會逐漸減少,商用以CDH為主,
目前使用Apache Hadoop,其版本更迭如下:
-
0.x 系列版本:Hadoop當中最早的一個開源版本,在此基礎上演變而來的1.x以及2.x的版本;
-
1.x 版本系列:Hadoop版本當中的第二代開源版本,主要修復0.x版本的一些bug等;
-
2.x 版本系列:架構產生重大變化,引入了yarn平臺等許多新特性;
-
3.x 版本系列:EC技術、Yarn的時間軸服務等新特性,
3.Hadoop的重要組成
狹義的Hadoop由四部分組成:
-
HDFS(分布式檔案系統)
-
MapReduce(分布式計算框架)
-
Yarn(資源協調框架)
-
Common模塊
(1)HDFS(Hadoop Distribute File System )——高可靠、高吞吐量的分布式檔案系統
HDFS的思想是分而治之,主要功能如下:
- 資料切割
????將海量資料進行拆分,以保證可以在單臺機器上進行保存,
????例如100T資料拆分為10G一個資料塊由一個電腦節點存盤這個資料塊,
- 制作副本
????由于電腦可能出現宕機的情況,所以需要制作副本,讓另外的電腦也保存相同的資料,
- 分散儲存
????將資料切割后,分散存盤在不同的機器上,同時在另外的機器上有相同資料的副本,
圖示如下:

HDFS屬于Master/Slave(主從架構):
- NameNode(nn)
????屬于Master節點,主要負責管理和維護元資料:
????存盤檔案的元資料,元資料記錄了檔案名、檔案目錄結構、檔案屬性(生成時間、副本數、檔案權限),以及每個檔案的塊串列和塊所在的DataNode節點資訊等,
????
- SecondaryNameNode(2nn)
????輔助NameNode管理和維護元資料,用來監控HDFS狀態的輔助后臺程式,每隔一段時間獲取HDFS元資料快照,
- DataNode(dn)
????屬于Slave節點,負責存盤檔案資料塊:
????在本地檔案系統存盤檔案塊資料,以及塊資料的校驗
????
其中,NN、2NN、DN既是角色名稱、行程名稱,也代指電腦節點名稱,
HDFS存入程序:
對于大資料進行拆分(切割)得到資料塊,可能得到多個資料塊,由多個DataNode進行存盤,
HDFS獲取檔案程序:
向NameNode請求獲取到之前存入檔案的塊以及塊所在的DataNode的資訊,分別下載并最終合并,就得到之前的檔案,
(2)Hadoop MapReduce——一個分布式的離線并行計算框架
MapReduce的思想也是分而治之,主要功能如下:
- 拆解任務
????將資料進行切分,得到切片,
-
分散處理
-
匯整結果
圖示如下:

M a p R e d u c e 計 算 = M a p 階 段 + R e d u c e 階 段 MapReduce計算 = Map階段 + Reduce階段 MapReduce計算=Map階段+Reduce階段:
- Map階段就是“分”的階段
????將資料切分到多個節點后,多個節點并行處理 輸入資料,即每個節點負責一份資料的計算,并得到部分結果,
- Reduce階段就是“合”的階段
????對Map階段的輸出結果進行匯總,得到全域的結果,
(3)Hadoop Yarn——作業調度與集群資源管理的框架
Yarn負責集群中計算資源的分配和作業任務的調度:

Yarn架構也是主從架構主要角色如下:
- ResourceManager(rm)
????是Master,處理客戶端請求、啟動/監控ApplicationMaster、監控NodeManager、資源分配與調度,
- NodeManager(nm)
????是Slave,單個節點上的資源管理、處理來自ResourceManager的命令、處理來自ApplicationMaster的命令,
- ApplicationMaster(am)
????是計算任務專員,資料切分、為應用程式(任務)申請資源,并分配給內部任務、任務監控與容錯,
- Container
????對任務運行環境的抽象,一個Container負責一個Task,封裝了CPU、記憶體等多維資源以及環境變數、啟動命令等任務運行相關的資訊,可以理解為虛擬資源集合或小型計算機,
(4)Hadoop Common——支持其他模塊的工具模塊
包括以下幾部分:
- Configuration
????公共的配置,包括集群節點、節點資源、IP、主機名、引數等配置項
- RPC
????遠程程序呼叫,是分布式框架中多個節點之間進行網路通訊的首選方式,高效、穩定、安全,Hadoop中實作了Hadoop RPC框架,
-
序列化機制
-
日志操作
4.Apache Hadoop 完全分布式集群搭建
(1)虛擬機環境準備
Hadoop框架是采用Java語言撰寫的,所以需要Java環境(JVM)才能運行,即虛擬機中必須安裝JDK,同時必須使用JDK8版本,而不能使用更高的版本,因為在撰寫Hadoop時使用的就不是JDK8以上的版本,
之前在虛擬機上安裝的就是jdk-8u231-linux-x64,
Hadoop搭建的方式包括3種:
- 單機模式
????單節點、不是集群,生產不會使用這種模式,
- 單機偽分布式模式
????單節點、多執行緒模擬集群的效果,因為發揮的也只是一臺電腦的性能,因此生產中不會使用,
- 完全分布式模式
????多臺節點,真正的分布式Hadoop集群的搭建,生產環境建議使用這種方式,
完全分布式集群需要多臺電腦,目前可以使用VMWare軟體虛擬三臺Linux節點,同時建議系統選擇CentOS 7,之前已經準備好了,同時已經完成靜態IP配置、關閉防火墻、修改主機名、配置免密登錄和集群時間同步等操作,
之前已經在虛擬機中安裝好了JDK和Tomcat,并且是將它們安裝在/opt/software目錄下的,將Hadoop安裝到相同的目錄,
在安裝之前需要下載Hadoop的安裝包,可以到https://hadoop.apache.org/releases.html下載最新版,也可以在https://archive.apache.org/dist/hadoop/common/中選擇合適的版本進行下載,這里選擇2.9.2版本,
可以先點擊https://archive.apache.org/dist/hadoop/common/hadoop-2.9.2/hadoop-2.9.2.tar.gz下載到本地,再使用工具上傳到虛擬機的/opt/software目錄下,也可以直接在虛擬機的/opt/software目錄下執行wget https://archive.apache.org/dist/hadoop/common/hadoop-2.9.2/hadoop-2.9.2.tar.gz進行下載,可以根據需要選擇,
在使用時,可以參考Hadoop官方檔案https://hadoop.apache.org/docs/r2.9.2/,
(2)環境變數配置
現在進行集群規劃,對3臺虛擬機的角色分布如下:
| 框架 | node01 | node02 | node03 |
|---|---|---|---|
| HDFS | NameNode、DataNode | DataNode | SecondaryNameNode、DataNode |
| Yarn | NodeManager | NodeManager | NodeManager、ResourceManager |
以node01為NameNode,所以也只需要在這一臺機器下載安裝Hadoop,
現在在node01上安裝Hadoop:
(1)解壓檔案
進入software目錄cd /opt/software,解壓之前上傳的Hadoop安裝包tar -xzvf hadoop-2.9.2.tar.gz,再將安裝包移動到package目錄mv hadoop-2.9.2.tar.gz ../packages/,查看software目錄:
[root@node01 software]$ ll -ht
總用量 0
drwxr-xr-x. 3 root root 69 8月 20 14:22 tomcat
drwxr-xr-x. 3 root root 26 8月 20 14:09 java
drwxr-xr-x 9 501 dialout 149 11月 13 2018 hadoop-2.9.2
hadoop-2.9.2就是安裝的目錄,
(2)配置環境變數
編輯profile檔案vim /etc/profile,添加Hadoop到環境變數,在末尾添加如下內容即可:
# HADOOP_HOME
export HADOOP_HOME=/opt/software/hadoop-2.9.2
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
其中,安裝路徑/opt/software/hadoop-2.9.2可以根據自己的需要進行修改;
保存退出后,再執行source /etc/profile使環境變數生效,
可以使用hadoop version命令驗證Hadoop是否安裝成功,如輸出類似如下,則說明安裝成功:
[root@node01 software]$ hadoop version
Hadoop 2.9.2
Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r 826afbeae31ca687bc2f8471dc841b66ed2c6704
Compiled by ajisaka on 2018-11-13T12:42Z
Compiled with protoc 2.5.0
From source with checksum 3a9939967262218aa556c684d107985
This command was run using /opt/software/hadoop-2.9.2/share/hadoop/common/hadoop-common-2.9.2.jar
在安裝成功之后,可以查看Hadoop的安裝目錄,如下:
[root@node01 software]$ cd hadoop-2.9.2/
[root@node01 hadoop-2.9.2]$ ll -ht
總用量 128K
drwxr-xr-x 2 501 dialout 106 11月 13 2018 include
drwxr-xr-x 2 501 dialout 194 11月 13 2018 bin
drwxr-xr-x 2 501 dialout 239 11月 13 2018 libexec
drwxr-xr-x 3 501 dialout 4.0K 11月 13 2018 sbin
drwxr-xr-x 3 501 dialout 20 11月 13 2018 etc
drwxr-xr-x 3 501 dialout 20 11月 13 2018 lib
-rw-r--r-- 1 501 dialout 104K 11月 13 2018 LICENSE.txt
-rw-r--r-- 1 501 dialout 16K 11月 13 2018 NOTICE.txt
-rw-r--r-- 1 501 dialout 1.4K 11月 13 2018 README.txt
drwxr-xr-x 4 501 dialout 31 11月 13 2018 share
可以看到,此時各個目錄的屬主和屬組是501和dialout,而之后都是使用root用戶來進行Hadoop集群的相關操作,同時需要分發到其他節點,為了保證屬主和屬組都正常、避免出現資訊混亂,因此這里需要修改Hadoop安裝目錄所屬用戶和用戶組,執行命令chown -R root:root /opt/software/hadoop-2.9.2/,執行后再查看,如下:
[root@node01 hadoop-2.9.2]$ ll .. -ht
總用量 0
drwxr-xr-x. 3 root root 69 8月 20 14:22 tomcat
drwxr-xr-x. 3 root root 26 8月 20 14:09 java
drwxr-xr-x 9 root root 149 11月 13 2018 hadoop-2.9.2
[root@node01 hadoop-2.9.2]$ ll -ht
總用量 128K
drwxr-xr-x 2 root root 106 11月 13 2018 include
drwxr-xr-x 2 root root 194 11月 13 2018 bin
drwxr-xr-x 2 root root 239 11月 13 2018 libexec
drwxr-xr-x 3 root root 4.0K 11月 13 2018 sbin
drwxr-xr-x 3 root root 20 11月 13 2018 etc
drwxr-xr-x 3 root root 20 11月 13 2018 lib
-rw-r--r-- 1 root root 104K 11月 13 2018 LICENSE.txt
-rw-r--r-- 1 root root 16K 11月 13 2018 NOTICE.txt
-rw-r--r-- 1 root root 1.4K 11月 13 2018 README.txt
drwxr-xr-x 4 root root 31 11月 13 2018 share
可以看到,此時Hadoop安裝目錄的各個子目錄的屬主和陣列已經修改,
安裝目錄中各個部分的含義如下:
- bin目錄
????對Hadoop進行操作的相關命令,如hadoop、hdfs等,如下:
./bin/
├── container-executor
├── hadoop
├── hadoop.cmd
├── hdfs
├── hdfs.cmd
├── mapred
├── mapred.cmd
├── rcc
├── test-container-executor
├── yarn
└── yarn.cmd
????其中,以.cmd結尾的是在Windows上使用的,其他是在Linux上使用的,包含了hadoop、hdfs和yarn,因為之前將該目錄配置到了環境變數,所以可以執行hadoop version命令,
- etc目錄
????Hadoop的組態檔目錄,如hdfs-site.xml、core-site.xml等,
- lib目錄
????Hadoop本地庫(解壓縮的依賴),
- libexec目錄
????針對本地作業系統的依賴庫,
- include目錄
????包含了jar包,
- sbin目錄
????存放的是Hadoop集群啟動和停止的相關腳本、命令,如下:
./sbin/
├── distribute-exclude.sh
├── FederationStateStore
│ ├── MySQL
│ │ ├── dropDatabase.sql
│ │ ├── dropStoreProcedures.sql
│ │ ├── dropTables.sql
│ │ ├── dropUser.sql
│ │ ├── FederationStateStoreDatabase.sql
│ │ ├── FederationStateStoreStoredProcs.sql
│ │ ├── FederationStateStoreTables.sql
│ │ └── FederationStateStoreUser.sql
│ └── SQLServer
│ ├── FederationStateStoreStoreProcs.sql
│ └── FederationStateStoreTables.sql
├── hadoop-daemon.sh
├── hadoop-daemons.sh
├── hdfs-config.cmd
├── hdfs-config.sh
├── httpfs.sh
├── kms.sh
├── mr-jobhistory-daemon.sh
├── refresh-namenodes.sh
├── slaves.sh
├── start-all.cmd
├── start-all.sh
├── start-balancer.sh
├── start-dfs.cmd
├── start-dfs.sh
├── start-secure-dns.sh
├── start-yarn.cmd
├── start-yarn.sh
├── stop-all.cmd
├── stop-all.sh
├── stop-balancer.sh
├── stop-dfs.cmd
├── stop-dfs.sh
├── stop-secure-dns.sh
├── stop-yarn.cmd
├── stop-yarn.sh
├── yarn-daemon.sh
└── yarn-daemons.sh
????包含了sh和cmd檔案,
- share目錄
????Hadoop的一些依賴jar、公開檔案和官方案例等,
(3)集群規劃實施
這里選擇先在node01節點把所有配置項配置完成后,再將配置分發給其他節點,來保證所有結點的配置是統一的,
Hadoop集群配置包括三部分:
-
HDFS集群配置
-
MapReduce集群配置
-
Yarn集群配置
先在node01節點進行HDFS集群配置,步驟如下:
(1)將JDK路徑明確配置給HDFS——修改hadoop-env.sh
在Hadoop安裝目錄進入Hadoop組態檔目錄cd etc/hadoop/,可以看到組態檔:
.
├── capacity-scheduler.xml
├── configuration.xsl
├── container-executor.cfg
├── core-site.xml
├── hadoop-env.cmd
├── hadoop-env.sh
├── hadoop-metrics2.properties
├── hadoop-metrics.properties
├── hadoop-policy.xml
├── hdfs-site.xml
├── httpfs-env.sh
├── httpfs-log4j.properties
├── httpfs-signature.secret
├── httpfs-site.xml
├── kms-acls.xml
├── kms-env.sh
├── kms-log4j.properties
├── kms-site.xml
├── log4j.properties
├── mapred-env.cmd
├── mapred-env.sh
├── mapred-queues.xml.template
├── mapred-site.xml.template
├── slaves
├── ssl-client.xml.example
├── ssl-server.xml.example
├── yarn-env.cmd
├── yarn-env.sh
└── yarn-site.xml
修改hadoop-env.shvim hadoop-env.sh指定JDK安裝路徑,如下:
# The java implementation to use.
# export JAVA_HOME=${JAVA_HOME}
export JAVA_HOME=/opt/software/java/jdk1.8.0_231
其中,JDK安裝路徑可以通過echo $JAVA_HOME命令獲取;
保存退出,
(2)指定NameNode節點以及資料存盤目錄——修改core-site.xml
修改core-site.xmlvim core-site.xml,如下:
<configuration>
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://node01:9000</value>
</property>
<!-- 指定Hadoop運行時產生檔案的存盤目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/software/hadoop-2.9.2/data/tmp</value>
</property>
</configuration>
其中,配置項需要放到core-site.xml檔案中的configuration標簽中,配置才會生效;
Hadoop對于XML組態檔都有默認配置,配置項的含義可以從檔案https://hadoop.apache.org/docs/r2.9.2/hadoop-project-dist/hadoop-common/core-default.xml中進行查詢:例如fs.defaultFS配置項是組態檔系統的名稱,配置值是一個 URI,用于確定檔案系統的主機、埠等;hadoop.tmp.dir配置項是其他臨時目錄的基礎,
保存后退出,
(3)指定SecondaryNameNode節點——修改hdfs-site.xml
編輯hdfs-site.xmlvim hdfs-site.xml,如下:
<configuration>
<!-- 指定Hadoop輔助名稱節點主機配置 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node03:50090</value>
</property>
<!--副本數量 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
</configuration>
其中,指定了副本數量后,每個資料塊有3個副本;
也可以在https://hadoop.apache.org/docs/r2.9.2/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml中查看默認配置;
保存后退出,
(4)指定DataNode從節點——修改etc/hadoop/slaves檔案,每個節點配置資訊占一行)
編輯slavesvim slaves,如下:
node01
node02
node03
需要確保本檔案中每一行結尾不允許有空格、只有節點主機名,同時檔案中不允許有空行,否則讀取配置時無法識別,
再進行MapReduce集群配置:
(1)將JDK路徑明確配置給MapReduce——修改mapred-env.sh
編輯mapred-env.shvim mapred-env.sh如下:
# export JAVA_HOME=/home/y/libexec/jdk1.6.0/
export JAVA_HOME=/opt/software/java/jdk1.8.0_231
保存退出,
(2)指定MapReduce計算框架運行Yarn資源調度框架——修改mapred-site.xml
修改mapred-site.xml組態檔名cp mapred-site.xml.template mapred-site.xml,再編輯mapred-site.xmlvim mapred-site.xml,如下:
<configuration>
<!-- 指定MR運行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
mapred-site.xml默認配置可參考https://hadoop.apache.org/docs/r2.9.2/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml;
保存退出,
最后進行Yarn集群配置:
(1)將JDK路徑明確配置給Yarn——修改yarn-env.sh
修改yarn-env.shvim yarn-env.sh,如下:
# export JAVA_HOME=/home/y/libexec/jdk1.6.0/
export JAVA_HOME=/opt/software/java/jdk1.8.0_231
保存退出,
(2)指定ResourceManager老大節點所在計算機節點——修改yarn-site.xml
編輯yarn-site.xmlvim yarn-site.xml,如下:
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node03</value>
</property>
<!-- Reducer獲取資料的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
其中,默認配置可查看https://hadoop.apache.org/docs/r2.9.2/hadoop-yarn/hadoop-yarn-common/yarn-default.xml;
保存退出,
(3)指定NodeManager節點——通過slaves檔案內容確定
一個DataNode就對應一個NodeManager,所以前面已經配置過slaves檔案,所以這里可以省略,
(4)撰寫集群分發腳本
現在需要進行集群分發,即將Hadoop安裝目錄(包括已經配置好的組態檔)可以使用scp,這里選擇使用rsync,
rsync遠程同步工具主要用于備份和鏡像,具有速度快、避免復制相同內容和支持符號鏈接的優點,
rsync和scp區別如下:
用rsync做檔案的復制要比scp的速度快,rsync只對差異檔案做更新 ;
scp是把所有檔案都復制過去,所以效率較低,
(1)3臺虛擬機安裝
# 命令 選項引數 要拷貝的檔案路徑/名稱 目的用戶@主機:目的路徑/名稱
rsync -rvl $pdir/$fname $user@$host:$pdir/$fname
其中,各選項含義如下:
| 選項 | 功能 |
|---|---|
| -r | 遞回 |
| -v | 顯示復制程序 |
| -l | 拷貝符號連接 |
先使用rsync實作拷貝目錄:
(1)3臺虛擬機安裝rsync
在連接工具中同時連接3臺虛擬機,再選擇發送到全部會話 執行yum install -y rsync,即可一次性在3臺虛擬機安裝rsync,
(2)測驗rsync,把node01節點的/opt/packages目錄同步到node02節點的root用戶下的/opt/目錄下
# 虛擬機node01執行rsync命令
[root@node01 ~]$ rsync -ivl /opt/packages/ root@node02:/opt/packages
skipping directory .
sent 16 bytes received 12 bytes 18.67 bytes/sec
total size is 0 speedup is 0.00
[root@node01 ~]$ rsync -rvl /opt/packages/ root@node02:/opt/packages
sending incremental file list
created directory /opt/packages
./
apache-tomcat-7.0.57.tar.gz
hadoop-2.9.2.tar.gz
jdk-8u231-linux-x64.tar.gz
sent 569,638,685 bytes received 112 bytes 30,791,286.32 bytes/sec
total size is 569,499,359 speedup is 1.00
# 虛擬機node02查看
[root@node02 opt]$ ls /opt/
packages software
[root@node02 opt]$ ll /opt/packages/
總用量 556156
-rw-r--r-- 1 root root 8900571 8月 25 10:28 apache-tomcat-7.0.57.tar.gz
-rw-r--r-- 1 root root 366447449 8月 25 10:28 hadoop-2.9.2.tar.gz
-rwxr-xr-x 1 root root 194151339 8月 25 10:28 jdk-8u231-linux-x64.tar.gz
可以看到,已經將packages目錄及其內部的檔案拷貝到node02節點,
節點比較少的時候,直接執行命令進行拷貝是可以的,但是如果節點很多,一一執行命令效率就很低了,此時就可以撰寫集群分發腳本來實作回圈復制檔案到集群所有節點的相同目錄下,
期望的目標是直接執行腳本 要同步的檔案名稱命令就能實作高效分發,同時將腳本放在/usr/local/bin目錄下,方便root用戶在系統任何地方直接執行,
node01節點腳本實作的步驟如下:
(1)切換目錄并編輯檔案
切換到/usr/local/bin目錄cd /usr/local/bin/,編輯腳本檔案vim rsync-script,如下:
#!/bin/bash
# 1.獲取傳入腳本的引數,包括引數個數和引數值
paramnum=$#
if ((paramnum==0)); then
echo "no args"
exit;
fi
# 2.獲取檔案名稱
p1=$1
filename=`basename $p1`
echo filename=${filename}
# 3.獲取檔案的絕對路徑,即獲取到檔案的目錄資訊
dir_name=`cd -P $(dirname $p1);pwd`
echo dirname=${dir_name}
# 4.獲取到當前用戶資訊
user=`whoami`
# 5.回圈執行rsync命令,把檔案發送到集群中的所有其他節點
for((host=1; host<4; host++)); do
echo --------------target hostname=node0$host--------------
rsync -rvl ${dir_name}/${filename} ${user}@node0$host:${dir_name}
done
保存退出,
(2)修改腳本權限
給rsync-script腳本檔案添加執行權限:
[root@node01 bin]$ chmod 777 rsync-script
[root@node01 bin]$ ll
總用量 4
-rwxrwxrwx 1 root root 638 8月 25 10:53 rsync-script
(3)執行腳本進行測驗
呼叫腳本的語法格式為rsync-script 檔案名稱,現在以分發rsync-script腳本檔案自己為例進行測驗:
# node01
[root@node01 bin]$ rsync-script rsync-script
filename=rsync-script
dirname=/usr/local/bin
--------------target hostname=node01--------------
sending incremental file list
sent 68 bytes received 12 bytes 160.00 bytes/sec
total size is 652 speedup is 8.15
--------------target hostname=node02--------------
sending incremental file list
rsync-script
sent 767 bytes received 35 bytes 1,604.00 bytes/sec
total size is 652 speedup is 0.81
--------------target hostname=node03--------------
sending incremental file list
rsync-script
sent 767 bytes received 35 bytes 1,604.00 bytes/sec
total size is 652 speedup is 0.81
# node02
[root@node02 opt]$ ll /usr/local/bin/
總用量 4
-rwxr-xr-x 1 root root 652 8月 25 11:10 rsync-script
# node03
[root@node03 ~]$ ll /usr/local/bin/
總用量 4
-rwxr-xr-x 1 root root 652 8月 25 11:10 rsync-script
可以看到,成功將script檔案拷貝到了其他兩個節點,
(4)呼叫腳本分發Hadoop安裝目錄到其他節點
節點1執行命令rsync-script /opt/software/hadoop-2.9.2/,等待執行完畢,查看其他兩個節點:
# node02
[root@node02 opt]$ ll /opt/software/
總用量 0
drwxr-xr-x 9 root root 149 8月 25 11:17 hadoop-2.9.2
drwxr-xr-x. 3 root root 26 8月 20 14:09 java
drwxr-xr-x. 3 root root 69 8月 20 14:22 tomcat
# node03
[root@node03 ~]$ ll /opt/software/
總用量 0
drwxr-xr-x 9 root root 149 8月 25 11:17 hadoop-2.9.2
drwxr-xr-x. 3 root root 26 8月 20 14:09 java
drwxr-xr-x. 3 root root 69 8月 20 14:22 tomcat
可以看到,已經將Hadoop安裝目錄拷貝到了其他兩個節點,
(5)集群啟動
需要注意:
如果集群是第一次啟動,需要在Namenode所在節點格式化NameNode,非第一次不用執行格式化Namenode操作 ,
集群啟動有兩種方式,分別為單節點啟動和集群群起兩種方式,
Ⅰ 單節點啟動
先使用單節點啟動 方式實作啟動集群:
先啟動HDFS:
(0)格式化NameNode
格式化NameNode需要在NameNode所在的節點執行,命令為hadoop namenode -format,如下:
[root@node01 ~]$ hadoop namenode -format
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.
21/08/25 11:36:54 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = node01/192.168.31.155
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 2.9.2
...
21/08/25 11:36:55 INFO common.Storage: Storage directory /opt/software/hadoop-2.9.2/data/tmp/dfs/name has been successfully formatted.
21/08/25 11:36:55 INFO namenode.FSImageFormatProtobuf: Saving image file /opt/software/hadoop-2.9.2/data/tmp/dfs/name/current/fsimage.ckpt_0000000000000000000 using no compression
21/08/25 11:36:55 INFO namenode.FSImageFormatProtobuf: Image file /opt/software/hadoop-2.9.2/data/tmp/dfs/name/current/fsimage.ckpt_0000000000000000000 of size 323 bytes saved in 0 seconds .
21/08/25 11:36:56 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
21/08/25 11:36:56 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at node01/192.168.31.155
************************************************************/
如果出現has been successfully formatted.的日志資訊,則說明NameNode格式化成功;
可以看到,格式化后創建了檔案/opt/software/hadoop-2.9.2/data/tmp/dfs/name/current/fsimage.ckpt_0000000000000000000,查看如下:
[root@node01 ~]$ cd /opt/software/hadoop-2.9.2/data/tmp/dfs/name/current
[root@node01 current]$ ll
總用量 16
-rw-r--r-- 1 root root 323 8月 25 11:36 fsimage_0000000000000000000
-rw-r--r-- 1 root root 62 8月 25 11:36 fsimage_0000000000000000000.md5
-rw-r--r-- 1 root root 2 8月 25 11:36 seen_txid
-rw-r--r-- 1 root root 219 8月 25 11:36 VERSION
其中,fsimage_0000000000000000000是生成的Image檔案、即元資料檔案,fsimage_0000000000000000000.md5用于校驗,seen_txid用于記錄id編號,VERSION用于版本資訊,
需要注意,只是在第一次啟動集群時,需要執行,之后啟動都不需要再進行NameNode格式化,
(1)在node01節點上啟動NameNode
啟動NameNode的腳本檔案位于sbin目錄下,
在node01上啟動NameNode,如下:
[root@node01 current]$ hadoop-daemon.sh start namenode
starting namenode, logging to /opt/software/hadoop-2.9.2/logs/hadoop-root-namenode-node01.out
[root@node01 current]$ jps
21218 Jps
20694 NameNode
可以看到,啟動namenode的日志保存到/opt/software/hadoop-2.9.2/logs/hadoop-root-namenode-node01.out中,如果出現例外需要排查可以查看該日志;
jps命令是查看用于查看Linux中的Java行程,因為Hadoop是用Java撰寫、同時依賴于JVM運行的,所以可以通過查看Java行程來查看是否啟動成功;
可以看到,此時NameNode啟動成功,
(2)在3個節點上分別啟動DataNode
先在node01上啟動DataNode,如下:
[root@node01 current]$ hadoop-daemon.sh start datanode
starting datanode, logging to /opt/software/hadoop-2.9.2/logs/hadoop-root-datanode-node01.out
[root@node01 current]$ jps
22212 Jps
20694 NameNode
21935 DataNode
其中,DataNode的日志保存到/opt/software/hadoop-2.9.2/logs/hadoop-root-datanode-node01.out課用于查看;
node01節點成功啟動了DataNode,
為了方便在node02和node03執行啟動命令,需要將Hadoop的安裝目錄添加到環境變數,和node01類似,先編輯profile檔案vim /etc/profile,在后面添加以下內容:
# HADOOP_HOME
export HADOOP_HOME=/opt/software/hadoop-2.9.2
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
再執行source /etc/profile使環境變數生效,
然后再執行命令啟動DataNode:
# node02
[root@node02 opt]$ hadoop-daemon.sh start datanode
starting datanode, logging to /opt/software/hadoop-2.9.2/logs/hadoop-root-datanode-node02.out
[root@node02 opt]$ jps
42818 DataNode
43154 Jps
# node03
[root@node03 ~]$ hadoop-daemon.sh start datanode
starting datanode, logging to /opt/software/hadoop-2.9.2/logs/hadoop-root-datanode-node03.out
[root@node03 ~]$ jps
43232 Jps
42587 DataNode
可以看到,成功啟動了node02和node03上的DataNode,
(3)進行網頁驗證
除了使用jps在節點上進行驗證,還可以訪問http://NameNode節點主機名:50070來進行查看,這里即http://node01:50070,如下:

如果出現此頁面即說明啟動HDFS成功;
可以看到該集群的概覽資訊,同時可以看到HDFS配置的可用存盤容量、可用的DataNode節點數等資訊,
需要注意,如果不能通過http://NameNode節點主機名:50070的方式訪問,有兩種方式進行解決:
(1)可以通過IP來訪問,例如http://192.168.31.155:50070;
(2)可能是因為Windows下沒有配置hosts檔案進行IP與主機名的映射,需要修改位于C:\Windows\System32\drivers\etc下的hosts檔案,如下:

可以選擇記事本或者Notepad++進行修改,因為該檔案為只讀不可修改,所以在編輯時需要以管理員身份打開記事本或Notepad++軟體,再在軟體在打開hosts檔案進行編輯,在檔案最后增加3臺虛擬機的IP映射即可:
192.168.31.155 node01
192.168.31.156 node02
192.168.31.157 node03
可以根據自己的情況修改IP和主機名,最后保存退出,就能訪問到http://node01:50070了,
還可以瀏覽檔案系統,訪問http://192.168.31.155:50070/explorer.html#/,如下:

可以看到,和Linux類似,根目錄也是/;
目前還沒有任何內容,后面可以在根目錄下創建和添加檔案,
再啟動Yarn,如下:
(1)啟動ResourceManager
因為Yarn框架的ResourceManager位于node03,所以在node03啟動ResourceManager,執行yarn-daemon.sh start resourcemanager,如下:
[root@node03 ~]$ yarn-daemon.sh start resourcemanager
starting resourcemanager, logging to /opt/software/hadoop-2.9.2/logs/yarn-root-resourcemanager-node03.out
[root@node03 ~]$ jps
75809 ResourceManager
75890 Jps
42587 DataNode
可以看到,成功啟動ResourceManager,
(2)啟動NodeManager
在3個節點上執行yarn-daemon.sh start nodemanager啟動NodeManager,如下:
# node01
[root@node01 ~]$ yarn-daemon.sh start nodemanager
starting nodemanager, logging to /opt/software/hadoop-2.9.2/logs/yarn-root-nodemanager-node01.out
[root@node01 ~]$ jps
20694 NameNode
72441 Jps
72331 NodeManager
21935 DataNode
# node02
[root@node02 ~]$ yarn-daemon.sh start nodemanager
starting nodemanager, logging to /opt/software/hadoop-2.9.2/logs/yarn-root-nodemanager-node02.out
[root@node02 ~]$ jps
42818 DataNode
78247 Jps
78041 NodeManager
# node03
[root@node03 ~]$ yarn-daemon.sh start nodemanager
starting nodemanager, logging to /opt/software/hadoop-2.9.2/logs/yarn-root-nodemanager-node03.out
[root@node03 ~]$ jps
105237 ResourceManager
78161 Jps
77881 NodeManager
42587 DataNode
可以看到,3個節點上都成功啟動了NodeManager,
Ⅱ 集群群起
前面的單節點啟動方式是在每一個節點機器分別執行啟動命令啟動對應的服務,在節點較少時具有一定的可行性,但是節點數很多、達到成千上萬個時,可能就不太現實了,
此時就需要用到集群群起的方式來啟動集群服務,
因為前面已經通過單節點啟動的方式啟動了部分服務,因此需要先停掉已經開啟的服務:
# node01
[root@node01 ~]$ hadoop-daemon.sh stop namenode
stopping namenode
[root@node01 ~]$ hadoop-daemon.sh stop datanode
stopping datanode
[root@node01 ~]$ yarn-daemon.sh stop nodemanager
stopping nodemanager
nodemanager did not stop gracefully after 5 seconds: killing with kill -9
[root@node01 ~]$ jps
84312 Jps
# node02
[root@node02 ~]$ hadoop-daemon.sh stop datanode
stopping datanode
[root@node02 ~]$ yarn-daemon.sh stop nodemanager
stopping nodemanager
nodemanager did not stop gracefully after 5 seconds: killing with kill -9
[root@node02 ~]$ jps
106580 Jps
# node03
[root@node03 ~]$ hadoop-daemon.sh stop datanode
stopping datanode
[root@node03 ~]$ yarn-daemon.sh stop resourcemanager
stopping resourcemanager
[root@node03 ~]$ jps
118737 Jps
因為單節點啟動時NameNode已經進行過格式化,所以一定不需要再進行格式化 ,否則DateNode和NameNode版本號不一致,就不能啟動HDFS成功,
現在進行群起:
(1)啟動HDFS
在HDFS主節點node01上執行start-dfs.sh啟動所有HDFS行程,如下:
# node01
[root@node01 ~]$ start-dfs.sh
Starting namenodes on [node01]
node01: starting namenode, logging to /opt/software/hadoop-2.9.2/logs/hadoop-root-namenode-node01.out
node02: starting datanode, logging to /opt/software/hadoop-2.9.2/logs/hadoop-root-datanode-node02.out
node03: starting datanode, logging to /opt/software/hadoop-2.9.2/logs/hadoop-root-datanode-node03.out
node01: starting datanode, logging to /opt/software/hadoop-2.9.2/logs/hadoop-root-datanode-node01.out
Starting secondary namenodes [node03]
node03: starting secondarynamenode, logging to /opt/software/hadoop-2.9.2/logs/hadoop-root-secondarynamenode-node03.out
[root@node01 ~]$ jps
122227 DataNode
122026 NameNode
122877 Jps
# node02
[root@node02 ~]$ jps
127489 DataNode
128151 Jps
# node03
[root@node03 ~]$ jps
129040 Jps
128531 SecondaryNameNode
128252 DataNode
可以看到,已經在3個 節點上啟動了所有的HDFS行程;
此時查看http://node01:50070/dfshealth.html#tab-overview也能看到zhe你剛才的資料,
(2)啟動Yarn
在Yarn主節點node03上執行start-yarn.sh來啟動所有Yarn行程,如下:
# node03
[root@node03 ~]$ start-yarn.sh
starting yarn daemons
starting resourcemanager, logging to /opt/software/hadoop-2.9.2/logs/yarn-root-resourcemanager-node03.out
node02: starting nodemanager, logging to /opt/software/hadoop-2.9.2/logs/yarn-root-nodemanager-node02.out
node01: starting nodemanager, logging to /opt/software/hadoop-2.9.2/logs/yarn-root-nodemanager-node01.out
node03: starting nodemanager, logging to /opt/software/hadoop-2.9.2/logs/yarn-root-nodemanager-node03.out
[root@node03 ~]$ jps
128531 SecondaryNameNode
9244 ResourceManager
128252 DataNode
9406 NodeManager
9839 Jps
# node01
[root@node01 ~]$ jps
122227 DataNode
2969 NodeManager
122026 NameNode
3820 Jps
# node02
[root@node02 ~]$ jps
127489 DataNode
8912 Jps
8181 NodeManager
可以看到,所有的Yarn行程啟動成功;
顯然,相比于單節點啟動,群起方式要方便很多;
需要注意,NameNode和ResourceManger不是在同一臺機器,不能在NameNode上啟動 YARN,應該在ResouceManager所在的機器上啟動Yarn,
Ⅲ 集群停止
停止集群服務也分為兩種方式:
(1)各個服務組件逐一啟動和停止
啟動和停止HDFS組件的命令如下:
hadoop-daemon.sh start / stop namenode / datanode / secondarynamenode
啟動和停止Yarn組件的命令如下:
yarn-daemon.sh start / stop resourcemanager / nodemanager
(2)各個模塊整體啟動和停止
整體啟動和停止HDFS的命令如下:
start-dfs.sh / stop-dfs.sh
整體啟動和停止Yarn的命令如下:
start-yarn.sh / stop-yarn.sh
顯然,整體啟動和停止集群的方式更加方便快捷,也更常用,
(6)集群測驗
在前面已經啟動了HDFS和Yarn,現在可以分別進行測驗,
1.HDFS 分布式存盤初體驗
即從節點本地檔案系統上傳下載檔案驗證HDFS集群作業正常,可以任選一個節點進行操作,這里選擇node01,步驟如下:
(1)節點本地創建1個測驗檔案并寫入內容
節點本地執行vim test.txt編輯檔案,如下:
hello, hdfs
(2)HDFS檔案系統創建目錄
執行hdfs dfs -mkdir -p /test/input命令在HDFS檔案系統中創建測驗目錄,
(3)HDFS上傳測驗檔案到檔案系統中
執行hdfs dfs -put /root/test.txt /test/input將剛剛創建的檔案上傳到檔案系統中創建的目錄下,
(4)HDFS下載上傳的檔案
如下:
[root@node01 ~]$ rm -f test.txt
[root@node01 ~]$ ll
總用量 8
-rw-------. 1 root root 1259 8月 19 03:28 anaconda-ks.cfg
drwxr-xr-x. 3 root root 4096 8月 24 21:07 lxDemo
[root@node01 ~]$ hdfs dfs -get /test/input/test.txt
[root@node01 ~]$ ll
總用量 12
-rw-------. 1 root root 1259 8月 19 03:28 anaconda-ks.cfg
drwxr-xr-x. 3 root root 4096 8月 24 21:07 lxDemo
-rw-r--r-- 1 root root 12 8月 25 20:26 test.txt
[root@node01 ~]$ cat test.txt
hello, hdfs
可以看到,從HDFS檔案系統中下載了之前上傳的檔案,同時檔案內容相同,
除了在節點中下載,還可以在本地瀏覽器下載,如下:

2.MapReduce 分布式計算初體驗
從節點中給MapReduce分配任務驗證Yarn集群作業正常,也可以任選一個節點進行操作,步驟如下:
(1)節點本地創建測驗檔案
node01節點創建測驗文本檔案vim wc.txt,如下:
Apache Hadoop 2.9.2 is a point release in the 2.x.y release line, building upon the previous stable release 2.9.1.
Here is a short overview of the major features and improvements.
Common
Aliyun OSS Support. See the user documentation for more details.
HADOOP Resource Estimator. See the user documentation for more details.
HDFS
HDFS Router based federation. See the user documentation for more details.
YARN
YARN Timeline Service v.2. See the user documentation for more details.
YARN Federation. See the user documentation for more details.
Opportunistic Containers. See the user documentation for more details.
YARN Web UI v.2. See the user documentation for more details.
Changing queue configuration via API (supported only on the Capacity Scheduler). See the user documentation for more details.
Update Resources and Execution Type of an allocated/running container. (supported only on the Capacity Scheduler). See the user documentation for more details.
保存退出,
(2)HDFS檔案系統中創建目錄
執行hdfs dfs -mkdir /wcinput在HDFS檔案系統中創建wcinput目錄,
(3)上傳檔案到檔案系統中的指定目錄
執行hdfs dfs -put wc.txt /wcinput將創建的檔案上傳到剛剛創建好的wcinput目錄下,
(4)執行命令提交任務給MapReduce
執行命令將計算任務提交給MapReduce進行計算,任務會由Yarn進行調度分配,命令如下:
# hadoop jar 示例jar包 示例名稱 輸入目錄 輸出目錄
hadoop jar /opt/software/hadoop-2.9.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.2.jar wordcount /wcinput /wcoutput
這里使用的是Hadoop官方提供的wordcount統計案例;
輸出目錄不能手動創建,應該由MapReduce程式運行時自動創建,
執行如下:
[root@node01 ~]$ hadoop jar /opt/software/hadoop-2.9.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.2.jar wordcount /wcinput /wcoutput
21/08/25 22:36:30 INFO client.RMProxy: Connecting to ResourceManager at node03/192.168.31.157:8032
21/08/25 22:36:32 INFO input.FileInputFormat: Total input files to process : 1
21/08/25 22:36:33 INFO mapreduce.JobSubmitter: number of splits:1
21/08/25 22:36:33 INFO Configuration.deprecation: yarn.resourcemanager.system-metrics-publisher.enabled is deprecated. Instead, use yarn.system-metrics-publisher.enabled
21/08/25 22:36:33 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1629895298908_0001
21/08/25 22:36:34 INFO impl.YarnClientImpl: Submitted application application_1629895298908_0001
21/08/25 22:36:34 INFO mapreduce.Job: The url to track the job: http://node03:8088/proxy/application_1629895298908_0001/
21/08/25 22:36:34 INFO mapreduce.Job: Running job: job_1629895298908_0001
21/08/25 22:36:53 INFO mapreduce.Job: Job job_1629895298908_0001 running in uber mode : false
21/08/25 22:36:53 INFO mapreduce.Job: map 0% reduce 0%
21/08/25 22:37:11 INFO mapreduce.Job: map 100% reduce 0%
21/08/25 22:37:20 INFO mapreduce.Job: map 100% reduce 100%
21/08/25 22:37:21 INFO mapreduce.Job: Job job_1629895298908_0001 completed successfully
21/08/25 22:37:21 INFO mapreduce.Job: Counters: 49
File System Counters
FILE: Number of bytes read=897
FILE: Number of bytes written=398591
FILE: Number of read operations=0
FILE: Number of large read operations=0
FILE: Number of write operations=0
HDFS: Number of bytes read=1065
HDFS: Number of bytes written=624
HDFS: Number of read operations=6
HDFS: Number of large read operations=0
HDFS: Number of write operations=2
Job Counters
Launched map tasks=1
Launched reduce tasks=1
Data-local map tasks=1
Total time spent by all maps in occupied slots (ms)=14530
Total time spent by all reduces in occupied slots (ms)=7187
Total time spent by all map tasks (ms)=14530
Total time spent by all reduce tasks (ms)=7187
Total vcore-milliseconds taken by all map tasks=14530
Total vcore-milliseconds taken by all reduce tasks=7187
Total megabyte-milliseconds taken by all map tasks=14878720
Total megabyte-milliseconds taken by all reduce tasks=7359488
Map-Reduce Framework
Map input records=19
Map output records=144
Map output bytes=1538
Map output materialized bytes=897
Input split bytes=98
Combine input records=144
Combine output records=67
Reduce input groups=67
Reduce shuffle bytes=897
Reduce input records=67
Reduce output records=67
Spilled Records=134
Shuffled Maps =1
Failed Shuffles=0
Merged Map outputs=1
GC time elapsed (ms)=223
CPU time spent (ms)=1350
Physical memory (bytes) snapshot=340258816
Virtual memory (bytes) snapshot=4164100096
Total committed heap usage (bytes)=139587584
Shuffle Errors
BAD_ID=0
CONNECTION=0
IO_ERROR=0
WRONG_LENGTH=0
WRONG_MAP=0
WRONG_REDUCE=0
File Input Format Counters
Bytes Read=967
File Output Format Counters
Bytes Written=624
可以看到,執行任務錢前線連接Yarn架構的ResourceManager ,然后再執行任務,同時可以輸出粗略的進度,最后給出了執行的程序資料和結果概覽,
(5)查看結果
先查看HDFS瀏覽器目錄,如下:

可以看到,之前上傳的wc.txt檔案已經同步,同時將執行的結果放到了程式創建的wcoutput目錄,其中的part-r-00000檔案就保存了詞頻的統計結果,可以進行查看,如下:
[root@node01 ~]$ hdfs dfs -cat /wcoutput/part-r-00000
(supported 2
2.9.1. 1
2.9.2 1
2.x.y 1
API 1
Aliyun 1
Apache 1
Capacity 2
Changing 1
Common 1
Containers. 1
Estimator. 1
Execution 1
Federation. 1
HADOOP 1
HDFS 2
Hadoop 1
Here 1
OSS 1
Opportunistic 1
Resource 1
Resources 1
Router 1
Scheduler). 2
See 9
Service 1
Support. 1
Timeline 1
Type 1
UI 1
Update 1
Web 1
YARN 4
a 2
allocated/running 1
an 1
and 2
based 1
building 1
configuration 1
container. 1
details. 9
documentation 9
features 1
federation. 1
for 9
improvements. 1
in 1
is 2
line, 1
major 1
more 9
of 2
on 2
only 2
overview 1
point 1
previous 1
queue 1
release 3
short 1
stable 1
the 14
upon 1
user 9
v.2. 2
via 1
可以看到,統計到了測驗文本中的次品,所以也印證了Yarn集群啟動成功,
還可以查看更加詳細的資料,包括報錯日志等資訊,此時需要訪問Yarn集群的Web管理頁面來查看,地址為http://Yarn集群主節點主機名:8088,例如http://node03:8088,訪問如下:

可以看到,此時頁面中顯示了任務執行的詳細資訊,包括任務ID、執行時間、執行狀態等,同時還能查看執行歷史詳細資訊,但是因為還沒有配置歷史日志服務器,所以暫時還不能訪問查看,
(7)歷史日志服務器配置
之前在Yarn中運行的任務產生的日志資料不能查看,為了查看程式的歷史運行情況,需要配置歷史日志服務器,
步驟如下:
(1)配置mapred-site.xml
在node01上切換到組態檔目錄/opt/software/hadoop-2.9.2/etc/hadoop并編輯mapred-site.xmlvim mapred-site.xml,在configuration標簽中添加內容,如下:
<configuration>
<!-- 指定MR運行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 歷史服務器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>node01:10020</value>
</property>
<!-- 歷史服務器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node01:19888</value>
</property>
</configuration>
保存退出,
(2)分發mapred-site.xml到其他節點
如下:
# node01
[root@node01 hadoop]$ rsync-script mapred-site.xml
filename=mapred-site.xml
dirname=/opt/software/hadoop-2.9.2/etc/hadoop
--------------target hostname=node01--------------
sending incremental file list
sent 52 bytes received 12 bytes 42.67 bytes/sec
total size is 1,144 speedup is 17.88
--------------target hostname=node02--------------
sending incremental file list
mapred-site.xml
sent 103 bytes received 47 bytes 300.00 bytes/sec
total size is 1,144 speedup is 7.63
--------------target hostname=node03--------------
sending incremental file list
mapred-site.xml
sent 103 bytes received 47 bytes 300.00 bytes/sec
total size is 1,144 speedup is 7.63
# node02
[root@node02 ~]$ tail -n 20 /opt/software/hadoop-2.9.2/etc/hadoop/mapred-site.xml
<configuration>
<!-- 指定MR運行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 歷史服務器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>node01:10020</value>
</property>
<!-- 歷史服務器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node01:19888</value>
</property>
</configuration>
# node03類似
可以看到,已經將修改后的組態檔同步到其他節點,
(3)啟動歷史服務器
因為日志服務是配置在node01節點的,所以啟動也應該在node01節點,執行mr-jobhistory-daemon.sh start historyserver,如下:
[root@node01 hadoop]$ mr-jobhistory-daemon.sh start historyserver
starting historyserver, logging to /opt/software/hadoop-2.9.2/logs/mapred-root-historyserver-node01.out
[root@node01 hadoop]$ jps
38050 NodeManager
37716 NameNode
37878 DataNode
47689 Jps
47611 JobHistoryServer
可以看到,成功啟動了歷史服務器,
(4)訪問網頁查看歷史執行情況
訪問http://日志服務器節點主機名:配置IP,例如http://node01:19888,如下:

可以看到,在訪問日志目錄后,并沒有顯示對應的日志,而是提示未啟用聚合 ,這是因為Yarn集群調度MapReduce任務時,MapTask可能有多個,所以MapTask具體運行在哪個節點是不確定的,MR任務的日志也可能存在于多個節點上,Aggregation 就是將執行某個MR任務的所有NodeManager上產生的資料匯總到一起,方便查看,
日志聚集:
應用(Job)運行完成以后,將應用運行日志資訊從各個Task匯總上傳到HDFS系統上,
日志聚集的好處:
可以方便的查看到程式運行詳情,方便開發除錯,
所以現在需要開啟日志聚集功能,具體步驟如下:
(1)配置yarn-site.xml
在node01編輯yarn-site.xmlvim yarn-site.xml,如下:
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node03</value>
</property>
<!-- Reducer獲取資料的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 日志聚合功能使能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志保留時間設定7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<property>
<name>yarn.log.server.url</name>
<value>http://node01:19888/jobhistory/logs</value>
</property>
</configuration>
保存退出,
(2)分發yarn-site.xml到集群其他節點
執行rsync-script yarn-site.xml命令分發剛修改過的yarn-site.xml檔案到其他節點,如下:
[root@node01 hadoop]$ rsync-script yarn-site.xml
filename=yarn-site.xml
dirname=/opt/software/hadoop-2.9.2/etc/hadoop
--------------target hostname=node01--------------
sending incremental file list
sent 50 bytes received 12 bytes 124.00 bytes/sec
total size is 1,327 speedup is 21.40
--------------target hostname=node02--------------
sending incremental file list
yarn-site.xml
sent 728 bytes received 47 bytes 1,550.00 bytes/sec
total size is 1,327 speedup is 1.71
--------------target hostname=node03--------------
sending incremental file list
yarn-site.xml
sent 728 bytes received 47 bytes 1,550.00 bytes/sec
total size is 1,327 speedup is 1.71
(3)重啟Yarn集群和歷史服務器
開啟日志聚集功能,修改了組態檔,所以需要重新啟動NodeManager 、ResourceManager和HistoryManager才能讓組態檔生效,
node02節點重啟Yarn集群:
[root@node03 ~]$ stop-yarn.sh
stopping yarn daemons
stopping resourcemanager
node01: stopping nodemanager
node03: stopping nodemanager
node02: stopping nodemanager
node01: nodemanager did not stop gracefully after 5 seconds: killing with kill -9
node03: nodemanager did not stop gracefully after 5 seconds: killing with kill -9
node02: nodemanager did not stop gracefully after 5 seconds: killing with kill -9
no proxyserver to stop
[root@node03 ~]$ start-yarn.sh
starting yarn daemons
starting resourcemanager, logging to /opt/software/hadoop-2.9.2/logs/yarn-root-resourcemanager-node03.out
node01: starting nodemanager, logging to /opt/software/hadoop-2.9.2/logs/yarn-root-nodemanager-node01.out
node02: starting nodemanager, logging to /opt/software/hadoop-2.9.2/logs/yarn-root-nodemanager-node02.out
node03: starting nodemanager, logging to /opt/software/hadoop-2.9.2/logs/yarn-root-nodemanager-node03.out
[root@node03 ~]$ jps
82353 NodeManager
83013 Jps
44108 DataNode
82221 ResourceManager
44542 SecondaryNameNode
node01節點重啟歷史服務器:
[root@node01 hadoop]$ mr-jobhistory-daemon.sh stop historyserver
stopping historyserver
[root@node01 hadoop]$ mr-jobhistory-daemon.sh start historyserver
starting historyserver, logging to /opt/software/hadoop-2.9.2/logs/mapred-root-historyserver-node01.out
[root@node01 hadoop]$ jps
37716 NameNode
75813 Jps
37878 DataNode
75355 NodeManager
75611 JobHistoryServer
(4)洗掉HDFS上已經存在的輸出檔案
此時需要重新執行任務,以生成日志進行查看,因為輸出目錄不能存在所以需要先洗掉,執行命令hdfs dfs -rm -R /wcoutput即可,
(5)重新執行wordcount測驗任務
執行hadoop jar /opt/software/hadoop-2.9.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.2.jar wordcount /wcinput /wcoutput命令重新執行詞頻統計任務,
(6)網頁中查看日志資訊
此時就可以在網頁中查看詳細的日志資訊了,可以在http://node03:8088和http://node01:19888查看,如下:

如果出現錯誤,則可以根據日志進行排查,
總結
在當下,資料有著極大的價值,而大資料就是處理海量資料獲取價值的重要手段;Hadoop是大資料中的基礎框架,有著廣泛的應用,也是其他大資料框架的基礎,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297530.html
標籤:其他
上一篇:JSP用戶登錄連接資料庫
下一篇:資料匯出/遷移(Sqoop技術)
