java大資料最全課程學習筆記(2)--Hadoop完全分散式執行模式
阿新 • • 發佈:2020-07-15
> 目前[CSDN](https://blog.csdn.net/weixin_42208775),[部落格園](https://home.cnblogs.com/u/gitBook/),[簡書](https://www.jianshu.com/u/da41700fde04)同步發表中,更多精彩歡迎訪問我的[gitee pages](http://it-it.gitee.io/bigdata)
[toc]
# Hadoop完全分散式執行模式
## 步驟分析:
1. 準備3臺客戶機(關閉防火牆、靜態ip、主機名稱)
`vim /etc/sysconfig/network`
三臺機器各自的配置分別為HOSTNAME=hadoop101;HOSTNAME=hadoop102;HOSTNAME=hadoop103
`vim /etc/hosts`
三臺機器都加入下面的對映關係
```shell
192.168.1.101 hadoop101
192.168.1.102 hadoop102
192.168.1.103 hadoop103
```
2. 安裝JDK
3. 配置環境變數
4. 安裝Hadoop
5. 配置環境變數
6. 配置叢集
7. 單點啟動
8. 配置ssh
9. 群起並測試叢集
> 由於在[上一章節](https://www.cnblogs.com/gitBook/p/13287172.html)已經配置好環境並測試了hadoop偽分散式開發模式,所以在此不再贅述.
## 編寫叢集分發指令碼xsync
1. scp(secure copy) 安全拷貝(全量複製)
1. scp定義
> scp可以實現伺服器與伺服器之間的資料拷貝.(from server1 to server2)
2. 基本語法
> scp -r 原始檔使用者名稱A@主機名1:path1 目標檔案使用者名稱B@主機名2:path2
3. 其他
1. 如果從本機執行讀取或寫入,使用者名稱B@主機名2:可以省略!
2. 在主機1上,使用A使用者讀取path1的檔案,再使用使用者B登入到主機2,在主機2的path2路徑執行寫入!
3. 要求:
1. 使用者名稱A@主機名1 對path1有讀許可權
2. 使用者名稱B@主機名2 對path2有寫許可權
2. rsync 遠端同步工具
> rsync主要用於備份和映象。具有速度快、避免複製相同內容和支援符號連結的優點。
> rsync和scp區別:用rsync做檔案的複製要比scp的速度快,rsync只對差異檔案做更新。scp是把所有檔案都複製過去。
>rsync -rvlt path1 目標檔案使用者名稱B@主機名2:path2
| 選項 | 功能 |
| ---- | ---------------------------------------------------- |
| -r | 遞迴 |
| -v | 顯示覆制過程 |
| -l | 拷貝符號連線 |
| -t | 基於檔案的修改時間進行對比,只同步修改時間不同的檔案 |
**只能將本機的檔案同步到其他機器!**
**注意:path1是個目錄,目錄以/結尾,只會同步目錄中的內容,不會同步目錄本身!目錄不以/結尾,同步目錄中的內容,也會同步目錄本身!**
3. 編寫xsync叢集分發指令碼
1. 需求:迴圈複製檔案到所有節點的相同目錄下,即將當前機器的檔案,同步到叢集所有機器的相同路徑下!例如:hadoop102:/A/a , 執行指令碼後,將此檔案同步到叢集中所有機器的 /A/a
2. 需求分析:
1. 使用者在使用xsync時,只需要傳入要同步的檔案即可
xysnc a
不管a是一個相對路徑還是絕對路徑,都需要將a轉換為絕對路徑!
2. 檔案的絕對路徑:
父路徑: dirpath=$(cd `dirname /home/atguigu/hi`; pwd -P)
檔名: filename=`basename hi`
pwd -P為了避免軟連結無法獲取到真實的父路徑
3. 核心命令:
for(())
do
rsync -rvlt path1
done
4. **說明:在/home/atguigu/bin這個目錄下存放的指令碼,atguigu使用者可以在系統任何地方直接執行。**
3. 指令碼實現:
```shell
[atguigu@hadoop102 ~]$ mkdir bin
[atguigu@hadoop102 ~]$ cd bin/
[atguigu@hadoop102 bin]$ touch xsync
[atguigu@hadoop102 bin]$ vi xsync
```
- 在該檔案中編寫如下程式碼
```shell
#!/bin/bash
#校驗引數是否合法
if(($#==0))
then
echo 請輸入要分發的檔案!
exit;
fi
#拼接要分發檔案的絕對路徑
dirpath=$(cd `dirname $1`; pwd -P)
filename=`basename $1`
echo 要分發的檔案的路徑是:$dirpath/$filename
#迴圈執行rsync分發檔案到叢集的每臺機器
for((i=101;i<=103;i++))
do
echo --------------hadoop$i-------------------
rsync -rvlt $dirpath/$filename atguigu@hadoop$i:$dirpath
done
```
- 修改指令碼 xsync 具有執行許可權
```shell
[atguigu@hadoop102 bin]$ chmod 777 xsync
```
或者
```shell
[atguigu@hadoop102 bin]$ chmod u+x xsync
```
- 呼叫指令碼形式:xsync 檔名稱
4. 編寫批量執行同一命令的指令碼
```shell
#!/bin/bash
#在叢集的所有機器上批量執行同一條命令
if(($#==0))
then
echo 請輸入您要操作的命令!
exit;
fi
echo 要執行的命令是$*
#迴圈執行此命令
for((i=101;i<=103;i++))
do
echo --------------hadoop$i-------------------
ssh hadoop$i $*
done
```
## 叢集配置
### 叢集部署規劃
| | hadoop101 | hadoop102 | hadoop103 |
| ---- | :---------------: | :-------------------------: | :------------------------: |
| HDFS | NameNode DataNode | DataNode | SecondaryNameNode DataNode |
| YARN | NodeManager | ResourceManager NodeManager | NodeManager |
### 配置叢集
1. 核心配置檔案
- 配置core-site.xml
`[atguigu@hadoop102 hadoop]$ vi core-site.xml`
- 在該檔案中編寫如下配置
```xml
```
2. HDFS配置檔案
- 配置hadoop-env.sh
`[atguigu@hadoop102 hadoop]$ vi hadoop-env.sh`
> export JAVA_HOME=/opt/module/jdk1.8.0_144
- 配置hdfs-site.xml
`[atguigu@hadoop102 hadoop]$ vi hdfs-site.xml`
- 在該檔案中編寫如下配置
```xml
```
3. YARN配置檔案
- 配置yarn-env.sh
`[atguigu@hadoop102 hadoop]$ vi yarn-env.sh`
> export JAVA_HOME=/opt/module/jdk1.8.0_144
- 配置yarn-site.xml
`[atguigu@hadoop102 hadoop]$ vi yarn-site.xml`
- 在該檔案中增加如下配置
```xml
```
4. MapReduce配置檔案
- 配置mapred-env.sh
`[atguigu@hadoop102 hadoop]$ vi mapred-env.sh`
> export JAVA_HOME=/opt/module/jdk1.8.0_144
- 配置mapred-site.xml
`[atguigu@hadoop102 hadoop]$ vi mapred-site.xml`
- 在該檔案中增加如下配置
```xml
```
5. 在叢集上分發配置好的Hadoop配置檔案
`[atguigu@hadoop102 hadoop]$ xsync /opt/module/hadoop-2.7.2/`
6. 檢視檔案分發情況
`xcall cat /opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml`
## 叢集單點啟動
1. 如果叢集是第一次啟動,需要格式化NameNode
`[atguigu@hadoop102 hadoop-2.7.2]$ hadoop namenode -format`
2. 在hadoop102上啟動NameNode
```shell
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop-daemon.sh start namenode
[atguigu@hadoop102 hadoop-2.7.2]$ jps
8118 NameNode
```
3. 啟動hadoop101,hadoop102,hadoop103上的DataNode
```shell
[atguigu@hadoop102 hadoop-2.7.2]$ xcall hadoop-daemon.sh start datanode
[atguigu@hadoop101 hadoop]$ xcall jps
要執行的命令是jps
--------------hadoop101-------------------
8118 NameNode
13768 Jps
8238 DataNode
--------------hadoop102-------------------
8072 DataNode
12959 Jps
--------------hadoop103-------------------
7347 DataNode
13950 Jps
```
## SSH無密登陸配置
1. 免密登入原理
![](https://img2020.cnblogs.com/blog/1577985/202007/1577985-20200714220124651-362881894.png)
2. 生成公鑰和私鑰
`[atguigu@hadoop102 .ssh]$ ssh-keygen -t rsa`
然後敲(三個回車),就會生成兩個檔案id_rsa(私鑰)、id_rsa.pub(公鑰)
3. 將公鑰拷貝到要免密登入的目標機器上的/home/atguigu/.ssh目錄下的authorized_keys中
以下命令可以直接完成上述操作
```shell
[atguigu@hadoop102 .ssh]$ ssh-copy-id hadoop101
[atguigu@hadoop102 .ssh]$ ssh-copy-id hadoop102
[atguigu@hadoop102 .ssh]$ ssh-copy-id hadoop103
```
4. .ssh資料夾下(~/.ssh)的檔案功能解釋
| known_hosts | 記錄ssh訪問過計算機的公鑰(public key) |
| --------------- | ------------------------------------- |
| id_rsa | 生成的私鑰 |
| id_rsa.pub | 生成的公鑰 |
| authorized_keys | 存放授權過得無密登入伺服器公鑰 |
## 登入狀態的環境變數
- Login Shell
是指登入時,需要提供使用者名稱密碼的shell,如:su – user1 , 圖形登入, ctrl+alt+F2-6進入的登入介面。
- 這種Login shell 執行指令碼的順序:
1. /etc/profile 【全域性profile檔案;它定義了LoginUser的 PATH, USER, LOGNAME(登入使用者帳號)】
2. /etc/profile.d/目錄下的指令碼
3. ~/.bash_profile 【搜尋命令的路徑 ——————- 登入級別 環境變數配置檔案 】
4. ~/.bashrc 【儲存使用者設定的別名和函式 ———- shell級別 環境變數配置檔案】
5. /etc/bashrc 【全域性bashrc檔案; 它主要定義一些 Function 和 Alias;更改/etc/bashrc會影響到所有使用者,由root使用者管理。】
- Non-Login shell
- 登入終端後,使用ssh 登入 其他機器!
- 非登入shell指的是,不需要輸入使用者名稱密碼的shell,如圖形下 右鍵terminal,或ctrl+shift+T開啟的shell
- 這種Non-Login shell 執行登入指令碼的順序:
1. ~/.bashrc
2. /etc/bashrc
3. /etc/profile.d/目錄下的指令碼
- ssh 目標機器
登入之後,執行某個命令!
屬於Login-shell,會自動讀取 /etc/profile檔案中定義的所有的變數!
- ssh 目標機器 命令
屬於Non-Login-shell
**不會讀取/etc/profile**
如果在使用命令時,我們需要使用/etc/profile定義的一些變數,需要在目標機器的對應的使用者的家目錄/.bashrc中新增以下程式碼
`source /etc/profile`
**如果不新增以上程式碼,在執行start-all.sh | stop-all.sh一定會報錯!**
## 群起叢集
> 群起指令碼的原理是獲取叢集中所有的節點的主機名
> 預設讀取當前機器 HADOOP_HOME/etc/hadoop/slaves,獲取叢集中所有的節點的主機名
> 迴圈執行 ssh 主機名 hadoop-daemon.sh start xxx
> **保證當前機器到其他節點,已經配置了ssh免密登入**
> **保證叢集中所有當前使用者的家目錄/.bashrc中,已經配置source /etc/profile**
1. 配置slaves
```shell
/opt/module/hadoop-2.7.2/etc/hadoop/slaves
[atguigu@hadoop102 hadoop]$ vi slaves
```
在檔案中增加如下內容:
```shell
hadoop101
hadoop102
hadoop103
```
**注意:該檔案中新增的內容結尾不允許有空格,檔案中不允許有空行。**
2. 啟動叢集
1. 如果叢集是第一次啟動,需要格式化NameNode
`[atguigu@hadoop102 hadoop-2.7.2]$ hdfs namenode -format`
2. 啟動HDFS
```shell
[atguigu@hadoop101 hadoop]$ start-dfs.sh
[atguigu@hadoop101 hadoop]$ xcall jps
要執行的命令是jps
--------------hadoop101-------------------
8118 NameNode
13768 Jps
8238 DataNode
--------------hadoop102-------------------
8072 DataNode
12959 Jps
--------------hadoop103-------------------
7473 SecondaryNameNode
7347 DataNode
13950 Jps
```
3. 啟動YARN
`[atguigu@hadoop103 hadoop-2.7.2]$ start-yarn.sh`
4. web端檢視SecondaryNameNode
1. 瀏覽器中輸入:http://hadoop103:50090/status.html
2. 檢視SecondaryNameNode資訊
![](https://img2020.cnblogs.com/blog/1577985/202007/1577985-20200714220101715-1835785999.png)
3. 叢集基本測試
1. hadoop fs -mkdir /wcinput
2. hadoop fs -put hi /wcinput/
3. hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /wcinput/ /wcoutput
![](https://img2020.cnblogs.com/blog/1577985/202007/1577985-20200714220042231-1907898431.png)
## 叢集啟動/停止方式總結
1. 各個服務元件逐一啟動/停止
1. 分別啟動/停止HDFS元件
`hadoop-daemon.sh start / stop namenode / datanode / secondarynamenode`
2. 啟動/停止YARN
`yarn-daemon.sh start / stop resourcemanager / nodemanager`
2. 各個模組分開啟動/停止(配置ssh是前提)
1. 整體啟動/停止HDFS
`start-dfs.sh / stop-dfs.sh`
2. 整體啟動/停止YARN
`start-yarn.sh / stop-yarn.sh`
3. 啟動歷史伺服器
`mr-jobhistory-daemon.sh start historyserver`
## 叢集時間同步
> 每臺虛擬機器作如下設定即可保證時間同步
![](https://img2020.cnblogs.com/blog/1577985/202007/1577985-20200714220005908-935761838.png)
>也可設定定時同步時間的任務
`crontab -e `
`* */1 * * * ntpdate -u ntp7.aliyun.com`
## 其他注意事項
1. start-all.sh其實是分別呼叫了start-dfs.sh和start-yarn.sh,現已過時不建議使用.
2. stop-all.sh同理.
3. start-dfs.sh可以在叢集的任意一臺機器使用!可以啟動HDFS中的所有程序!
4. **start-yarn.sh在叢集的非RM所在的機器使用,不會啟動resourcemanager!**
> 建議:
>
> 只需要配置RM所在機器到其他機器的SSH免密登入!
> 都在RM所在的機器執行群起和群停指令碼!
> xsync和xcall只放在RM所在的機器