###### tags: `Hadoop` # 架設叢集兩三事 ## Hadoop 說明: 請參閱 https://hackmd.io/@JeffWen/HADOOP * Hadoop三種模式: 1. 單機模式(Standalone Mode): * 這種模式下不會啟動任何背景Java程式,此模式適合開發測試及除錯。 2. 偽分佈式模式(Pseudo-Distributed Mode) - Hadoop中的背景Java程式均運行於本機節點,可以模擬小規模的叢集,[架設步驟請參閱](https://hackmd.io/@JeffWen/bdsevm)。 3. 完全分佈式模式(Fully-Distributed Mode) - Hadoop中的背景Java程式運行數個主機上。 |屬性| 本機模式 | 偽分佈式模式 | 完全分佈式模式 | |:---:|:--------:|:--------:|:--------:| |fs.defaultFS| file:/// | hdfs:/// | hdfs:/// | |dfs.replication|N/A|1|3| |mapreduce .framework.name|N/A|yarn|yarn| |yarn.resourcemanager.hostname|N/A|localhost|resourcemanager| |yarn.nodemanager.auxervices|N/A|mapreduce_shuffle|mapreduce_shuffle| ### <Big>綱目</Big> :::warning **1. [Hadoop叢集基礎架設](#base) 2. [Spark及Jupyter應用程式安裝](#spark) 3. [叢集高可用性 HA(high availability)架設](#ha) 4. [一般叢集開(關)機程序](#normal) 5. [HA叢集開(關)機程序](#HA) 6. [Hadoop懶人腳本](#shell) 7. [SparkR架設,請參閱](https://hackmd.io/@JeffWen/sparkR)** ::: <h3 id="base">Hadoop叢集基礎架設</h3> 0. 要準備的事項 1. DHCP伺服器找出沒有使用的子網路段 ![](https://i.imgur.com/Q5y7bho.png) 取子網路段30-34來充當5台電腦ip :information_source: [DHCP科普請參考](http://linux.vbird.org/linux_server/0340dhcp.php) 2. 設定Windows 的host 名單 ![](https://i.imgur.com/fGOHVZa.png) ![](https://i.imgur.com/f1eDQfo.png) :information_source:[hosts科普請參考](https://zh.wikipedia.org/wiki/Hosts%E6%96%87%E4%BB%B6) 3. 擁有一台Ubuntu 18.04 server 請參考[Ubuntu 18.04 LTS Server 安裝不求人~~](https://hackmd.io/@JeffWen/ByVQYR2M8) 4. 資源配置 cpu:4 ram:8G 1台nna 1台rma 3台worker --- 1. 停用IPv6(**管理者身份**) 1. 檢查一下網路跟監聽的狀態(切換管理者) ```bash= ip addr show lsof -nPi ``` ![](https://i.imgur.com/mB24bEw.png) 2. 修改開機設定檔 ```bash nano /etc/default/grub ``` ![](https://i.imgur.com/Ruf4tH9.png) 3. 更新開機設定檔 ```bash update-grub # update-grub2 ``` ![](https://i.imgur.com/J9Nd9Wr.png) 4. 重新開機 ```bash reboot ``` 5. 檢查一下IPv6是否已經停用了 ```bash= ip addr show lsof -nPi ``` --- 2. 安裝pip(**管理者身份**) 1. 安裝python開發工具箱 ```bash= sudo apt update sudo apt install python3-dev ``` 2. 安裝pip ```bash= #取得最新版pip腳本 wget https://bootstrap.pypa.io/get-pip.py python3 get-pip.py ``` --- 3. 建立hadoop帳號(**管理者身份**) 1.hadoop帳號 ```bash sudo adduser hadoop ``` 2. 檢查是否已經創立 ```bash= grep 'hadoop' /etc/passwd grep 'hadoop' /etc/group grep 'hadoop' /etc/shadow ls -l /home ``` ![](https://i.imgur.com/NrHWEY3.png) 4. 安裝OpenJDK8(**管理者身份**) 1. 更新倉庫清單 ```bash apt update ``` 2. 安裝openjdk ```bash apt install openjdk-8-jdk ``` 3. 確認jdk及jre版本 ```bash= java -version javac -version ``` ![](https://i.imgur.com/G0RMOdB.png) 4. 建立openjdk環境變數腳本 ```bash nano /etc/profile.d/jdk.sh ``` 5. 編輯openjdk環境變數 ```bash export JAVA_HOME='/usr/lib/jvm/java-8-openjdk-amd64' ``` ![](https://i.imgur.com/NRulRia.png) 6. 重新載入設定檔,並檢查設定是否正確 ```bash source /etc/profile.d/jdk.sh # . /etc/profile.d/jdk.sh ``` ![](https://i.imgur.com/3jtuRKc.png) 5. 建立無密碼login(**Hadoop身份**) 1. 切換hadoop帳號 ```bash su - hadoop ``` 3. 打造ssh公鑰及私鑰 ```bash ssh-keygen -t rsa ``` ![](https://i.imgur.com/HHdLYDn.png) ![](https://i.imgur.com/BRa0XU2.png) 4. 將打造好的公鑰複製一份給hadoop ```bash ssh-copy-id hadoop@localhost ``` ![](https://i.imgur.com/qJ5gDVs.png) 5. 測試一下無密碼登入(不用輸入密碼代表成功了) ```bash ssh hadoop@localhost ``` ![](https://i.imgur.com/0nz0spb.png) :warning:**要馬上exit退出來!!!** ~~6. 將自己的公鑰傳給其他人(自己電腦玩可以省略這一步)~~ :warning:**此方法並非正規作法,會提供寫入權限** ```bash= ssh-copy-id hadoop@192.168.XX.XXX ssh-copy-id hadoop@192.168.XX.XXX ssh-copy-id hadoop@192.168.XX.XXX ``` --- 6. 建立Linux hotsts名單(**管理者身份**) ```bash= nano /etc/hosts ``` ![](https://i.imgur.com/yunaC1S.png) --- 7. 下載及安裝hadoop(**管理者身份**) 1. 下載 ```bash= cd wget http://ftp.tc.edu.tw/pub/Apache/hadoop/common/hadoop-3.2.1/hadoop-3.2.1.tar.gz ``` :information_desk_person: 如果載點失效,請至[官網下載~~](https://spark.apache.org/downloads.html) 2. 解壓縮 ```bash tar -tvf hadoop-3.2.1.tar.gz #查看一下檔案內容 tar -xvf hadoop-3.2.1.tar.gz -C /usr/local ``` 3. 更名 ```bash mv /usr/local/hadoop-3.2.1 /usr/local/hadoop ``` 4. 改變資料夾及檔案擁有者 ```bash chown -R hadoop:hadoop /usr/local/hadoop ``` --- 8. 設定hadoop使用者環境變數 (**Hadoop身份**) 1. 設定.bashrc ```bash nano ~/.bashrc ``` ![](https://i.imgur.com/FdzPaih.png) ```bash= # Set HADOOP_HOME export HADOOP_HOME=/usr/local/hadoop # Set HADOOP_MAPRED_HOME export HADOOP_MAPRED_HOME=${HADOOP_HOME} # Add Hadoop bin and sbin directory to PATH export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin ``` 2. 重新載入設定檔 ```bash source ~/.bashrc # . .bashrc ``` 3. 查看環境變數 ![](https://i.imgur.com/mLRFOgM.png) --- 9. 更改 Hadoop運行程式時環境腳本(**Hadoop身份**) ```bash nano /usr/local/hadoop/etc/hadoop/hadoop-env.sh ``` ![](https://i.imgur.com/SaJCOJS.png) ```bash= export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 export HADOOP_HOME=/usr/local/hadoop export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop ``` --- 10. 更改 Hadoop core-site.xml(**Hadoop身份**) ```bash nano /usr/local/hadoop/etc/hadoop/core-site.xml ``` ![](https://i.imgur.com/ECXvLk6.png) ```xml= <property> <name>hadoop.tmp.dir</name> <value>/home/hadoop/data</value> <description>Temporary Directory.</description> </property> <property> <name>fs.defaultFS</name> <value>hdfs://test30.example.org</value> <description>Use HDFS as file storage engine</description> </property> ``` :information_source: Hadoop 3.2.0版之後有檢查語法指令 ```bash hadoop conftest ``` ![](https://i.imgur.com/floyZJQ.png) --- 11. 更改 Hadoop mapred-site.xml(**Hadoop身份**) ![](https://i.imgur.com/83zJ63V.png) 參考hortonworks配置 ```bash nano /usr/local/hadoop/etc/hadoop/mapred-site.xml ``` ![](https://i.imgur.com/IXQ4srT.png) ```xml= <property> <name>mapreduce.map.memory.mb</name> <value>2048</value> </property> <property> <name>mapreduce.map.java.opts</name> <value>-Xmx1638m</value> </property> <property> <name>mapreduce.reduce.memory.mb</name> <value>4096</value> </property> <property> <name>mapreduce.reduce.java.opts</name> <value>-Xmx3276m</value> </property> <property> <name>yarn.app.mapreduce.am.resource.mb</name> <value>4096</value> </property> <property> <name>yarn.app.mapreduce.am.command-opts</name> <value>-Xmx3276m</value> </property> <property> <name>mapreduce.task.io.sort.mb</name> <value>819</value> </property> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>test32.example.org:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>test32.example.org:19888</value> </property> ``` --- 12. 更改 Hadoop yarn-site.xml(**Hadoop身份**) ```bash nano /usr/local/hadoop/etc/hadoop/yarn-site.xml ``` ![](https://i.imgur.com/5rMard1.png) ```xml= <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.env-whitelist</name> <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value> </property> <property> <name>yarn.scheduler.minimum-allocation-mb</name> <value>2048</value> </property> <property> <name>yarn.scheduler.maximum-allocation-mb</name> <value>6144</value> </property> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>6144</value> </property> <property> <name>yarn.nodemanager.resource.detect-hardware-capabilities</name> <value>true</value> </property> <property> <name>yarn.nodemanager.resource.cpu-vcores</name> <value>3</value> </property> <property> <name>yarn.resourcemanager.hostname</name> <value>test31.example.org</value> </property> <property> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value> </property> ``` --- 13. 更改Hadoop hdfs-site.xml(**Hadoop身份**) ```bash nano /usr/local/hadoop/etc/hadoop/hdfs-site.xml ``` ![](https://i.imgur.com/CfFZs01.png) ```xml= <property> <name>dfs.permissions.superusergroup</name> <value>hadoop</value> <description>The name of the group of super-users. The value should be a single group name.</description> </property> ``` --- 14. 建立Hadoop worker檔(**管理者身份**) ```bash nano /usr/local/hadoop/etc/hadoop/workers ``` ![](https://i.imgur.com/ZCqlC08.png) --- 15. 複製電腦 (**管理者身份**) * 使用前檢查事項: * 停用IPv6 * 建立hadoop帳號 * 完成無密碼login * 建立hosts檔 * 建立worker檔 * 安裝OpenSSH server * OpenJDK8安裝並設定 * 下載hadoop並修改完環境變數及相關設定 * ***確認無誤再執行不然會多做很多事情...*** 1. 複製資料夾並更改資料夾名稱 ![](https://i.imgur.com/tqaMaER.png) 3. 更改UUID(與資料夾名稱一樣) ![](https://i.imgur.com/SBuwnVW.png) 4. 開機時候選擇I Copied It(會自動建立新的MAC) ![](https://i.imgur.com/ABYpY39.png) 6. 編輯cloud.cfg設定檔 ```bash sudo nano /etc/cloud/cloud.cfg ``` ![](https://i.imgur.com/b1PzJnl.png) 4. 修改hostname ```bash hostnamectl set-hostname <HOSTNAME> #HOSTNAME自行設定 ``` ![](https://i.imgur.com/pBBw6Dm.png) 5. 編輯50-cloud-init.yaml設定檔,修改網路IP ```bash sudo nano /etc/netplan/50-cloud-init.yaml ``` ![](https://i.imgur.com/partsPW.png) 6. 套用網路設定 ```bash sudo netplan apply ``` ![](https://i.imgur.com/zQmkAJ9.png) 7. 重開機(有多少台電腦就重複做幾次...) ```bash reboot ``` * 全部電腦開機 ![](https://i.imgur.com/LkwuHZ6.jpg) --- 16. Namenode format(**hadoop身份**) ```bash hdfs namenode -format #只有Namenode那一台 ``` ![](https://i.imgur.com/HyyduLX.png) --- 17. 啟動hdfs(**hadoop身份**) ```bash= start-dfs.sh #只有Namenode那一台 ``` ![](https://i.imgur.com/CR533V3.png) ![](https://i.imgur.com/0nYeeC3.png) ![](https://i.imgur.com/pUFSslT.png) http://test30.example.org:9870 --- 18. 啟動yarn(**hadoop身份**) ```bash= start-yarn.sh #只有Resourcemanager那一台 ``` ![](https://i.imgur.com/08Bk1Wp.png) ![](https://i.imgur.com/Vf3xnh2.png) ![](https://i.imgur.com/GrkR9jR.png) http://test31.example.org:8088/ --- 19. 啟動History Server(**hadoop身份**) ```bash= mapred --daemon start historyserver #只有History Server那一台 #mr-jobhistory-daemon.sh start historyserver (deprecated) ``` ![](https://i.imgur.com/h20b78M.png) ![](https://i.imgur.com/Rj7fFw1.png) --- 20. 跑個pi 測試一下mapreduce (**hadoop身份**) ```bash= hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar pi 30 100 ``` ![](https://i.imgur.com/2TAltZW.png) ![](https://i.imgur.com/3hPwPwP.png) ![](https://i.imgur.com/LcgnWeG.png) ![](https://i.imgur.com/0B4yjNo.png) 會自動建立hadoop的目錄 ![](https://i.imgur.com/HQfxlPk.png) <Big>恭喜你完成第一階段Hadoop基本架設~~~</Big> --- <h3 id="spark">Spark及Jupyter應用程式安裝</h3> 0. 請先確認叢集均已啟動服務 **:information_source: 請參閱[一般叢集開(關)機程序](#normal)** 1. 下載及安裝Spark(**管理者身份**) 1. 下載 ```bash= cd wget http://ftp.tc.edu.tw/pub/Apache/spark/spark-2.4.4/spark-2.4.4-bin-hadoop2.7.tgz ``` 2. 解壓縮 ```bash tar -xvf spark-2.4.4-bin-hadoop2.7.tgz -C /usr/local ``` 3. 更名 ```bash mv /usr/local/spark-2.4.4-bin-hadoop2.7 /usr/local/spark ``` 4. 修改spark資料夾及檔案使用者 ```bash chown -R hadoop:hadoop /usr/local/spark ``` --- 2. 修改Spark環境變數(**hadoop身份**) 1. 設定.bashrc ```bash nano ~/.bashrc ``` ![](https://i.imgur.com/yxskMpp.png) 2. 重新載入設定檔 ```bash source ~/.bashrc #( . .bashrc) ``` 3. 查看環境變數 ![](https://i.imgur.com/VaUwRiU.png) --- 3. 更改 Spark運行程式時環境腳本(**hadoop身份**) 1. 複製並建立一份spark-env腳本 ```bash cp /usr/local/spark/conf/spark-env.sh.template /usr/local/spark/conf/spark-env.sh ``` 2. 編輯spark-env腳本 ```bash nano /usr/local/spark/conf/spark-env.sh ``` ![](https://i.imgur.com/ij1RPYu.png) --- 4. 跑個pi 測試一下Spark(**hadoop身份**) ```bash= cd $SPARK_HOME ./bin/spark-submit --class org.apache.spark.examples.SparkPi \ --master yarn \ --deploy-mode cluster \ --driver-memory 1g \ --executor-memory 1g \ --executor-cores 1 \ --num-executors 3 \ --queue default \ examples/jars/spark-examples*.jar \ 100 ``` ![](https://i.imgur.com/RZABqfU.png) ![](https://i.imgur.com/bPOqpn1.png) ![](https://i.imgur.com/oMoDOw3.png) ![](https://i.imgur.com/2DuS7x0.png) --- * 明顯看出Spark 遠遠勝過 MapReduce (同樣跑pi 100次) ![](https://i.imgur.com/dHCrGcS.png) MapReduce花費3分11秒 Spark花費14秒 --- 5. 停止Spark運行程式時都要上傳jar檔到hdfs方式(**hadoop身份**) ![](https://i.imgur.com/roEKIYC.png) ![](https://i.imgur.com/5zK9vjK.png) * *每次都要上傳那麼多檔案擾民...* 1. 在 hdfs 建立目錄放jar檔 ```bash= hdfs dfs -mkdir -p /user/spark/share/jars hdfs dfs -put $SPARK_HOME/jars/* /user/spark/share/jars/ hdfs dfs -ls /user/spark/share/jars ``` 2. 上傳jar檔到hdfs ```bash= hdfs dfs -mkdir -p /user/spark/share/jars hdfs dfs -put $SPARK_HOME/jars/* /user/spark/share/jars/ ``` ![](https://i.imgur.com/kyfu3b4.png) 3. 確認jar檔都上傳 ```bash hdfs dfs -ls /user/spark/share/jars | wc -l ``` ![](https://i.imgur.com/DDyxtSP.png) 4. 編輯spark-defaults.conf 的hdfs路徑 ```bash= cp /usr/local/spark/conf/spark-defaults.conf.template /usr/local/spark/conf/spark-defaults.conf nano /usr/local/spark/conf/spark-defaults.conf ``` ![](https://i.imgur.com/1asowvX.png) 5. 跑個pi 檢測一下 ![](https://i.imgur.com/UJycGf3.png) 出現一堆的Not copying就代表成功了 ![](https://i.imgur.com/lGHepEw.png)) 時間減少1秒 --- 6. 使用PySpark shell(**hadoop身份**) 1. 使用Spark的readme當範本測試一下 ![](https://i.imgur.com/mSoTsEH.png) 2. 開啟pyspark shell ```bash= cd $SPARK_HOME ./bin/pyspark --master yarn --deploy-mode client --num-executors 1 --executor-cores 1 ``` ![](https://i.imgur.com/P2v6Go8.png) ![](https://i.imgur.com/3dSZ52L.png) 3. 運行程式看看 ![](https://i.imgur.com/seyBcxi.png) --- 7. 安裝jupter 系列及pyspark 等套件(**管理者身份**) 1. 安裝pyspark 套件 ```bash= pip3 install pyspark ``` 2. 安裝jupter 系列套件 ```bash= pip3 install jupyterlab ``` --- 8. jupyter 系列遠端使用及產生密碼(**一般使用者身份**) 1. 創建jupyter設定檔 ```bash jupyter notebook --generate-config ``` ![](https://i.imgur.com/E1GRhbo.png) 2. 修改設定檔 ```bash nano .jupyter/jupyter_notebook_config.py ``` 3. 將登入網域開成全域 ```bash c.NotebookApp.ip = '0.0.0.0' ``` ![](https://i.imgur.com/YlJI0fJ.png) 4. 產生密碼 ```bash jupyter notebook password ``` ![](https://i.imgur.com/6jj04m4.png) 5. 開啟筆記本或是Lab ```bash jupyter notebook #jupyter lab ``` ![](https://i.imgur.com/2VF72ym.png) **就可以藉由瀏覽器登入** ![](https://i.imgur.com/oBMg1F8.jpg) ![](https://i.imgur.com/pvPGI7l.jpg) *~~或是用手機登入打code...瘋掉拉~~* <Big>恭喜你完成第二階段應用程式安裝~~~</Big> --- <h3 id="ha">叢集高可用性 HA(high availability)架設</h3> :::danger HA並非必要,步驟稍微複雜些,如果電腦效能沒有那麼好請自行斟酌 ::: :warning: 準備事項: 1. 三台Worker電腦當作Journalnodes及ZooKeeper 2. 原本的NameNode電腦多新增一個ResourceManager Stantby 3. 原本的ResourceManager電腦多新增一個NameNode Stantby --- 0. 請先確認叢集均已停止服務 **:information_source: [HA叢集開(關)機程序](#HA)** 1. 新增hdfs-site.xml檔,並SCP到其他台電腦(**hadoop身份**) ```bash nano /usr/local/hadoop/etc/hadoop/hdfs-site.xml ``` ![](https://i.imgur.com/GNS3rEL.png) ```xml= <property> <name>dfs.nameservices</name> <value>nncluster</value> </property> <property> <name>dfs.ha.namenodes.nncluster</name> <value>nn1,nn2</value> </property> <property> <name>dfs.namenode.rpc-address.nncluster.nn1</name> <value>test30.example.org:8020</value> </property> <property> <name>dfs.namenode.http-address.nncluster.nn1</name> <value>test30.example.org:9870</value> </property> <property> <name>dfs.namenode.rpc-address.nncluster.nn2</name> <value>test31.example.org:8020</value> </property> <property> <name>dfs.namenode.http-address.nncluster.nn2</name> <value>test31.example.org:9870</value> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://test32.example.org:8485;test33.example.org:8485;test34.example.org:8485/nncluster</value> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/home/hadoop/journalnode</value> </property> <property> <name>dfs.ha.fencing.methods</name> <value>shell(/bin/true)</value> </property> <property> <name>dfs.client.failover.proxy.provider.nncluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> ``` :information_source: SCP指令範例 ```bash scp /usr/local/hadoop/etc/hadoop/hdfs-site.xml hadoop@test31:/usr/local/hadoop/etc/hadoop ``` ![](https://i.imgur.com/aCEx6Q9.png) 2. 更正core-site.xml檔,並SCP到其他台電腦(**hadoop身份**) ```bash nano /usr/local/hadoop/etc/hadoop/core-site.xml ``` ![](https://i.imgur.com/Azjkjts.png) ```xml= <property> <name>fs.defaultFS</name> <value>hdfs://nncluster</value> </property> ``` 3. 三台電腦(Journalnodes)建立journalnode資料夾(**hadoop身份**) ```bash mkdir ~/journalnode ``` 4. 啟動journalnode,並jps確認(**hadoop身份**) ```bash hdfs --daemon start journalnode ``` ![](https://i.imgur.com/b1kSI1P.png) 5. active NameNode限定(**hadoop身份**) ```bash hdfs namenode -initializeSharedEdits ``` ![](https://i.imgur.com/xW5B5gC.png) ![](https://i.imgur.com/OXOt7UN.png) :warning: **請確認有出現Sucessfully started new epoch 1** :information_desk_person: *如果此叢集是全新未使用過的請先format一下!!!!!* ```bash hdfs namenode -format ``` 6. 啟動第一台NameNode(**hadoop身份**) ```bash hdfs --daemon start namenode ``` ![](https://i.imgur.com/xdJyQFV.png) 7. 第二台NameNode複製metadata(**hadoop身份**) ```bash hdfs namenode -bootstrapStandby ``` ![](https://i.imgur.com/0l6kVnO.png) ![](https://i.imgur.com/O1vrqwg.png) :warning: **請確認有出現has been successfully formatted** 8. 啟動第二台NameNode(**hadoop身份**) ```bash hdfs --daemon start namenode ``` ![](https://i.imgur.com/3KeeCTa.png) 9. 停止全部NameNode再啟動(**hadoop身份**) ```bash= stop-dfs.sh start-dfs.sh ``` ![](https://i.imgur.com/MMinzyz.png) :information_desk_person: **兩台namenode及三台journal node均會一起停止及啟動** 10. 激活第一台NameNode,並檢查狀態(**hadoop身份**) ```bash= hdfs haadmin -transitionToActive nn1 hdfs haadmin -getServiceState nn1 hdfs haadmin -getServiceState nn2 ``` ![](https://i.imgur.com/v1YsD2J.png) ![](https://i.imgur.com/D4V8QSD.png) ![](https://i.imgur.com/UpHbVKb.png) 11. 啟動Yarn(**hadoop身份**) ```bash start-yarn.sh ``` ![](https://i.imgur.com/xWkBrLl.png) 12. 啟動Job history server(**hadoop身份**) ```bash mapred --daemon start historyserver ``` ![](https://i.imgur.com/TVU2ucE.png) 13. 切換一下active Namenode(**hadoop身份**) ```bash= hdfs haadmin -transitionToStandby nn1 hdfs haadmin -getServiceState nn1 hdfs haadmin -getServiceState nn2 hdfs haadmin -transitionToActive nn2 hdfs haadmin -getServiceState nn2 ``` ![](https://i.imgur.com/aJ9SloD.png) ![](https://i.imgur.com/KbRR8DB.png) ![](https://i.imgur.com/wuY18oT.png) 14. 跑個PI測試一下新起Namenode能不能正常運作(**hadoop身份**) ```bash hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar pi 30 100 ``` ![](https://i.imgur.com/nCIQeQS.png) ![](https://i.imgur.com/kS10yNp.png) 15. 下載ZooKeeper並安裝(三台Zookeeper電腦都要)(**管理者身份**) 1. 下載ZooKeeper ```bash wget http://ftp.tc.edu.tw/pub/Apache/zookeeper/zookeeper-3.5.6/apache-zookeeper-3.5.6-bin.tar.gz ``` 2. 解壓縮 ```bash tar -xvf apache-zookeeper-3.5.6-bin.tar.gz -C /usr/local ``` 3. 更名 ```bash mv /usr/local/apache-zookeeper-3.5.6-bin /usr/local/zookeeper ``` 4. 修改擁有者 ```bash chown -R hadoop:hadoop /usr/local/zookeeper ``` 16. 複製zoo_sample.cfg並編輯zoo.cfg(可以SCP到另外兩台)(**hadoop身份**) ```bash= cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg nano /usr/local/zookeeper/conf/zoo.cfg ``` ![](https://i.imgur.com/8xmNuIt.png) ![](https://i.imgur.com/aOTGRb7.png) ```bash= dataDir=/usr/local/zookeeper/zoodata #修改 admin.serverPort=8010 #新增 server.1=test32.example.org:2888:3888 #新增 server.2=test33.example.org:2888:3888 #新增 server.3=test34.example.org:2888:3888 #新增 ``` 17. 修改zkEnv.sh檔(可以SCP到另外兩台)(**hadoop身份**) ```bash= nano /usr/local/zookeeper/bin/zkEnv.sh ``` ![](https://i.imgur.com/ZOYfch7.png) ```bash= #新增 ZOO_LOG_DIR="/usr/local/zookeeper/logs" ZOO_LOG4J_PROP="INFO,ROLLINGFILE" ``` 18. 建立存放LOG資料夾(**hadoop身份**) ```bash= mkdir /usr/local/zookeeper/zoodata echo "1" > /usr/local/zookeeper/zoodata/myid #第一台zookeeper做 echo "2" > /usr/local/zookeeper/zoodata/myid #第二台zookeeper做 echo "3" > /usr/local/zookeeper/zoodata/myid #第三台zookeeper做 ``` :warning: myid請務必要與zoo.cfg設定一樣 ![](https://i.imgur.com/AWlnjAS.png) 19. 修改環境變數(**hadoop身份**) 1. 編輯.bashrc ```bash nano ~/.bashrc ``` 2. 新增環境變數 ```bash= export ZOOKEEPER_HOME=/usr/local/zookeeper export PATH=$PATH:$ZOOKEEPER_HOME/bin ``` ![](https://i.imgur.com/JfKYvX2.png) 3. 載入環境變數 ```bash source ~/.bashrc # . ~/.bashrc ``` 20. 啟動ZooKeeper(三台電腦均要啟動) ```bash= zkServer.sh start zkServer.sh status jps ``` ![](https://i.imgur.com/8U2BwW6.png) :information_desk_person: 只有一台啟動時候,查看狀態會說It is probably not running.代表目前沒有其他zookeeper溝通 21. 依序停止下列服務 ```bash= #停止Historyserver mapred --daemon stop historyserver #停止ResoureManager stop-yarn.sh #停止NameNode stop-dfs.sh ``` 22. 新增hdfs-site.xml,並SCP到其他台電腦(**hadoop身份**) ```bash nano /usr/local/hadoop/etc/hadoop/hdfs-site.xml ``` ![](https://i.imgur.com/Tpppyzd.png) ```xml= <!--新增 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> ``` 23. 新增core-site.xml,並SCP到其他台電腦(**hadoop身份**) ```bash nano /usr/local/hadoop/etc/hadoop/core-site.xml ``` ![](https://i.imgur.com/RwrXFIk.png) ```xml= <!--新增 --> <property> <name>ha.zookeeper.quorum</name> <value>master1.example.org:2181,master2.example.org:2181,master3.example.org:2181</value> </property> ``` 24. NameNode限定(**hadoop身份**) ```bash hdfs zkfc -formatZK ``` ![](https://i.imgur.com/c3X1cZa.png) :information_desk_person: 請確認出現Successfully created /hadoop-ha/nncluster in ZK字樣 25. 啟動NameNode(NameNode限定)(**hadoop身份**) ```bash start-dfs.sh ``` ![](https://i.imgur.com/PXk8Lwq.png) :information_desk_person:將會自動啟動DFSZKFailoverController服務 26. 測試NameNode故障自動轉移(NameNode限定)(**hadoop身份**) ```bash= hdfs --daemon stop namenode hdfs haadmin -getServiceState nn1 hdfs haadmin -getServiceState nn2 ``` ![](https://i.imgur.com/Y6H2Ts4.png) 27. 新增及刪除yarn-site.xml,並SCP到其他台電腦(**hadoop身份**) ![](https://i.imgur.com/2542fsi.png) ```xml= <!--刪除property --> <property> <name>yarn.resourcemanager.hostname</name> <value>test31.example.org</value> </property> <!--新增property --> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <property> <name>yarn.resourcemanager.cluster-id</name> <value>rmcluster</value> </property> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>test31.example.org</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>test30.example.org</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm1</name> <value>test31.example.org:8088</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm2</name> <value>test30.example.org:8088</value> </property> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> <property> <name>yarn.resourcemanager.zk-address</name> <value>test32.example.org:2181,test33.example.org:2181,test34.example.org:2181</value> </property> ``` 28. 依序啟動下列服務(**hadoop身份**) ```bash= #啟動ResoureManager start-yarn.sh #啟動Historyserver mapred --daemon start historyserver ``` 29. 測試ResourceManager故障自動轉移(Resourcemanager限定)(**hadoop身份**) ```bash yarn --daemon stop resourcemanager yarn rmadmin -getServiceState rm1 yarn rmadmin -getServiceState rm2 ``` ![](https://i.imgur.com/FkLwtmR.png) 30. 如果有修改Spark-defaults.conf運行程式載入Jar檔,請記得修訂 ```bash nano /usr/local/spark/conf/spark-defaults.conf ``` ![](https://i.imgur.com/JLblhkX.png) <Big>恭喜你完成最後一階段 高可用性HA(high availability)架設~~~</Big> <h3 id="normal">一般叢集開(關)機程序</h3> 1. 基本叢集開機 ```bash= #NameNode啟動 start-dfs.sh #ResourceManager啟動 start-yarn.sh #Historyserver啟動 mapred --daemon start historyserver ``` 2. 基本叢集關機 ```bash= #Historyserver停止 mapred --daemon stop historyserver #ResourceManager停止 stop-yarn.sh #NameNode停止 stop-dfs.sh ``` <h3 id="HA">HA叢集開(關)機程序</h3> 1. HA叢集開機 ```bash= #ZooKeeper啟動 zkServer.sh start #NameNode啟動 start-dfs.sh #ResourceManager啟動 start-yarn.sh #Historyserver啟動 mapred --daemon start historyserver ``` 2. HA叢集關機 ```bash= #Historyserver停止 mapred --daemon stop historyserver #ResourceManager停止 stop-yarn.sh #NameNode停止 stop-dfs.sh #ZooKeeper停止 zkServer.sh stop ``` <h3 id="shell">Hadoop懶人腳本</h3> 0. [**Hadoop懶人腳本介紹**](https://github.com/JeffWen0105/wen/tree/master/iiiEduBdse/release/hadoop) 1. [叢集一鍵開機](https://github.com/JeffWen0105/wen/blob/master/iiiEduBdse/release/hadoop/hadoopStartBdse12) 2. [叢集一鍵關機](https://github.com/JeffWen0105/wen/blob/master/iiiEduBdse/release/hadoop/hadoopStopBdse12) 3. [叢集狀態檢查](https://github.com/JeffWen0105/wen/blob/master/iiiEduBdse/release/hadoop/nodecheckBdse12) 4. [叢集安全遠端複製](https://github.com/JeffWen0105/wen/blob/master/iiiEduBdse/release/hadoop/safeScpBdse12) 5. [叢集遠端複製](https://github.com/JeffWen0105/wen/blob/master/iiiEduBdse/release/hadoop/scpBdse12)