??大家好,我是不溫卜火,昵稱來源于成語—
不溫不火,本意是希望自己性情溫和,作為一名互聯網行業的小白,博主寫博客一方面是為了記錄自己的學習程序,另一方面是總結自己所犯的錯誤希望能夠幫助到很多和自己一樣處于起步階段的萌新,但由于水平有限,博客中難免會有一些錯誤出現,有紕漏之處懇請各位大佬不吝賜教!博客主頁:https://buwenbuhuo.blog.csdn.net/
目錄
- 前言
- 一、Hadoop概述
- 1.1 Hadoop是什么
- 1.2 Hadoop的發展歷程
- 1.3 Hadoop的特點
- 1.4 Hadoop的應用現狀
- 1.5 Hadoop三大發行版本
- 1.6 ApacheHadoop版本變化及組成架構變化
- 1.6 Hadoop的重要組成
- 1.6.1 HDFS(Hadoop Distribute File System )——高可靠、高吞吐量的分布式檔案系統
- 1.6.2 Hadoop MapReduce——一個分布式的離線并行計算框架
- 1.6.3 Hadoop Yarn——作業調度與集群資源管理的框架
- 1.6.4 HDFS、YARN、MapReduce三者之間的關系
- 1.6.5 Hadoop Common——支持其他模塊的工具模塊
- 1.7 大資料技術生態體系
- 1.8 常見大資料專案所使用的技術分類
- 1.9 推薦系統結構圖
- 二、前提準備
- 2.1 虛擬機環境準備
- 2.1.1 下載安裝虛擬機
- 2.1.2 創建Hadoop用戶
- 2.1.3 重置root密碼并配置免密登錄
- 2.1.4 更新apt
- 2.1.5 安裝SSH、配置SSH無密碼登陸
- 2.1.6 安裝WMware Tools
- 2.1.7 安裝Jdk
- 2.1.8 安裝Hadoop
- 2.2 windows主機環境準備
- 2.2.1 修改windows的主機映射檔案(hosts檔案)
- 2.2.2 配置Java環境
- 2.2.3 配置Hadoop環境(如果想在本機操作此程序是必須要做的)
- 2.3 Hadoop結構詳解
- 2.3.1 Hadoop的目錄結構
- 2.3.2 各目錄詳細介紹
- 三、Apache Hadoop 三種搭建方式
- 3.1 Hadoop單機配置(非分布式)
- 3.2 Hadoop偽分布式配置
- 3.3 Hadoop完全分布式搭建
- 3.3.1 快照與克隆
- 3.3.2 前期準備作業
- 3.3.3 配置集群/分布式環境
- 3.3.4 執行分布式實體
- 四、拓展部分
- 4.1 啟動行程
- 4.2 查看集群所有節點jps腳本
- 4.3 集群分發腳本(不要求掌握,了解即可,使用Ubuntu系統需要一些前提配置)
- 4.3.1 scp 安全拷貝
- 4.3.2 rsync遠程同步工具
- 4.3.3 xsync集群分發腳本
前言
此系列主要為我的學弟學妹們所創作,在某些方面可能偏基礎,如果讀者感覺較為簡單,還望見諒!如果文中出現錯誤,歡迎指正~

本文主要介紹了Hadoop簡介及Apache Hadoop完全分布式集群搭建,包括大資料簡介、Hadoop簡介、Hadoop的重要組成和Apache Hadoop 完全分布式集群搭建,
一、Hadoop概述
1.1 Hadoop是什么
🔎Hadoop是Apache軟體基金會旗下的一個開源分布式計算平臺,為用戶提供了系統底層細節透明的分布式基礎架構
🔎Hadoop是基于Java語言開發的,具有很好的跨平臺特性,并且可以部署在廉價的計算機集群中
🔎Hadoop的核心是分布式檔案系統HDFS(Hadoop Distributed File System)和MapReduce
🔎Hadoop被公認為行業大資料標準開源軟體,在分布式環境下提供了海量資料的處理能力,主要解決海量資料的存盤和海量資料的分析計算問題,
🔎幾乎所有主流廠商都圍繞Hadoop提供開發工具、開源軟體、商業化工具和技術服務,如谷歌、雅虎、微軟、思科、淘寶等,都支持Hadoop
🔎狹義上說Hadoop就是一個框架平臺,廣義上講Hadoop代表大資料的一個技術生態圈,包括很多其他軟體框架,如下:

1.2 Hadoop的發展歷程

🔍Hadoop最初是由Apache Lucene專案的創始人Doug Cutting開發的文本搜索庫,Hadoop源自始于2002年的Apache Nutch專案——一個開源的網路搜索引擎并且也是Lucene專案的一部分,Nutch 是一個開源 Java 實作的搜索引擎,它提供了我們運行自己的搜索引擎所需的全部工具,包括全文搜索和Web爬蟲,但隨著抓取網頁數量的增加,遇到了嚴重的可擴展性問題——如何解決數十億網頁的存盤和索引問題,
🔍 在2003年,Nutch專案也模仿GFS開發了自己的分布式檔案系統NDFS(Nutch Distributed File System),也就是HDFS的前身
🔍 2004年,谷歌公司又發表了另一篇具有深遠影響的論文Google MapReduce,闡述了MapReduce分布式編程思想
💡你需要知道的三駕馬車Google的三篇論文(三駕馬車)分別是:
- GFS:Google的分布式檔案系統(Google File System)
- MapReduce:Google的分布式計算框架
- BigTable:大型分布式資料庫
💡發展演變關系::
- GFS —> HDFS
- Google MapReduce —> Hadoop MapReduce
- BigTable —> HBase
🔍2005年,Nutch開源實作了谷歌的MapReduce
🔍到了2006年2月,Nutch中的NDFS和MapReduce開始獨立出來,成為Lucene專案的一個子專案,稱為Hadoop,同時,Doug Cutting加盟雅虎
🔍 2008年1月,Hadoop正式成為Apache頂級專案,Hadoop也逐漸開始被雅虎之外的其他公司使用
🔍2008年4月,Hadoop打破世界紀錄,成為最快排序1TB資料的系統,它采用一個由910個節點構成的集群進行運算,排序時間只用了209秒
🔍在2009年5月,Hadoop更是把1TB資料排序時間縮短到62秒,Hadoop從此名聲大震,迅速發展成為大資料時代最具影響力的開源分布式開發平臺,并成為事實上的大資料處理標準
📢Hadoop名字來源于Hadoop之父Doug Cutting兒子的毛絨玩具象:

1.3 Hadoop的特點
🔉Hadoop是一個能夠對大量資料進行分布式處理的軟體框架,并且是以一種可靠、高效、可伸縮的方式進行處理的,它具有以下幾個方面的特性:

🔍1.高可靠性:Hadoop底層維護多個資料副本,所以即使Hadoop某個計算元素或存盤出現故障,也不會導致資料的丟失

🔍2.高拓展性:在集群間分配任務資料,可方便的擴展數以千計的節點,

🔍3. 高效性:在MapReduce的思想下,Hadoop是并行作業的,以加快任務處理速度,

🔍4.高容錯性:能夠自動將失敗的任務重新分配,

🔍5.低成本:Hadoop通過普通廉價的機器組成服務器集群來分發以及處理資料,以至于成本很低
1.4 Hadoop的應用現狀
🔉Hadoop在企業中的應用架構

1.5 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/
????
????web管理界面軟體HDF網址:http://ambari.apache.org/
????
????Hortonworks主要是雅虎主導Hadoop開發的副總裁,帶領二十幾個核心成員成立Hortonworks,核心產品軟體HDP(ambari),HDF免費開源,并且提供一整套的web管理界面,供我們可以通過web界面管理我們的集群狀態,因為HortonWorks已經被Cloudera收購,所以HDP的使用也可能會逐漸減少,商用以CDH為主,
1.6 ApacheHadoop版本變化及組成架構變化
Apache Hadoop版本分為兩代,我們將第一代Hadoop稱為Hadoop 1.0,第二代Hadoop稱為Hadoop 2.0
第一代Hadoop包含三個大版本,分別是0.20.x,0.21.x和0.22.x,其中,0.20.x最后演化成1.0.x,變成了穩定版,而0.21.x和0.22.x則增加了NameNode HA等新的重大特性
第二代Hadoop包含兩個版本,分別是0.23.x和2.x,它們完全不同于Hadoop 1.0,是一套全新的架構,均包含HDFS Federation和YARN兩個系統,相比于0.23.x,2.x增加了NameNode HA和Wire-compatibility兩個重大特性
Hadoop 2.0是基于JDK 1.7開發的,而JDK 1.7在2015年4月已停止更新,于是Hadoop社區基于JDK1.8重新發布一個新的Hadoop版本,也就是Hadoop3.0
🔍下圖為Hadoop1.x與Hadoop2.x的組成:

🔎在Hadoop1.x時代,Hadoop中的MapReduce同時處理業務邏輯運算和資源的調度,耦合性較大,
🔎在Hadoop2.x時代,增加了Yarn,Yarn只負責資源的調度,MapReduce只負責運算,
🔎Hadoop3.x在組成上沒有變化,
1.6 Hadoop的重要組成
狹義的Hadoop由四部分組成:
- HDFS(分布式檔案系統)
- MapReduce(分布式計算框架)
- Yarn(資源協調框架)
- Common模塊
1.6.1 HDFS(Hadoop Distribute File System )——高可靠、高吞吐量的分布式檔案系統
HDFS的思想是分而治之,主要功能如下:
-
資料切割
????將海量資料進行拆分,以保證可以在單臺機器上進行保存,
????例如100T資料拆分為10G一個資料塊由一個電腦節點存盤這個資料塊, -
制作副本
????由于電腦可能出現宕機的情況,所以需要制作副本,讓另外的電腦也保存相同的資料, -
分散儲存
????將資料切割后,分散存盤在不同的機器上,同時在另外的機器上有相同資料的副本,
如下圖所示:

HDFS屬于Master/Slave(主從架構):
NameNode(nn):
屬于Master節點,主要負責管理和維護元資料:存盤檔案的元資料,元資料記錄了檔案名、檔案目錄結構、檔案屬性(生成時間、副本數、檔案權限),以及每個檔案的塊串列和塊所在的DataNode節點資訊等,
????
SecondaryNameNode(2nn)
輔助NameNode管理和維護元資料,用來監控HDFS狀態的輔助后臺程式,每隔一段時間獲取HDFS元資料快照,對NameNode元資料備份,
DataNode(dn)
屬于Slave節點,負責存盤檔案資料塊:在本地檔案系統存盤檔案塊資料,以及塊資料的校驗
????
其中,NN、2NN、DN既是角色名稱、行程名稱,也代指電腦節點名稱,
HDFS寫入檔案程序:
對于大資料進行拆分(切割)得到資料塊,可能得到多個資料塊,由多個DataNode進行存盤,具體流程如下圖所示:

HDFS讀取檔案程序:
向NameNode請求獲取到之前存入檔案的塊以及塊所在的DataNode的資訊,分別下載并最終合并,就得到之前的檔案,具體流程如下圖所示:

1.6.2 Hadoop MapReduce——一個分布式的離線并行計算框架
MapReduce的思想也是分而治之,主要功能如下:
- 拆解任務
將資料進行切分,得到切片, - 分散處理
- 匯整結果
如下圖所示:

MapReduce將計算程序分為兩個階段:Map和Reduce
-
Map階段就是“分”的階段
將資料切分到多個節點后,多個節點并行處理 輸入資料,即每個節點負責一份資料的計算,并得到部分結果, -
Reduce階段就是“合”的階段
對Map階段的輸出結果進行匯總,得到全域的結果,
1.6.3 Hadoop Yarn——作業調度與集群資源管理的框架
Yarn負責集群中計算資源的分配和作業任務的調度:

Yarn架構也是主從架構主要角色如下:
-
ResourceManager(rm)
是Master,處理客戶端請求、啟動/監控ApplicationMaster、監控NodeManager、資源分配與調度, -
NodeManager(nm)
是Slave,單個節點上的資源管理、處理來自ResourceManager的命令、處理來自ApplicationMaster的命令, -
ApplicationMaster(am)
是計算任務專員,資料切分、為應用程式(任務)申請資源,并分配給內部任務、任務監控與容錯, -
Container
對任務運行環境的抽象,一個Container負責一個Task,封裝了CPU、記憶體等多維資源以及環境變數、啟動命令等任務運行相關的資訊,可以理解為虛擬資源集合或小型計算機,
1.6.4 HDFS、YARN、MapReduce三者之間的關系

1.6.5 Hadoop Common——支持其他模塊的工具模塊
包括以下幾部分:
- Configuration
公共的配置,包括集群節點、節點資源、IP、主機名、引數等配置項 - RPC
遠程程序呼叫,是分布式框架中多個節點之間進行網路通訊的首選方式,高效、穩定、安全,Hadoop中實作了Hadoop RPC框架, - 序列化機制
- 日志操作
1.7 大資料技術生態體系

圖中所設計的技術名詞解釋如下:
| 大資料技術生態體系 |
|---|
| Hadoop(HDFS + MapReduce + Yarn) |
| Hive 資料倉庫 |
| HBase Hadoop上的非關系型的分布式資料庫 |
| Sqoop 一款開源的工具,主要用于在Hadoop、Hive與傳統的資料庫(MySQL)間進行資料的傳遞,可以將一個關系型資料庫(例如 :MySQL,Oracle 等)中的資料導進到Hadoop的HDFS中,也可以將HDFS的資料導進到關系型資料庫中, |
| Sqoop 用于在Hadoop與傳統資料庫之間進行資料傳遞 |
| Oozie Hadoop上的作業流管理系統 |
| Zookeeper 提供分布式協調一致性服務 |
| Kafka 一種高吞吐量的分布式發布訂閱訊息系統,可以處理消費者規模的網站中的所有動作流資料 |
| Ambari Hadoop快速部署工具,支持Apache Hadoop集群的供應、管理和監控 |
| Flink 當前最流行的開源大資料記憶體計算框架,用于實時計算的場景較多, |
| … … |
1.8 常見大資料專案所使用的技術分類
根據專案可以劃分為實時流和離線流,如下圖所示:

1.9 推薦系統結構圖
下圖為傳統的推薦系統的架構:

二、前提準備
2.1 虛擬機環境準備
2.1.1 下載安裝虛擬機
由于本校使用Ubuntu作為作業系統,因此本系列教程采用Ubuntu 16.04 64位作為系統環境(或者Ubuntu 14.04,Ubuntu18.04 也行,32位、64位均可),
在此給出系統鏡像下載地址(Kylin 此處不推薦):
Ubuntu 歷史版本下載
Ubuntu Kylin 下載地址
如何下載,以下載Ubuntu歷史版本為例:
🔎1.打開網址

🔎2.選擇想要下載的歷史版本,在此以Ubuntu 16.04.1 LTS (Xenial Xerus)為例

🔎3. 選擇鏡像進行下載

下載完成后,下面就是安裝了,但是由于此部分主要講解環境搭建,所以安裝這一程序在此省略,下面直接從裝好Ubuntu系統開始講解,
2.1.2 創建Hadoop用戶
如果你安裝 Ubuntu 的時候不是用的 “hadoop” 用戶,那么需要增加一個名為 hadoop 的用戶,
首先按 ctrl+alt+t 打開終端視窗,輸入如下命令創建新用戶 :
# 創建可以登陸的 hadoop 用戶,并使用 /bin/bash 作為 shell
buwenbuhuo@ubuntu:/opt/moudle$ sudo useradd -m hadoop -s /bin/bash
📣你需要知道的一些知識:
🔎sudo命令
本文中會大量使用到sudo命令,sudo是ubuntu中一種權限管理機制,管理員可以授權給一些普通用戶去執行一些需要root權限執行的操作,當使用sudo命令時,就需要輸入您當前用戶的密碼.
🔎密碼
在Linux的終端中輸入密碼,終端是不會顯示任何你當前輸入的密碼,也不會提示你已經輸入了多少字符密碼,而在windows系統中,輸入密碼一般都會以“*”表示你輸入的密碼字符
🔎Ubuntu終端復制粘貼快捷鍵
在Ubuntu終端視窗中,復制粘貼的快捷鍵需要加上 shift,即粘貼是 ctrl+shift+v,
# 使用如下命令設定密碼,可簡單設定為 hadoop,按提示輸入兩次密碼
buwenbuhuo@ubuntu:/opt/moudle$ sudo passwd hadoop
# 如下命令可為hadoop 用戶增加管理員權限,方便部署,避免一些對新手來說比較棘手的權限問題
buwenbuhuo@ubuntu:/opt/moudle$ sudo adduser hadoop sudo
最后注銷當前用戶(點擊螢屏右上角的齒輪,選擇注銷),回傳登陸界面,在登陸界面中選擇剛創建的 hadoop 用戶進行登陸,
2.1.3 重置root密碼并配置免密登錄
Ubuntu安裝完成后,一般默認密碼你是不知道的,這個時候我們可以通過重置root密碼進行解決,
🔍1. 修改密碼
hadoop@ubuntu:~$ sudo passwd root # 重置root密碼
輸入新的 UNIX 密碼: # 一般密碼都不顯示,直接輸入回車即可
重新輸入新的 UNIX 密碼:
passwd: password updated successfully # 提示你修改成功
🔍2. 切換成root賬戶
hadoop@ubuntu:~$ su root # 切換到root賬戶
密碼: # 輸入密碼,一會進行配置免密登錄就可不用再次輸入
root@ubuntu:/home/hadoop# # 成功切換到root賬戶
🔍3. 修改/etc/sudoers組態檔
root@ubuntu:/home/hadoop# vim /etc/sudoers
...
# User privilege specification
root ALL=(ALL:ALL) ALL
hadoop ALL=(ALL) NOPASSWD:ALL # 此處為要修改部分,hadoop為你自己的賬戶名
...
🔍4. 測驗免密

2.1.4 更新apt
用 hadoop 用戶登錄后,我們先更新一下 apt,后續我們使用 apt 安裝軟體,如果沒更新可能有一些軟體安裝不了,按 ctrl+alt+t 打開終端視窗,執行如下命令:
hadoop@ubuntu:~$ sudo apt-get update

若出現如下 “Hash校驗和不符” 的提示,可通過更改軟體源來解決,若沒有該問題,則不需要更改,從軟體源下載某些軟體的程序中,可能由于網路方面的原因出現沒法下載的情況,那么建議更改軟體源,在學習Hadoop程序中,即使出現“Hash校驗和不符”的提示,也不會影響Hadoop的安裝,
關于如何更改軟體源,林子雨老師的博客已經給出答案,如有興趣可自行查看,
后續需要更改一些組態檔,我比較喜歡用的是 vim(vi增強版,基本用法相同),建議安裝一下(如果你實在還不會用 vi/vim 的,請將后面用到 vim 的地方改為 gedit,這樣可以使用文本編輯器進行修改,并且每次檔案更改完成后請關閉整個 gedit 程式,否則會占用終端):
hadoop@ubuntu:~$ sudo apt-get install vim
安裝軟體時若需要確認,在提示處輸入 y 即可,

2.1.5 安裝SSH、配置SSH無密碼登陸
🌟在進行免密登錄配置之前,我們需要先了解免密登錄的原理,如下圖所示:

集群、單節點模式都需要用到 SSH 登陸(類似于遠程登陸,你可以登錄某臺 Linux 主機,并且在上面運行命令),Ubuntu 默認已安裝了 SSH client,此外還需要安裝 SSH server:
hadoop@ubuntu:~$ sudo apt-get install openssh-server

安裝后,可以使用如下命令登陸本機:
hadoop@ubuntu:~$ ssh localhost
此時會有如下提示(SSH首次登陸提示),輸入 yes ,然后按提示輸入密碼 hadoop,這樣就登陸到本機了,

但這樣登陸是需要每次輸入密碼的,我們需要配置成SSH無密碼登陸比較方便,
首先退出剛才的 ssh,就回到了我們原先的終端視窗,然后利用 ssh-keygen 生成密鑰,并將密鑰加入到授權中:
hadoop@ubuntu:~$ exit # 退出剛才的 ssh localhost
hadoop@ubuntu:~$ cd ~/.ssh/ # 若沒有該目錄,請先執行一次ssh localhost
hadoop@ubuntu:~$ ssh-keygen -t rsa # 會有提示,都按回車就可以,三個回車
hadoop@ubuntu:~$ cat ./id_rsa.pub >> ./authorized_keys # 加入授權
🌟.ssh檔案夾下~/.ssh的檔案功能解釋

| 名稱 | 含義 |
|---|---|
| authorized_keys | 存放授權過的無密登錄服務器公鑰 |
| id_rsa | 生成的私鑰 |
| id_rsa.pub | 生成的公鑰 |
| known_hosts | 記錄ssh訪問過計算機的公鑰(public key) |
📣~的含義
在 Linux 系統中,~ 代表的是用戶的主檔案夾,即 “/home/用戶名” 這個目錄,如你的用戶名為 hadoop,則 ~ 就代表 “/home/hadoop/”, 此外,命令中的 # 后面的文字是注釋,只需要輸入前面命令即可,
此時再用 ssh localhost 命令,無需輸入密碼就可以直接登陸了,如下圖所示,

2.1.6 安裝WMware Tools
VMware Tools是一套可以提高虛擬機客戶機作業系統性能并改善虛擬機管理的實用工具,如果你還對安裝WMware Tools有什么疑惑,我們不妨看下它的功能,其功能如下:
🔍1、支持Aero的作業系統上大大提升的圖形性能和WindowsAero體驗
🔍2、使虛擬機中的應用程式像其他任何應用程式視窗一樣顯示在主機桌面上的Unity功能
🔍3、主機與客戶機檔案系統之間的共享檔案夾
🔍4、在虛擬機與主機或客戶端桌面之間復制并粘貼文本、圖形和檔案,效果如下圖所示:

🔍5、改進的滑鼠性能
🔍6、虛擬機中的時鐘與主機或客戶端桌面上的時鐘同步
🔍7、幫助自動執行客戶機作業系統操作的腳本
🔍8、啟用虛擬機的客戶機自定義,
安裝VMware Tools可以大大提升圖形化性能,對于初學者而言很有必要,當然,此部分并非必要,因為還可以使用第三方連接工具如Xshell等進行連接,
下面講解下如何安裝
🔎1. 虛擬機—> 重新安裝WMware Tools—>復制到自己想存放的位置

🔎1.解壓縮WMware Tools
root@ubuntu:~# cd /opt/software/ # 進入到WMware Tools存放目錄
root@ubuntu:/opt/software# ll # 查看當前檔案夾記憶體在的內容
drwxrwxrwx 2 root root 4096 9月 22 19:11 ./
drwxr-xr-x 4 root root 4096 9月 15 19:51 ../
-rw-rw-r-- 1 hadoop hadoop 56435756 2月 20 2019 VMwareTools-10.3.10-12406962.tar.gz
root@ubuntu:/opt/software# tar -zxvf VMwareTools-10.3.10-12406962.tar.gz -C /opt/moudle/ # 解壓縮檔案
🔎2.安裝WMware Tools
root@ubuntu:/opt/software# cd /opt/moudle/ # 進入到解壓縮目錄
root@ubuntu:/opt/moudle# ll
總用量 20
drwxr-xr-x 5 root root 4096 9月 22 19:34 ./
drwxr-xr-x 4 root root 4096 9月 15 19:51 ../
drwxr-xr-x 9 root root 4096 2月 20 2019 vmware-tools-distrib/
root@ubuntu:/opt/moudle# cd vmware-tools-distrib/
root@ubuntu:/opt/moudle/vmware-tools-distrib# ll
總用量 408
drwxr-xr-x 9 root root 4096 2月 20 2019 ./
drwxr-xr-x 5 root root 4096 9月 22 19:34 ../
drwxr-xr-x 2 root root 4096 2月 20 2019 bin/
drwxr-xr-x 5 root root 4096 2月 20 2019 caf/
drwxr-xr-x 2 root root 4096 2月 20 2019 doc/
drwxr-xr-x 5 root root 4096 2月 20 2019 etc/
-rw-r--r-- 1 root root 146996 2月 20 2019 FILES
-rw-r--r-- 1 root root 2538 2月 20 2019 INSTALL
drwxr-xr-x 2 root root 4096 2月 20 2019 installer/
drwxr-xr-x 14 root root 4096 2月 20 2019 lib/
drwxr-xr-x 3 root root 4096 2月 20 2019 vgauth/
-rwxr-xr-x 1 root root 227024 2月 20 2019 vmware-install.pl* # 此處為安裝檔案
oot@ubuntu:/opt/moudle/vmware-tools-distrib# ./vmware-install.pl # 進行安裝 安裝程序中出現yes/no 全部默認回車即可,安裝完成后重啟生效,
root@ubuntu:/opt/moudle/vmware-tools-distrib# reboot # 執行重啟命令
2.1.7 安裝Jdk
一般主流都不會選擇最新版本,為求穩定大都會選擇Jdk8,此處選擇jdk-8u162-linux-x64作為Jdk,
官方鏈接(需注冊oracle賬戶):Jdk 歷史版本下載
學長在此給出自己使用的JDK:https://pan.baidu.com/s/1c1V66MGf5gwZ2ZhW6RP6vw 提取碼:4e8f
🔎1. Jdk解壓
hadoop@ubuntu:/opt/software$ ll
總用量 1849704
drwxrwxrwx 2 root root 4096 9月 22 19:11 ./
drwxr-xr-x 4 root root 4096 9月 15 19:51 ../
-rw-rw-r-- 1 hadoop hadoop 189815615 9月 15 19:49 jdk-8u162-linux-x64.tar.gz
-rw-rw-r-- 1 hadoop hadoop 56435756 2月 20 2019 VMwareTools-10.3.10-12406962.tar.gz
hadoop@ubuntu:/opt/software$ sudo tar -zxvf jdk-8u162-linux-x64.tar.gz -C /opt/moudle/ #把JDK檔案解壓到/opt/moudle目錄下
hadoop@ubuntu:/opt/software$ cd /opt/moudle/
hadoop@ubuntu:/opt/moudle/$ ll
總用量 20
drwxr-xr-x 5 root root 4096 9月 22 20:05 ./
drwxr-xr-x 24 root root 4096 9月 15 18:18 ../
drwxr-xr-x 8 uucp 143 4096 12月 20 2017 jdk1.8.0_162/ # 我們可以看到已經解壓成功
hadoop@ubuntu:/opt/moudle/ $ sudo mv jdk1.8.0_162/ jdk1.8 # 通常習慣吧版本號簡化些,這樣方便以后組態檔
hadoop@ubuntu:/opt/moudle/ $ ll
總用量 20
drwxr-xr-x 5 root root 4096 9月 22 20:07 ./
drwxr-xr-x 24 root root 4096 9月 15 18:18 ../
drwxr-xr-x 8 uucp 143 4096 12月 20 2017 jdk1.8/

🔎2. 設定環境變數
hadoop@ubuntu:/opt/moudle$ sudo vim ~/.bashrc
# 下面為要添加的部分
# Java_HOME
export JAVA_HOME=/opt/moudle/jdk1.8 # 自己解壓目錄位置
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
# 繼續執行如下命令讓.bashrc檔案的配置立即生效
hadoop@ubuntu:/opt/moudle$ source ~/.bashrc
🔎3. 查看是否安裝成功
hadoop@ubuntu:/opt/moudle$ java -version
如果能夠在螢屏上回傳如下資訊,則說明安裝成功:

至此,就成功安裝了Java環境,下面就可以進入Hadoop的安裝,
2.1.8 安裝Hadoop
🔎 1.Hadoop下載
我們可以到Hadoop官網下載hadoop-3.1.3.tar.gz

也可以在https://archive.apache.org/dist/hadoop/common/中選擇合適的版本進行下載,這里選擇3.1.3版本,
🔎 2.Hadoop上傳
可以先點擊https://archive.apache.org/dist/hadoop/common/hadoop-3.1.3/hadoop-3.1.3.tar.gz下載到本地,再使用上傳到虛擬機的/opt/software目錄下,也可以直接在虛擬機的/opt/software目錄下執行wget https://archive.apache.org/dist/hadoop/common/hadoop-3.1.3/hadoop-3.1.3.tar.gz進行下載,可以根據需要選擇,
🔎 3. 使用參考
在使用時,可以參考Hadoop官方檔案:https://hadoop.apache.org/docs/r3.1.3/
🔎 4. 解壓檔案
我們選擇將 Hadoop 安裝至 /opt/moudle/ 中:
hadoop@ubuntu:/opt/software$ sudo tar -zxvf hadoop-3.1.3.tar.gz -C /opt/moudle/ # 解壓到/opt/moudle中
hadoop@ubuntu:/opt/software$ cd /opt/moudle/
hadoop@ubuntu:/opt/moudle$ sudo mv hadoop-3.1.1 hadoop # 將檔案夾名改為hadoop
hadoop@ubuntu:/opt/moudle$ sudo chown -R hadoop:hadoop hadoop # 修改檔案權限

🔎 5. 查看版本資訊
Hadoop 解壓后即可使用,輸入如下命令來檢查 Hadoop 是否可用,成功則會顯示 Hadoop 版本資訊:
hadoop@ubuntu:/opt/moudle/hadoop$ ./bin/hadoop version

📢相對路徑與絕對路徑
請務必注意命令中的相對路徑與絕對路徑,后續出現的 ./bin/...,./etc/... 等包含 ./ 的路徑,均為相對路徑,以 /opt/moudle/hadoop 為當前目錄,例如在/opt/moudle/hadoop 目錄中執行 ./bin/hadoop version 等同于執行 /opt/moudle/hadoop/bin/hadoop version,可以將相對路徑改成絕對路徑來執行,但如果你是在主檔案夾 ~ 中執行 ./bin/hadoop version,執行的會是 /home/hadoop/bin/hadoop version,就不是我們所想要的了,
🔎 6. 配置Hadoop的PATH變數
hadoop@ubuntu:/opt/moudle/hadoop$ vim ~/.bashrc
# 要添加的部分
export PATH=$PATH:/opt/moudle/hadoop/bin:/opt/moudle/hadoop/sbin
hadoop@ubuntu:/opt/moudle/hadoop$ source ~/.bashrc # 使立即生效
配置以后就可以在任意目錄中直接使用hadoop、hdfs等命令了,
2.2 windows主機環境準備
2.2.1 修改windows的主機映射檔案(hosts檔案)
🔎1.進入C:\Windows\System32\drivers\etc路徑

🔎2.打開hosts檔案并添加如下內容,然后保存
192.168.2.5 hadoop
192.168.2.6 master
192.168.2.7 slave1
192.168.2.8 slave2
192.168.2.9 slave3
2.2.2 配置Java環境
一般主流都不會選擇最新版本,為求穩定大都會選擇Jdk8,
學長在此給出自己使用的JDK:https://pan.baidu.com/s/1c1V66MGf5gwZ2ZhW6RP6vw 提取碼:4e8f
🔎1. Jdk解壓(隨意解壓到任意目錄)

🔎2. 新建JAVA_HOME 變數
變數名:JAVA_HOME
變數值:電腦上JDK安裝的絕對路徑

JDK 路徑下必須能夠看到如下的檔案,

🔎3.新建/修改 CLASSPATH 變數
如果存在 CLASSPATH 變數,選中點擊 Edit(編輯),
如果沒有,點擊 New(新建)… 新建,
輸入/在已有的變數值后面添加:
變數名:CLASSPATH
變數值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
點擊 OK 保存.

🔎4.修改Path 變數
由于 win10 的不同,當選中 Path 變數的時候,系統會很方便的把所有不同路徑都分開了,不會像 win7 或者 win8 那樣連在一起,

新建兩條路徑:
%JAVA_HOME%\bin
%JAVA_HOME%\jre\bin

🔎5.查看是否配置成功
打開 cmd,輸入 java,出現一連串的指令提示,說明配置成功了:

2.2.3 配置Hadoop環境(如果想在本機操作此程序是必須要做的)
Windows版本的Hadoop需要進行重新編譯才可以使用,在此為了方便就直接給出編譯完成的版本,鏈接:
鏈接:https://pan.baidu.com/s/1lLQCza1Hc4hK1Hqv9sAOgw 提取碼:l76k
🔎1.Hadoop解壓(隨意解壓到任意目錄)

🔎2.配置HADOOP_HOME

🔎3.配置Path

🔎4.檢查版本號

🔎5.啟動測驗
D:\hadoop-3.1.3\sbin>start-dfs.cmd
D:\hadoop-3.1.3\sbin>start-yarn.cmd
如果出現以下四個界面說明成功:

也可以查看UI界面,
http://localhost:9870
http://localhost:8088

🔎6.關閉hadoop
D:\hadoop-3.1.3\sbin>stop-all.cmd

2.3 Hadoop結構詳解
2.3.1 Hadoop的目錄結構
🔎1.查看Hadoop目錄結構
hadoop@Master:/opt/moudle/hadoop$ ll
drwxr-xr-x 2 hadoop hadoop 4096 9月 12 2019 bin/
drwxr-xr-x 3 hadoop hadoop 4096 9月 12 2019 etc/
drwxr-xr-x 2 hadoop hadoop 4096 9月 12 2019 include/
drwxr-xr-x 3 hadoop hadoop 4096 9月 12 2019 lib/
drwxr-xr-x 4 hadoop hadoop 4096 9月 12 2019 libexec/
-rw-rw-r-- 1 hadoop hadoop 147145 9月 4 2019 LICENSE.txt
-rw-rw-r-- 1 hadoop hadoop 21867 9月 4 2019 NOTICE.txt
-rw-rw-r-- 1 hadoop hadoop 1366 9月 4 2019 README.txt
drwxr-xr-x 3 hadoop hadoop 4096 9月 12 2019 sbin/
drwxr-xr-x 4 hadoop hadoop 4096 9月 12 2019 share/
如果查看目錄出現屬主和陣列不一致的情況,在之后的操作中,可能會出現資訊混亂,如下列情況:
hadoop@Master:/opt/moudle/hadoop$ ll
drwxr-xr-x 2 hadoop hadoop 4096 9月 12 2019 bin/
drwxr-xr-x 3 hadoop hadoop 4096 9月 12 2019 etc/
drwxr-xr-x 2 root root 4096 9月 12 2019 include/
drwxr-xr-x 3 hadoop hadoop 4096 9月 12 2019 lib/
drwxr-xr-x 4 hadoop hadoop 4096 9月 12 2019 libexec/
-rw-rw-r-- 1 root hadoop 147145 9月 4 2019 LICENSE.txt
-rw-rw-r-- 1 hadoop hadoop 21867 9月 4 2019 NOTICE.txt
-rw-rw-r-- 1 hadoop hadoop 1366 9月 4 2019 README.txt
drwxr-xr-x 3 hadoop root 4096 9月 12 2019 sbin/
drwxr-xr-x 4 hadoop hadoop 4096 9月 12 2019 share/
這個時候我們可以執行命令chown -R hadoop:hadoop /opt/moudle/hadoop,執行后再查看,如下圖所示,

🔎2.重要目錄
- 1.bin目錄:存放對Hadoop相關服務(hdfs,yarn,mapred)進行操作的腳本
- 2.etc目錄:Hadoop的組態檔目錄,存放Hadoop的組態檔
- 3.lib目錄:存放Hadoop的本地庫(對資料進行壓縮解壓縮功能)
- 4.sbin目錄:存放啟動或停止Hadoop相關服務的腳本
- 5.share目錄:存放Hadoop的依賴jar包、檔案、和官方案例
- …
2.3.2 各目錄詳細介紹
🔎1.bin目錄:存放對Hadoop相關服務(hdfs,yarn,mapred)進行操作的腳本,如圖所示:
hadoop@Master:/opt/moudle/hadoop/bin$ ll
├── 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命令,
🔎2.etc目錄:Hadoop的組態檔目錄,如hdfs-site.xml、core-site.xml等檔案的存放目錄,
hadoop@Master:/opt/moudle/hadoop/etc/hadoop$ ll
├── capacity-scheduler.xml
├── core-site.xml
├── hdfs-site.xml
├── mapred-site.xml
├── yarn-site.xml
├── ......
🔎3.lib目錄:存放Hadoop的本地庫(對資料進行壓縮解壓縮功能)
hadoop@Master:/opt/moudle/hadoop/lib/native$ ll
├── libhadoop.so -> libhadoop.so.1.0.0*
├── libhdfs.so -> libhdfs.so.0.0.0*
├── libnativetask.so -> libnativetask.so.1.0.0*
├── libhdfs.a
├── libnativetask.so.1.0.0*
├── ......
🔎4.sbin目錄:存放啟動或停止Hadoop相關服務的腳本
hadoop@Master:/opt/moudle/hadoop/sbin$ ll
├── 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
├── ......
包含了sh和cmd檔案,
🔎5.share目錄:存放Hadoop的依賴jar包、檔案、和官方案例,在此僅以mapreduce為展示物件
hadoop@Master:/opt/moudle/hadoop/share/hadoop/mapreduce$ ll
├── hadoop-mapreduce-client-app-3.1.3.jar
├── hadoop-mapreduce-client-common-3.1.3.jar
├── hadoop-mapreduce-client-core-3.1.3.jar
├── hadoop-mapreduce-client-hs-3.1.3.jar
├── hadoop-mapreduce-client-hs-plugins-3.1.3.jar
├── ......
如果想查看這些jar包的原始碼,需要對其進行反編譯,
三、Apache Hadoop 三種搭建方式
Hadoop搭建的方式包括3種:
-
單機模式
單節點、不是集群,生產不會使用這種模式, -
單機偽分布式模式
單節點、多執行緒模擬集群的效果,因為發揮的也只是一臺電腦的性能,因此生產中不會使用, -
完全分布式模式
多臺節點,真正的分布式Hadoop集群的搭建,生產環境建議使用這種方式,
下面學長主要針對這三種搭建方式分別闡述具體安裝程序,
3.1 Hadoop單機配置(非分布式)
Hadoop 默認模式為非分布式模式(本地模式),無需進行其他配置即可運行,非分布式即單 Java 行程,方便進行除錯,
現在我們可以執行例子來感受下 Hadoop 的運行,Hadoop 附帶了豐富的例子(運行 ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar 可以看到所有例子),包括 wordcount、terasort、join、grep 等,
在此我們選擇運行 wordcount 例子,我們將 input 檔案夾中的所有檔案作為輸入,最后輸出結果到 output 檔案夾中,
hadoop@ubuntu:~$ cd /opt/moudle/hadoop/
hadoop@ubuntu:/opt/moudle/hadoop$ mkdir input
hadoop@ubuntu:/opt/moudle/hadoop$ vim jayce.txt
# 自己隨機輸入的內容
jayce jayce
jayce yasuo
jayce hadoop
jayce
hadoop@ubuntu:/opt/moudle/hadoop$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount input output
執行成功后如下所示,輸出了作業的相關資訊,如果輸出的結果正確,則輸出的結果hadoop出現1次,jayce出現5次,yasuo出現1次

hadoop@ubuntu:/opt/moudle/hadoop$ cat output/*
hadoop 1
jayce 5
yasuo 1
📢注意,Hadoop 默認不會覆寫結果檔案,因此再次運行上面實體會提示出錯,需要先將 output 洗掉,
hadoop@ubuntu:/opt/moudle/hadoop$rm -rf output
3.2 Hadoop偽分布式配置
Hadoop 可以在單節點上以偽分布式的方式運行,Hadoop 行程以分離的 Java 行程來運行,節點既作為 NameNode 也作為 DataNode,同時,讀取的是 HDFS 中的檔案,
Hadoop 的組態檔位于/opt/moudle/hadoop/etc/hadoop/ 中,偽分布式需要修改2個組態檔 core-site.xml 和 hdfs-site.xml ,Hadoop的組態檔是 xml 格式,每個配置以宣告 property 的 name 和 value 的方式來實作,
🔎1. 修改組態檔 core-site.xml
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/opt/moudle/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
🔎2. 修改組態檔 hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/opt/moudle/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/opt/moudle/hadoop/tmp/dfs/data</value>
</property>
</configuration>
📢Hadoop組態檔說明
Hadoop 的運行方式是由組態檔決定的(運行 Hadoop 時會讀取組態檔),因此如果需要從偽分布式模式切換回非分布式模式,需要洗掉 core-site.xml 中的配置項,
此外,偽分布式雖然只需要配置 fs.defaultFS 和 dfs.replication 就可以運行(官方教程如此),不過若沒有配置 hadoop.tmp.dir 引數,則默認使用的臨時目錄為 /tmp/hadoo-hadoop,而這個目錄在重啟時有可能被系統清理掉,導致必須重新執行 format 才行,所以我們進行了設定,同時也指定 dfs.namenode.name.dir 和 dfs.datanode.data.dir,否則在接下來的步驟中可能會出錯,
🔎3. 執行 NameNode 的格式化
hadoop@ubuntu:~$ cd /opt/moudle/hadoop/
hadoop@ubuntu:/opt/moudle/hadoop$ hdfs namenode -format # 格式化
成功的話,會看到 “successfully formatted” 的提示,具體回傳資訊類似如下:

🔎4. 啟動HDFS
hadoop@ubuntu:/opt/moudle/hadoop$ start-dfs.sh
啟動完成后,可以通過命令 jps 來判斷是否成功啟動,若成功啟動則會列出如下行程: “NameNode”、”DataNode” 和 “SecondaryNameNode”(如果 SecondaryNameNode 沒有啟動,請運行 sbin/stop-dfs.sh 關閉行程,然后再次嘗試啟動嘗試),如果沒有 NameNode 或 DataNode ,那就是配置不成功,請仔細檢查之前步驟,或通過查看啟動日志排查原因,

啟動成功后可以打開UI界面進行查看
http://localhost:9870/如果出現以下畫面,代表成功啟動,

🔎5. 運行Hadoop偽分布式實體
上面的單機模式,grep 例子讀取的是本地資料,偽分布式讀取的則是 HDFS 上的資料,要使用 HDFS,首先需要在 HDFS 中創建用戶目錄:
hadoop@ubuntu:/opt/moudle/hadoop$ hdfs dfs -mkdir -p /user/hadoop

📢注意有三種shell命令方式,
- hadoop fs
- hadoop dfs
- hdfs dfs
hadoop fs適用于任何不同的檔案系統,比如本地檔案系統和HDFS檔案系統
hadoop dfs只能適用于HDFS檔案系統
hdfs dfs跟hadoop dfs的命令作用一樣,也只能適用于HDFS檔案系統
接著將 ./etc/hadoop 中的 xml 檔案作為輸入檔案復制到分布式檔案系統中,即將 /opt/moudle/hadoop/etc/hadoop 復制到分布式檔案系統中的 /user/hadoop/input 中,我們使用的是 hadoop 用戶,并且已創建相應的用戶目錄 /user/hadoop ,因此在命令中就可以使用相對路徑如 input,其對應的絕對路徑就是 /user/hadoop/input:
hadoop@ubuntu:/opt/moudle/hadoop$ hdfs dfs -mkdir input
hadoop@ubuntu:/opt/moudle/hadoop$ hdfs dfs -put input/jayce.txt input # 檔案上傳到user/hadoop/input
出現下圖的結果,一般為成功,

上傳完成后,我們可以通過以下兩種方式方式進行查看:
1??在終端進行查看
# 在終端進行查看
hadoop@ubuntu:/opt/moudle/hadoop$ hdfs dfs -ls input

2?? 在ui界面查看

偽分布式運行 MapReduce 作業的方式跟單機模式相同,區別在于偽分布式讀取的是HDFS中的檔案(可以將單機步驟中創建的本地 input 檔案夾,輸出結果 output 檔案夾都刪掉來驗證這一點),
hadoop@ubuntu:/opt/moudle/hadoop$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount input output
查看運行結果的命令(查看的是位于 HDFS 中的輸出結果):
hadoop@ubuntu:/opt/moudle/hadoop$ hdfs dfs -cat output/*
結果如下,注意到剛才我們已經更改了組態檔,所以運行結果不同,

我們也可以將運行結果取回到本地:
hadoop@ubuntu:/opt/moudle/hadoop$ rm -rf output # 先洗掉本地的 output 檔案夾(如果存在)
hadoop@ubuntu:/opt/moudle/hadoop$ hdfs dfs -get output output # 將 HDFS 上的 output 檔案夾拷貝到本機
2021-09-22 22:29:34,712 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
hadoop@ubuntu:/opt/moudle/hadoop$ cat output/*
hadoop 1
jayce 5
yasuo 1
Hadoop 運行程式時,輸出目錄不能存在,否則會提示錯誤 “org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists” ,因此若要再次執行,需要執行如下命令洗掉 output 檔案夾:
hadoop@ubuntu:/opt/moudle/hadoop$ hdfs dfs -rm -r output # 洗掉 output 檔案夾
📢運行程式時,輸出目錄不能存在
運行 Hadoop 程式時,為了防止覆寫結果,程式指定的輸出目錄(如 output)不能存在,否則會提示錯誤,因此運行前需要先洗掉輸出目錄,在實際開發應用程式時,可考慮在程式中加上如下代碼,能在每次運行時自動洗掉輸出目錄,避免繁瑣的命令列操作:
/* 判斷程式輸出路徑是否已經存在,若已經存在則洗掉該路徑 */
Path outPath = new Path(otherArgs[1]);
if (fs.exists(outPath)) fs.delete(outPath, true);
👉我們先看下反編譯的hadoop-mapreduce-examplesjar包的整體結構,在下圖中,我們可以看到給出的案例demo,

?我們選擇wordcount作為研究物件,反編譯后的原始碼如下:

👊運行案例如下:

?修改后的原始碼如下(部分加上注釋):

👊添加判斷洗掉陳述句后,即使沒有手動洗掉output目錄,也不會報錯,如下圖:

👊如果注釋上述添加部分,在此運行會報錯,結果如下:

🔎關閉Hadoop
若要關閉 Hadoop,則運行
hadoop@ubuntu:/opt/moudle/hadoop$ stop-dfs.sh

📢下次啟動 hadoop 時,無需進行 NameNode 的初始化,只需要運行 ./sbin/start-dfs.sh 就可以!
3.3 Hadoop完全分布式搭建
3.3.1 快照與克隆
👉在進行搭建之前,我們需要對已經配置好的偽分布式樣板機打上快照,首先我們來看下虛擬機快照的作用,
快照的作用類似于一個系統還原點,一個虛擬系統里可以存在多個快照,利用快照可進行系統和資料還原,
當搭建好一個環境后,在沒有添加任何資料時,或改變系統環境時,可以啟用快照功能,虛擬機會保存虛擬系統里當前的環境,包括所安裝的軟體等設定;
當環境改變或需要重新搭建并系統初始化時,為免安裝其他大型軟體,可以啟用快照的保存點進行恢復,作用就達到了快捷搭建環境的作用,也可以說是一種備份,
所以我們要先對其進行快照備份!
程序如下:

備份完成后,我們分別克隆三臺虛擬機,分別命名為Master,Slave1,Slave2,克隆程序如下(注意克隆盡量選擇完整克隆):

🔆等到完成后,完整克隆三個即可停止,

3.3.2 前期準備作業
當Hadoop采用分布式模式部署和運行時,存盤采用分布式檔案系統HDFS,而且,HDFS的名稱節點和資料節點位于不同機器上,這時,資料就可以分布到多個節點上,不同資料節點上的資料計算可以并行執行,這時的MapReduce分布式計算能力才能真正發揮作用,
為了降低分布式模式部署難度,本教程簡單使用三個節點(三臺物理機器)來搭建集群環境,一臺機器作為 Master節點,局域網IP地址為192.168.2.6,一臺機器作為 Slave1 節點,局域網 IP 地址為192.168.2.7,另一臺機器作為 Slave2 節點,局域網 IP 地址為192.168.2.8,
Hadoop 集群的安裝配置大致包括以下步驟:
(1)步驟1:選定一臺機器作為 Master;
(2)步驟2:在Master節點上創建hadoop用戶、安裝SSH服務端、安裝Java環境;
(3)步驟3:在Master節點上安裝Hadoop,并完成配置;
(4)步驟4:在其他Slave節點上創建hadoop用戶、安裝SSH服務端、安裝Java環境;
(5)步驟5:將Master節點上的“/opt/moudle/hadoop”目錄復制到其他Slave節點上;
(6)步驟6:在Master節點上開啟Hadoop;
上述這些步驟中,關于如何創建hadoop用戶、安裝SSH服務端、安裝Java環境、安裝Hadoop等程序,已經在上文中詳細解釋,在此不再贅述,并且由于克隆虛擬機的緣故,其實這幾步是可以直接省略的,我們在此所要完成的內容為配置主節點即Master節點的組態檔并分發到其他從(Slave)節點上,然后格式化,啟動測驗即可,
在此我們先把前期準備做好,
🔎 1. 網路配置
假設集群所用的三個節點(機器)都位于同一個局域網內,如果三個節點使用的是虛擬機安裝的Linux系統,那么三者都需要更改網路連接方式為NAT模式,才能實作多個節點互連,如下圖所示,

當然一般安裝時,我們就推薦使用NAT模式進行安裝,
網路配置完成以后,可以查看一下機器的IP地址,可以使用ifconfig命令查看,本教程在同一個局域網內部的三臺機器的IP地址分別是192.168.2.6、192.168.1.7和192.168.1.8,如下圖所示:

當然我們除了使用克隆機自己分配的ip外,也可以自定義修改成自己喜歡的ip地址,修改程序如下:
hadoop@Master:~$ sudo vim /etc/network/interfaces
# 下面為要修改部分
auto ens33
# static表示設定靜態IP,動態IP用dhcp,一般默認就是dhcp狀態
iface ens33 inet static
#IP地址
address 192.168.2.6
#子網掩碼
netmask 255.255.255.0
#網關
gateway 192.168.2.2
#廣播地址,可以不設
broadcast 192.168.2.255
修改完成后重啟網路即可
hadoop@Master:~$ sudo /etc/init.d/networking restart

出現上述結果即為成功,這時候可以通過ifconfig查看是否修完成功,修改了Master節點,Slave節點也不要忘了呀~
🔎 2. 修改主機名與映射
由于集群中有三臺機器需要設定,所以,在接下來的操作中,一定要注意區分Master節點和Slave節點,為了便于區分Master節點和Slave節點,可以修改各個節點的主機名,這樣,在Linux系統中打開一個終端以后,在終端視窗的標題和命令列中都可以看到主機名,就比較容易區分當前是對哪臺機器進行操作,在Ubuntu中,我們在 Master 節點上執行如下命令修改主機名:
hadoop@Master:~$ sudo vim /etc/hostname
執行上面命令后,就打開了“/etc/hostname”這個檔案,這個檔案里面記錄了主機名,比如,假設安裝Ubuntu系統時,設定的主機名是“ubuntu”,因此,打開這個檔案以后,里面就只有“ubuntu”這一行內容,可以直接洗掉,并修改為“Master”(注意是區分大小寫的),然后,保存退出vim編輯器,這樣就完成了主機名的修改,需要重啟Linux系統才能看到主機名的變化,
要注意觀察主機名修改前后的變化,在修改主機名之前,如果用hadoop登錄Linux系統,打開終端,進入Shell命令提示符狀態,會顯示如下內容:
hadoop@ ubuntu:~$
修改主機名并且重啟系統之后,用hadoop登錄Linux系統,打開終端,進入Shell命令提示符狀態,會顯示如下內容:
hadoop@ Master:~$
可以看出,這時就很容易辨認出當前是處于Master節點上進行操作,不會和Slave節點產生混淆,
然后,在Master節點中執行如下命令打開并修改Master節點中的“/etc/hosts”檔案,可以在hosts檔案中增加如下兩條IP和主機名映射關系:
hadoop@Master:~$ sudo vim /etc/hosts
# 添加映射
192.168.2.6 Master
192.168.2.7 Slave1
192.168.2.8 Slave2

需要注意的是,一般hosts檔案中只能有一個127.0.0.1,其對應主機名為localhost,如果有多余127.0.0.1映射,應洗掉,特別是不能存在“127.0.0.1 Master”這樣的映射記錄,修改后需要重啟Linux系統,
上面完成了Master節點的配置,接下來要繼續完成對其他Slave節點的配置修改,本教程有二個Slave節點,主機名為Slave1、Slave2,請參照上面的方法,把Slave節點上的“/etc/hostname”檔案中的主機名修改為“Slave1”、“Slave1”,同時,修改“/etc/hosts”的內容,在hosts檔案中增加如下三條IP和主機名映射關系:
hadoop@Slave1:~$ sudo vim /etc/hosts
# 添加映射
192.168.2.6 Master
192.168.2.7 Slave1
192.168.2.8 Slave2
修改完成以后,請重新啟動Slave節點的Linux系統,
這樣就完成了Master節點和Slave節點的配置,然后,需要在各個節點上都執行如下命令,測驗是否相互ping得通,如果ping不通,后面就無法順利配置成功:
hadoop@Master:~$ ping Master -c 3 # 只ping 3次就會停止,否則要按Ctrl+c中斷ping命令
hadoop@Master:~$ ping Slave1 -c 3
hadoop@Master:~$ ping Slave2 -c 3
Ping通結果如下圖所示:

🔎 3. SSH無密碼登錄節點
必須要讓Master節點可以SSH無密碼登錄到各個Slave節點上,首先,生成Master節點的公匙,如果之前已經生成過公鑰,必須要洗掉原來生成的公鑰,重新生成一次,因為前面我們對主機名進行了修改,具體命令如下:
hadoop@Master:~$ cd ~/.ssh # 如果沒有該目錄,先執行一次ssh localhost
hadoop@Master:~/.ssh$ rm ./id_rsa* # 洗掉之前生成的公匙(如果已經存在)
hadoop@Master:~/.ssh$ ssh-keygen -t rsa # 執行該命令后,遇到提示資訊,一直按回車就可以

為了讓Master節點能夠無密碼SSH登錄本機,需要在Master節點上執行如下命令:
adoop@Master:~/.ssh$ cat ./id_rsa.pub >> ./authorized_keys
完成后可以執行命令“ssh Master”來驗證一下,可能會遇到提示資訊,只要輸入yes即可,測驗成功后,請執行“exit”命令回傳原來的終端,

接下來,在Master節點將上公匙傳輸到Slave節點:
hadoop@Master:~$ scp ~/.ssh/id_rsa.pub hadoop@Slave1:/home/hadoop/
hadoop@Master:~$ scp ~/.ssh/id_rsa.pub hadoop@Slave2:/home/hadoop/
上面的命令中,scp是secure copy的簡寫,用于在 Linux下進行遠程拷貝檔案,類似于cp命令,不過,cp只能在本機中拷貝,執行scp時會要求輸入Slave上hadoop用戶的密碼,輸入完成后會提示傳輸完畢,如下圖所示,

接著在Slave1節點上,將SSH公匙加入授權,Slave2同理:
hadoop@Slave1:~$ mkdir ~/.ssh # 如果不存在該檔案夾需先創建,若已存在,則忽略本命令
mkdir: 無法創建目錄"/home/hadoop/.ssh": 檔案已存在
hadoop@Slave1:~$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
hadoop@Slave1:~$ rm ~/id_rsa.pub # 用完以后就可以刪掉

如果有其他Slave節點,也要執行將Master公匙傳輸到Slave節點以及在Slave節點上加入授權這兩步操作,如下:
adoop@Slave2:~$ mkdir ~/.ssh
hadoop@Slave2:~$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
hadoop@Slave2:~$ rm ~/id_rsa.pub

這樣,在Master節點上就可以無密碼SSH登錄到各個Slave節點了,可在Master節點上執行如下命令進行檢驗:
hadoop@Master:~$ ssh Slave1
hadoop@Master:~$ ssh Slave2

根據上圖,我們可以看到免密登錄已經完成,
3.3.3 配置集群/分布式環境
現在進行集群環境規劃,對3臺虛擬機的角色分布如下:
| 框架 | Master | Slave1 | Slave2 |
|---|---|---|---|
| HDFS | NameNode、DataNode | DataNode | SecondaryNameNode、DataNode |
| Yarn | NodeManager、ResourceManager | NodeManager | NodeManager |
最終啟動的服務如下圖所示(圖中的jps-all腳本會在后面給出):

📡組態檔說明
Hadoop組態檔分兩類:默認組態檔和自定義組態檔,只有用戶想修改某一默認配置值時,才需要修改自定義組態檔,更改相應屬性值,
🔎1.默認組態檔
| 要獲取的默認檔案 | 檔案存放在Hadoop的jar包中的位置 |
|---|---|
| core-default.xml | hadoop-common-3.1.3.jar/core-default.xml |
| hdfs-default.xml | hadoop-hdfs-3.1.3.jar/hdfs-default.xml |
| yarn-default.xml | hadoop-yarn-common-3.1.3.jar/yarn-default.xml |
| mapred-default.xml | hadoop-mapreduce-client-core-3.1.3.jar/mapred-default.xml |
🔎2.自定義組態檔
core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml四個組態檔存放在$HADOOP_HOME/etc/hadoop這個路徑上,用戶可以根據專案需求重新進行修改配置,
📡在配置集群/分布式模式時,需要修改“/opt/moudle/etc/hadoop”目錄下的組態檔,這里僅設定正常啟動所必須的設定項,包括workers 、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml共5個檔案,更多設定項可查看官方說明,
🔎(1)修改檔案workers
需要把所有資料節點的主機名寫入該檔案,每行一個,默認為 localhost(即把本機作為資料節點),所以,在偽分布式配置時,就采用了這種默認的配置,使得節點既作為名稱節點也作為資料節點,在進行分布式配置時,可以保留localhost,讓Master節點同時充當名稱節點和資料節點,或者也可以刪掉localhost這行,讓Master節點僅作為名稱節點使用,
本教程讓Master節點也作為資料節點使用,因此將workers檔案中原來的localhost洗掉,添加如下三行內容:
hadoop@Master:/opt/moudle/hadoop/etc/hadoop$ vim workers
Master
Slave1
Slave2
🔎(2)修改檔案core-site.xml
請把core-site.xml檔案修改為如下內容:
hadoop@Master:/opt/moudle/hadoop/etc/hadoop$ vim core-site.xml
<configuration>
<!-- 指定NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://Master:9000</value>
</property>
<!-- 指定hadoop資料的存盤目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>file:/opt/moudle/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<!-- 配置HDFS網頁登錄使用的靜態用戶為hadoop -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>hadoop</value>
</property>
</configuration>
🔎(3)修改檔案hdfs-site.xml
對于Hadoop的分布式檔案系統HDFS而言,一般都是采用冗余存盤,冗余因子通常為3,也就是說,一份資料保存三份副本,本教程資料節點也為3,所以 ,dfs.replication的值還是設定為3,hdfs-site.xml具體內容如下:
hadoop@Master:/opt/moudle/hadoop/etc/hadoop$ vim hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>Slave2:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/opt/moudle/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/opt/moudle/hadoop/tmp/dfs/data</value>
</property>
</configuration>
🔎(4)修改檔案mapred-site.xml
在有些版本中,“/opt/moudle/hadoop/etc/hadoop”目錄下有一個mapred-site.xml.template,需要修改檔案名稱,把它重命名為mapred-site.xml,如果不需要修改可以忽略此部分說明,然后,把mapred-site.xml檔案配置成如下內容:
hadoop@Master:/opt/moudle/hadoop/etc/hadoop$ vim mapred-site.xml
<configuration>
<!-- 指定MapReduce程式運行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>Master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>Master:19888</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/opt/moudle/hadoop</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/opt/moudle/hadoop</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/opt/moudle/hadoop</value>
</property>
</configuration>
🔎(5)修改檔案 yarn-site.xml
請把yarn-site.xml檔案配置成如下內容:
hadoop@Master:/opt/moudle/hadoop/etc/hadoop$ vim yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- 指定ResourceManager的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>Master</value>
</property>
<!-- 指定MR走shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
上述5個檔案全部配置完成以后,需要把Master節點上的“/opt/moudle/hadoop”檔案夾復制到各個節點上,如果之前已經運行過偽分布式模式,建議在切換到集群模式之前首先洗掉之前在偽分布式模式下生成的臨時檔案,具體來說,需要首先在Master節點上執行如下命令:
hadoop@Master:~$ cd /opt/moudle/hadoop/
hadoop@Master:/opt/moudle/hadoop$ rm -rf tmp/ # 洗掉 Hadoop 臨時檔案
hadoop@Master:/opt/moudle/hadoop$ rm -rf logs/* # 洗掉日志檔案
hadoop@Master:/opt/moudle$ tar -zcf /opt/software/hadoop.tar.gz hadoop # 先壓縮再復制
hadoop@Master:/opt/moudle$ cd /opt/software/

出現上圖示紅的tar包即為壓縮成功,下面進行分發:
hadoop@Master:/opt/software$ scp hadoop.tar.gz Slave1:/home/hadoop
hadoop@Master:/opt/software$ scp hadoop.tar.gz Slave2:/home/hadoop
分發成功后,需要分別在Slave1和Slave2中查看是否分發成功,如下圖所示,

接下來在Slave1和Slave2節點上分別執行如下命令:
hadoop@Slave1:~$ cd /opt/moudle/
hadoop@Slave1:/opt/moudle$ rm -rf hadoop # 刪掉舊的(如果存在)
hadoop@Slave1:/opt/moudle$ sudo tar -zxf ~/hadoop.tar.gz -C /opt/moudle/
hadoop@Slave1:/opt/moudle$ sudo chown -R hadoop:hadoop hadoop

同樣,如果有其他Slave節點,也要執行將hadoop.tar.gz傳輸到Slave節點以及在Slave節點解壓檔案的操作,
首次啟動Hadoop集群時,需要先在Master節點執行名稱節點的格式化(只需要執行這一次,后面再啟動Hadoop時,不要再次格式化名稱節點),命令如下:
hadoop@Master:/opt/software$ hdfs namenode -format
出現下圖即為成功,
現在就可以啟動Hadoop了,啟動需要在Master節點上進行,執行如下命令:
hadoop@Master:/opt/moudle/hadoop$ start-dfs.sh
hadoop@Master:/opt/moudle/hadoop$ start-yarn.sh
hadoop@Master:/opt/moudle/hadoop$ mr-jobhistory-daemon.sh start historyserver
啟動成功后通過命令jps可以查看各個節點所啟動的行程,如果已經正確啟動,則在Master節點上可以看到NameNode、DataNode、ResourceManager、NodeManager和JobHistoryServer行程,如下圖所示,

在Slave1節點可以看到DataNode和NodeManager行程,如下圖所示,

在Slave2節點可以看到DataNode、SecondrryNameNode和NodeManager行程,如下圖所示,

缺少任一行程都表示出錯,另外還需要在Master節點上通過命令“hdfs dfsadmin -report”查看資料節點是否正常啟動,如果螢屏資訊中的“Live datanodes”不為 0 ,則說明集群啟動成功,當資料節點啟動成功以后,會顯示如下圖所示資訊,

也可以在瀏覽器中輸入地址“http://Master:9870/”,通過 Web 頁面看到查看名稱節點和資料節點的狀態,如果不成功,可以通過啟動日志排查原因,界面如下圖,

📢這里再次強調,偽分布式模式和分布式模式切換時需要注意以下事項:
- 從分布式切換到偽分布式時,不要忘記修改
slaves組態檔; - 在兩者之間切換時,若遇到無法正常啟動的情況,可以洗掉所涉及節點的臨時檔案夾,這樣雖然之前的資料會被刪掉,但能保證集群正確啟動,所以,如果集群以前能啟動,但后來啟動不了,特別是資料節點無法啟動,不妨試著洗掉所有節點(包括
Slave節點)上的“/opt/moudle/hadoop/tmp”檔案夾,再重新執行一次“hdfs namenode -format”,再次啟動即可,
3.3.4 執行分布式實體
執行分布式實體程序與偽分布式模式一樣,首先創建HDFS上的用戶目錄,命令如下:
hadoop@Master:/opt/moudle/hadoop$ hdfs dfs -mkdir -p /user/hadoop
然后,在HDFS中創建一個input目錄,并把“/opt/moudle/hadoop/etc/hadoop”目錄中的組態檔作為輸入檔案復制到input目錄中,命令如下:
hadoop@Master:/opt/moudle/hadoop$ hdfs dfs -mkdir input
hadoop@Master:/opt/moudle/hadoop$ hdfs dfs -put /opt/moudle/hadoop/etc/hadoop/*.xml input
執行程序如下:

如果執行成功可以在UI查看或者通過命令列查看,在此僅從UI查看,如圖:
接著就可以運行 MapReduce 作業了,命令如下:
hadoop@Master:/opt/moudle/hadoop$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar grep input output 'dfs[a-z.]+'
運行時的輸出資訊與偽分布式類似,會顯示MapReduce作業的進度,如下圖所示,

執行程序可能會有點慢,但是,如果遲遲沒有進度,比如5分鐘都沒看到進度變化,那么不妨重啟Hadoop再次測驗,若重啟還不行,則很有可能是記憶體不足引起,建議增大虛擬機的記憶體,或者通過更改YARN的記憶體配置來解決,
在執行程序中,可以打開瀏覽器,在地址欄輸入“http://Master:8088/cluster”,通過Web界面查看任務進度,在Web界面點擊 “Tracking UI” 這一列的History連接,可以看到任務的運行資訊,如下圖所示,

執行完畢后的輸出結果如下圖所示,
hadoop@Master:/opt/moudle/hadoop$ hdfs dfs -cat output/*

除此之外也可以通過UI界面查看,如圖所示:

最后,關閉Hadoop集群,需要在Master節點執行如下命令:
hadoop@Master:/opt/moudle/hadoop$ stop-dfs.sh
hadoop@Master:/opt/moudle/hadoop$ stop-yarn.sh
hadoop@Master:/opt/moudle/hadoop$ mr-jobhistory-daemon.sh stop historyserver
至此,就順利完成了Hadoop集群搭建,
四、拓展部分
4.1 啟動行程
啟動Hadoop的話,我們即可以分別啟動,也可以群體啟動,關閉亦是如此,
🔎1.啟動
hadoop@Master:/opt/moudle/hadoop$ start-dfs.sh
hadoop@Master:/opt/moudle/hadoop$ start-yarn.sh
hadoop@Master:/opt/moudle/hadoop$ start-all.sh
🔎2.關閉
hadoop@Master:/opt/moudle/hadoop$ stop-dfs.sh
hadoop@Master:/opt/moudle/hadoop$ stop-yarn.sh
hadoop@Master:/opt/moudle/hadoop$ stop-all.sh
4.2 查看集群所有節點jps腳本
在3.3.3 配置集群/分布式環境此部分中,需要在每個虛擬機內分別輸入jps查看行程,如下圖所示:

我們有沒有發現很是麻煩,那么能否通過撰寫簡單的shell腳本進行群體查看呢?答案是可以的,具體程序如下:
🔎1.進入到/bin目錄下
hadoop@Master:~$ cd /bin/

🔎2.在 /bin 下創建 jps-all,并撰寫腳本
hadoop@Master:/bin$ sudo vim jps-all
#! /bin/bash
# 批量查看行程腳本
for i in Master
do
echo --------- $i ----------
ssh $i "$*"
done
for i in Slave1 Slave2
do
echo --------- $i ----------
ssh $i "$*"
done
🔎3.給 jps-all賦權限
hadoop@Master:/bin$ sudo chmod 777 jps-all
🔎4.測驗效果
在 master 上查看集群所有節點的 jps 行程
hadoop@Master:~$ jps-all jps

4.3 集群分發腳本(不要求掌握,了解即可,使用Ubuntu系統需要一些前提配置)
在上文中,分發檔案我們使用的均為scp(secure copy)安全拷貝,我們接下來介紹的為rsync遠程同步工具,
先來簡單介紹下兩者,
4.3.1 scp 安全拷貝
🔎1.定義
scp可以實作服務器與服務器之間的資料拷貝,(from server1 to server2)
🔎2.基本語法
| scp | -r | p d i r / pdir/ pdir/fname | u s e r @ user@ user@host: p d i r / pdir/ pdir/fname |
|---|---|---|---|
| 命令 | 遞回 | 要拷貝的檔案路徑/名稱 | 目的地用戶@主機:目的地路徑/名稱 |
🔎3.案例實操
在Master上,將Master中/opt/software中的hadoop.tar.gz拷貝到Slave1的/home/hadoop上
hadoop@Master:/opt/software$ scp hadoop.tar.gz Slave1:/home/hadoop

4.3.2 rsync遠程同步工具
🔎1.定義
rsync主要用于備份和鏡像,具有速度快、避免復制相同內容和支持符號鏈接的優點,
🔎2.兩者區別
rsync和scp區別:用rsync做檔案的復制要比scp的速度快,rsync只對差異檔案做更新,scp是把所有檔案都復制過去,
🔎3.基本語法
| rsync | -av | p d i r / pdir/ pdir/fname | u s e r @ user@ user@host: p d i r / pdir/ pdir/fname |
|---|---|---|---|
| 命令 | 選項引數 | 要拷貝的檔案路徑/名稱 | 目的地用戶@主機:目的地路徑/名稱 |
選項引數說明
| 選項 | 功能 |
|---|---|
| -a | 歸檔拷貝 |
| -v | 顯示復制程序 |
🔎4.案例實操
同步Master中的/opt/module/hadoop到Slave1中的/opt/software中
hadoop@Master:~$ rsync -av /opt/moudle/hadoop/ hadoop@Slave1:/opt/software/hadoop

4.3.3 xsync集群分發腳本
🔎1.需求
需求:回圈復制檔案到所有節點的相同目錄下
🔎2.需求分析
?①rsync命令原始拷貝
hadoop@node01:~$ rsync -av /opt/moudle/ hadoop@Slave1:/opt
?②期望腳本
xsync要同步的檔案名稱
?③期望腳本在任何路徑都能使用(腳本放在宣告了全域環境變數的路徑)
hadoop@node01:~$ echo $PATH

如果還沒有配置請按照下面進行操作
hadoop@node01:/bin$ vim ~/.bashrc
# 所要添加部分
export PATH=$PATH:/home/hadoop/bin
hadoop@node01:/bin$ source ~/.bashrc

🔎3.腳本實作
?①在/home/hadoop/bin目錄下創建xsync檔案
hadoop@node01:/bin$ cd /home/hadoop/
hadoop@node01:~$ mkdir bin
hadoop@node01:~$ cd bin/
hadoop@node01:~/bin$ vim xsync
在該檔案中撰寫如下代碼
#!/bin/bash
#1. 判斷引數個數
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍歷集群所有機器
for host in node01 node02 node03
do
echo ==================== $host ====================
#3. 遍歷所有目錄,挨個發送
for file in $@
do
#4. 判斷檔案是否存在
if [ -e $file ]
then
#5. 獲取父目錄
pdir=$(cd -P $(dirname $file); pwd)
#6. 獲取當前檔案的名稱
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
?②修改腳本 xsync 具有執行權限
hadoop@node01:~/bin$ chmod +x xsync

?③測驗腳本
hadoop@node01:~/bin$ xsync /home/hadoop/bin/ # /home/hadoop/bin 下的所有內容到 node02 node03

?④將腳本復制到/bin中,以便全域呼叫(從此步驟開始往下可以不用操作)
hadoop@node01:~/bin$ sudo cp xsync /bin/
hadoop@node01:~/bin$ sudo -i
root@node01:~# cd /bin/
root@node01:/bin# ll

?⑤以root權限同步檔案
root@node01:/bin# sudo xsync /home/hadoop/hadoop.master.tar.gz

本篇文章到這里就結束了,如有不足請指出~

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/303003.html
標籤:其他
上一篇:HDFS檔案誤刪怎么辦,一招教你恢復回來,再也不用擔心刪庫跑路了
下一篇:如何在EXCEL中練習VBA?
