Spark On Yarn的搭建分爲三個階段,第一個是Zookeeper集羣的搭建,第二是Hadoop集羣的搭建,第三是Spark集羣的搭建。因此如下將按照這三個步驟來給你們進行展現Spark On Yarn徹底分佈式搭建。java
1. jdk-8u65-linux-x64.tar.gznode
2. scala-2.11.0.tgzlinux
3. zookeeper-3.4.7.tar.gzshell
4. hadoop-2.7.1_64bit.tar.gzapache
5. spark-2.0.1-bin-hadoop2.7.tgzbootstrap
這裏將使用六臺服務器進行搭建。分別命名spark0一、spark0二、spark0三、spark0四、spark0五、spark06。vim
首先要解釋,偶數臺服務器並非某個集羣偶數臺,而是三個集羣共用了偶數臺服務器,查看下面的角色分配,你就會明白。瀏覽器
Zookeeper集羣分配三臺。bash
Hadoop分配須要分開說:服務器
首先時HDFS:兩個主節點,三個從節點,5臺。
JN集羣:三臺
Yarn集羣:兩個主節點,三個從節點,5臺。
Spark集羣:三臺。
將以上各個集羣的節點合併,具體分配以下:
spark01:Zookeeper、ResourceManager(active)、NameNode(active)。
spark02:Zookeeper、NameNode(standby)。
spark03:Zookeeper、ResourceManager(standby)。
spark04:JournalNode、DataNode、NodeManager、Spark。
spark05:JournalNode、DataNode、NodeManager、Spark。
spark06:JournalNode、DataNode、NodeManager、Spark。
每臺服務器都要進行以下的配置。
此項配置,是根據本身的需求進行配置,這裏爲了方便搭建,進行了關閉,也能夠進行端口開放,不過比較麻煩。
service iptables status #查看防火牆狀態 service iptables start #當即開啓防火牆,可是重啓後失效。 service iptables stop #當即關閉防火牆,可是重啓後失效。 #重啓後生效 chkconfig iptables on #開啓防火牆,重啓後生效。 chkconfig iptables off #關閉防火牆,重啓後生效。
文件位置:/etc/sysconfig/network
vim /etc/sysconfig/network
!!!!!注意安裝hadoop的集羣主機名不能有下劃線!!否則會找不到主機!沒法啓動!
示例:
source /etc/sysconfig/network
通過上面的修改,主機名稱不會立刻改變,必須重啓才能生效。因此可使用以下命令進行當即更改:
hostname spark01
文件位置:/etc/hosts
vim /etc/hosts
如下爲填入內容示例:
127.0.0.1 localhost ::1 localhost 192.168.234.21 spark01 192.168.234.22 spark02 192.168.234.23 spark03 192.168.234.24 spark04 192.168.234.25 spark05 192.168.234.26 spark06
配置好此文件以後能夠經過遠程命令將配置好的hosts文件scp到其餘5臺節點上,執行命令以下:
scp /etc/hosts spark02: /etc/hosts scp /etc/hosts spark03: /etc/hosts scp /etc/hosts spark04: /etc/hosts scp /etc/hosts spark05: /etc/hosts scp /etc/hosts spark06: /etc/hosts
集羣中全部主機都要互相進行免密登陸,包括本身和本身。
生成密鑰:
ssh-keygen
發送公鑰:
ssh-copy-id root@spark01
此時在遠程主機的/root/.ssh/authorized_keys文件中保存了公鑰,在known_hosts中保存了已知主機信息,當再次訪問的時候就不須要輸入密碼了。
ssh spark01
經過此命令遠程鏈接,檢驗是否能夠不需密碼鏈接。
記得免密登陸必定要給本機發送。
這次集羣數量,互相發送免密登陸的次數爲36次。
將jdk安裝包上傳、解壓安裝包,並改名,命令以下:
tar -zxvf jdk-8u65-linux-x64.tar.gz mv jdk1.8.0_65 jdk1.8
修改/etc/profile。
這個文件是每一個用戶登陸時都會運行的環境變量設置,當用戶第一次登陸時,該文件被執行。並從/etc/profile.d目錄的配置文件中搜集shell的設置。
vim /etc/profile
在文件行尾加入如下內容後保存退出。
JAVA_HOME=/home/software/jdk1.8/ PATH=$PATH:$JAVA_HOME/bin export JAVA_HOME PATH
上傳解壓scala-2.11.0.tgz,並改名,命令以下:
tar -zxvf scala-2.11.0.tgz mv scala-2.11.0 scala2.11
修改/etc/profile。
vim /etc/profile
配置示例:
上圖將Hadoop的環境變量也一塊兒配置了,下面也有Hadoop的環境變量配置。
從新加載profile使配置生效。
source /etc/profile
環境變量配置完成,測試環境變量是否生效。
echo $JAVA_HOME java -version scala
如上兩步操做,操做完一臺以後,能夠進行遠程拷貝,減小工做量。
此示例以spark01節點服務器爲示例。
直接解壓Hadoop壓縮包便可。
如下配置文件均在hadoop-2.7.1/etc/hadoop目錄下。
編輯hadoop-env.sh文件,命令以下:
vim hadoop-env.sh
此文件配置兩項:jdk安裝所在目錄、hadoop配置文件所在目錄。
如圖:
直接編輯core-site.xml文件,命令以下:
vim core-site.xml
此文件配置項內容以下:
<configuration> <!--用來指定hdfs的老大,ns爲固定屬性名,此值能夠本身設置,可是後面的值要和此值對應,表示兩個namenode--> <property> <name>fs.defaultFS</name> <value>hdfs://ns</value> </property> <!--用來指定hadoop運行時產生文件的存放目錄--> <property> <name>hadoop.tmp.dir</name> <value>/home/software/hadoop-2.7.1/tmp</value> </property> <!--執行zookeeper地址--> <property> <name>ha.zookeeper.quorum</name> <value>spark01:2181,spark02:2181,spark03:2181</value> </property> </configuration>
直接編輯hdfs-site.xml文件,命令以下:
vim hdfs-site.xml
配置內容以下:
<configuration> <!--執行hdfs的nameservice爲ns,和core-site.xml保持一致--> <property> <name>dfs.nameservices</name> <value>ns</value> </property> <!--ns下有兩個namenode,分別是nn1,nn2--> <property> <name>dfs.ha.namenodes.ns</name> <value>nn1,nn2</value> </property> <!--nn1的RPC通訊地址--> <property> <name>dfs.namenode.rpc-address.ns.nn1</name> <value>spark01:9000</value> </property> <!--nn1的http通訊地址--> <property> <name>dfs.namenode.http-address.ns.nn1</name> <value>spark01:50070</value> </property> <!--nn2的RPC通訊地址--> <property> <name>dfs.namenode.rpc-address.ns.nn2</name> <value>spark02:9000</value> </property> <!--nn2的http通訊地址--> <property> <name>dfs.namenode.http-address.ns.nn2</name> <value>spark02:50070</value> </property> <!--指定namenode的元數據在JournalNode上的存放位置, 這樣,namenode2能夠從jn集羣裏獲取最新的namenode的信息,達到熱備的效果--> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://spark04:8485;spark05:8485;spark06:8485/ns</value> </property> <!--指定JournalNode存放數據的位置--> <property> <name>dfs.journalnode.edits.dir</name> <value>/home/software/hadoop-2.7.1/journal</value> </property> <!--開啓namenode故障時自動切換--> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!--配置切換的實現方式--> <property> <name>dfs.client.failover.proxy.provider.ns</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!--配置隔離機制--> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <!--配置隔離機制的ssh登陸祕鑰所在的位置--> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> </property> <!--配置namenode數據存放的位置,能夠不配置,若是不配置,默認用的是 core-site.xml裏配置的hadoop.tmp.dir的路徑--> <property> <name>dfs.namenode.name.dir</name> <value>file:///home/software/hadoop-2.7.1/tmp/namenode</value> </property> <!--配置datanode數據存放的位置,能夠不配置,若是不配置,默認用的是 core-site.xml裏配置的hadoop.tmp.dir的路徑--> <property> <name>dfs.datanode.data.dir</name> <value>file:///home/software/hadoop-2.7.1/tmp/datanode</value> </property> <!--配置block副本數量--> <property> <name>dfs.replication</name> <value>3</value> </property> <!--設置hdfs的操做權限,false表示任何用戶均可以在hdfs上操做文件,生產環境不配置此項,默認爲true--> <property> <name>dfs.permissions</name> <value>false</value> </property> </configuration>
須要複製mapred-site.xml.template改名爲mapred-site.xml而後配置,命令以下:
cp mapred-sit.xml.template mapred-site.xml vim mapred-site.xml
配置內容以下:
<configuration> <property> <!--指定mapreduce運行在yarn上--> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
直接編輯yarn-site.xml文件,命令以下:
vim yarn-site.xml
配置內容以下:
<configuration> <!-- 開啓YARN HA --> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!-- 指定兩個resourcemanager的名稱 --> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <!-- 配置rm1,rm2的主機 --> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>spark01</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>spark03</value> </property> <!--開啓yarn恢復機制--> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <!--執行rm恢復機制實現類--> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> <!-- 配置zookeeper的地址 --> <property> <name>yarn.resourcemanager.zk-address</name> <value>spark01:2181,spark02:2181,spark03:2181</value> <description>For multiple zk services, separate them with comma</description> </property> <!-- 指定YARN HA的名稱 --> <property> <name>yarn.resourcemanager.cluster-id</name> <value>yarn-ha</value> </property> <property> <!--指定yarn的老大 resoucemanager的地址--> <name>yarn.resourcemanager.hostname</name> <value>spark03</value> </property> <property> <!--NodeManager獲取數據的方式--> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
直接編輯slaves文件,命令以下:
vim slaves
配置內容以下:
spark04 spark05 spark06
這裏面能夠填寫主機名,也能夠填寫ip地址,建議填寫主機名,根據以上角色分配填寫。
若是在上面已經配置過了,此步驟能夠忽略
配置hadoop的環境變量,命令以下:
vim /etc/profile
內容以下:
JAVA_HOME=/home/software/jdk1.8 HADOOP_HOME=/home/software/hadoop-2.7.1 PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH export JAVA_HOME PATH HADOOP_HOME
Hadoop的環境變量也能夠不配置,可是若是不配置的話,後期命令操做會比較麻煩,須要一直切換目錄。配置了環境變量以後,就能夠在任何目錄下使用Hadoop的命令了。
source /etc/profile
從新加載以後纔會生效。
根據配置文件,建立相關的文件夾,用來存放對應數據。
在hadoop-2.7.1目錄下建立:
①journal目錄。
②建立tmp目錄。
③在tmp目錄下,分別建立namenode目錄和datanode目錄。
命令以下:
#當前所在Hadoop根目錄 mkdir journal mkdir tmp cd tmp/ mkdir namenode mkdir datanode
經過scp 命令,將hadoop安裝目錄遠程copy到其餘5臺機器上。
好比向spark02節點傳輸:
scp -r hadoop-2.7.1 root@spark02:/home/software/hadoop-2.7.1
遠程拷貝以前要先在其餘服務器上建立對應的目錄,不然拷貝失敗。
在Zookeeper安裝目錄的bin目錄下執行:
sh zkServer.sh start
此命令須要在全部的Zookeeper節點服務器上執行,執行完成可使用如下命令查看啓動狀態:
sh zkServer.sh status
如下是查看進程命令:
jps
在zk的leader節點服務器上,Hadoop的bin目錄中執行以下命令:
sh hdfs zkfc -formatZK
這個指令的做用是在zookeeper集羣上生成ha節點(ns節點)。
若是配置了Hadoop的環境變量,那麼在此節點的任何目錄下均可以執行以下命令:
hdfs zkfc -formatZK
在0四、0五、06任意節點服務器上,即分配了journalnode角色的節點服務器上,切換到hadoop安裝目錄的sbin目錄下,執行以下命令:
sh hadoop-daemons.sh start journalnode
注意:此命令執行一次就能夠啓動全部journalnode節點。以下圖,命令使用的是hadoop-daemons.sh,是有s的,啓動的時候必定要注意,不要用錯了命令。
而後執行jps命令查看:
若是此項啓動不成功嘗試重啓,這項啓動不成功會影響下一步的格式化。
在spark01服務器上格式化namenode,執行以下命令:
hadoop namenode -format
在spark01節點上執行以下命令,啓動NameNode節點:
hadoop-daemon.sh start namenode
首先把spark02服務器的 namenode節點變爲standby namenode節點。
執行命令以下:
hdfs namenode -bootstrapStandby
啓動spark02服務器的namenode節點,執行命令以下:
hadoop-daemon.sh start namenode
在spark0四、spark0五、spark06服務器上分別啓動datanode節點,在這三臺服務器上分別執行以下命令:
hadoop-daemon.sh start datanode
FalioverControllerActive是失敗恢復線程。這個線程須要在NameNode節點所在的服務器上啓動,在spark0一、spark02服務器上執行以下命令:
hadoop-daemon.sh start zkfc
在spark01服務器上啓動主Resourcemanager節點,執行以下命令:
start-yarn.sh
啓動成功後,spark0四、spark0五、spark06服務器上的nodemanager 也會跟隨啓動。
在spark03服務器上啓動副 Resoucemanager節點,執行以下命令:
yarn-daemon.sh start resourcemanager
在瀏覽器中輸入地址:http://192.168.234.21:50070,查看namenode的信息,是active狀態的。此ip地址是我在配置的時候使用的ip地址,請不要照搬,要寫本身使用的ip地址。
輸入地址:http://192.168.234.22:50070,查看namenode的信息,是standby狀態。
而後使用kill命令停掉spark01節點的namenode,此時發現standby的namenode變爲active。證實熱備成功。
查看yarn的管理地址
http://192.168.234.21:8088(spark01的8088端口)
在spark0四、spark0五、spark06節點上安裝配置spark。此處以spark04服務器爲例。
直接解壓壓縮包便可。
進入Spark安裝目錄的conf目錄,配置如下文件。
conf目錄下沒有此文件,須要複製模版文件spark-env.sh.template改名,命令以下:
cp spark-env.sh.template spark-env.sh vim spark-env.sh
直接在文件末尾添加,內容示例以下:
export JAVA_HOME=/home/software/jdk1.8 export SCALA_HOME=/home/software/scala2.11 export HADOOP_HOME=/home/software/hadoop-2.7.1 export HADOOP_CONF_DIR=/home/software/hadoop-2.7.1/etc/hadoop
此文件在目錄下也沒有,也須要複製模版文件,改名而後編輯,命令以下:
cp spark-defaults.conf.template spark-defaults.conf vim spark-defaults.conf
直接在文件末尾添加內容,配置示例以下:
spark.yarn.jars=hdfs://spark01:9000/spark_jars/*
此處hdfs的地址須要是active狀態的節點。
此文件在conf目錄下也沒有,一樣須要賦值模版文件,改名而後編輯,命令以下:
cp slaves.template slaves vim slaves
一樣在文件末尾直接添加配置內容便可,配置示例以下:
spark04 spark05 spark06
在HDFS上,建立一個目錄,用來存放spark的依賴jar包。此目錄是spark-defaults.conf目錄中配置的目錄名稱,命令以下:
hadoop fs -mkdir /spark_jars
進入spark安裝目錄的jars目錄,執行:
hadoop fs -put ./* /spark_jars
至此,完成Spark-Yarn的配置。
注意:若是是用虛擬機搭建,可能會因爲虛擬機內存太小而致使啓動失敗,好比內存資源太小,yarn會直接kill掉進程致使rpc鏈接失敗。因此,咱們還須要配置Hadoop的yarn-site.xml文件,加入以下兩項配置:
yarn-site.xml配置示例:
<property> <name>yarn.nodemanager.vmem-check-enabled</name> <value>false</value> </property> <property> <name>yarn.nodemanager.pmem-check-enabled</name> <value>false</value> </property>
此項在生產環境不須要配置。
啓動spark shell,進入Spark安裝目錄的bin目錄,執行以下命令:
sh spark-shell --master yarn-client
能夠經過yarn控制檯來驗證。
至於spark的使用,和以前都是同樣的。只不過資源的分配和管理是交給yarn來控制了。
每每在測試的時候,須要從新啓動集羣服務,在從新啓動的時候,就不須要第一次配置時那麼麻煩,能夠按照以下步驟進行重啓集羣服務。
在Zookeeper安裝目錄的bin目錄下執行:
sh zkServer.sh start
此命令一樣須要在全部的Zookeeper節點服務器上執行。
進入hadoop安裝目錄的sbin目錄,執行以下命令:
start-dfs.sh
此命令會將HDFS相關的全部節點都啓動,不須要切換服務器來進行單獨啓動HDFS相關的節點進程。
在spark01服務器上啓動主Resourcemanager節點,執行以下命令:
start-yarn.sh
啓動成功後,spark0四、spark0五、spark06服務器上的nodemanager 也會跟隨啓動。
在spark03服務器上啓動副 Resoucemanager節點,執行以下命令:
yarn-daemon.sh start resourcemanager
啓動spark shell,進入Spark安裝目錄的bin目錄,執行以下命令:
sh spark-shell --master yarn-client
這樣啓動,比第一次配置的完成啓動簡單了不少。
上一篇:Spark簡介及徹底分佈式安裝
下一篇:Spark框架核心概念