1. 程式人生 > >java大資料最全課程學習筆記(2)--Hadoop完全分散式執行模式

java大資料最全課程學習筆記(2)--Hadoop完全分散式執行模式

> 目前[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所在的機器