Spark On Yarn徹底分佈式搭建

Spark On Yarn徹底分佈式搭建

    Spark On Yarn的搭建分爲三個階段,第一個是Zookeeper集羣的搭建,第二是Hadoop集羣的搭建,第三是Spark集羣的搭建。因此如下將按照這三個步驟來給你們進行展現Spark On Yarn徹底分佈式搭建。java

1、準備

一、軟件及版本

    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

    首先要解釋,偶數臺服務器並非某個集羣偶數臺,而是三個集羣共用了偶數臺服務器,查看下面的角色分配,你就會明白。瀏覽器

1.角色分配

    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。

2.服務器設置

    每臺服務器都要進行以下的配置。

1>關閉防火牆

    此項配置,是根據本身的需求進行配置,這裏爲了方便搭建,進行了關閉,也能夠進行端口開放,不過比較麻煩。

service iptables status #查看防火牆狀態
service iptables start #當即開啓防火牆,可是重啓後失效。
service iptables stop #當即關閉防火牆,可是重啓後失效。
#重啓後生效
chkconfig iptables on #開啓防火牆,重啓後生效。
chkconfig iptables off #關閉防火牆,重啓後生效。

2>配置主機名

    文件位置:/etc/sysconfig/network

vim /etc/sysconfig/network

    !!!!!注意安裝hadoop的集羣主機名不能有下劃線!!否則會找不到主機!沒法啓動!

示例:

 

source /etc/sysconfig/network

    通過上面的修改,主機名稱不會立刻改變,必須重啓才能生效。因此可使用以下命令進行當即更改:

hostname spark01

3>配置hosts

    文件位置:/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

4>配置免密登陸

    集羣中全部主機都要互相進行免密登陸,包括本身和本身。

    生成密鑰:

ssh-keygen

    發送公鑰:

ssh-copy-id root@spark01

    此時在遠程主機的/root/.ssh/authorized_keys文件中保存了公鑰,在known_hosts中保存了已知主機信息,當再次訪問的時候就不須要輸入密碼了。

ssh spark01

    經過此命令遠程鏈接,檢驗是否能夠不需密碼鏈接。

    記得免密登陸必定要給本機發送。

    這次集羣數量,互相發送免密登陸的次數爲36次。

3.安裝jdk

1>解壓安裝

    將jdk安裝包上傳、解壓安裝包,並改名,命令以下:

tar -zxvf jdk-8u65-linux-x64.tar.gz
mv jdk1.8.0_65 jdk1.8

2>配置環境變量

    修改/etc/profile。

    這個文件是每一個用戶登陸時都會運行的環境變量設置,當用戶第一次登陸時,該文件被執行。並從/etc/profile.d目錄的配置文件中搜集shell的設置。

vim /etc/profile

    在文件行尾加入如下內容後保存退出。

JAVA_HOME=/home/software/jdk1.8/
PATH=$PATH:$JAVA_HOME/bin
export JAVA_HOME PATH

4.安裝Scala

1>解壓安裝

    上傳解壓scala-2.11.0.tgz,並改名,命令以下:

tar -zxvf scala-2.11.0.tgz
mv scala-2.11.0 scala2.11

2>配置環境變量

修改/etc/profile。

vim /etc/profile

    配置示例:

    上圖將Hadoop的環境變量也一塊兒配置了,下面也有Hadoop的環境變量配置。

3>從新加載

    從新加載profile使配置生效。

source /etc/profile

    環境變量配置完成,測試環境變量是否生效。

echo $JAVA_HOME
java -version
scala

    如上兩步操做,操做完一臺以後,能夠進行遠程拷貝,減小工做量。

2、Zookeeper徹底分佈式搭建

    參見:Zookeeper集羣的搭建

3、Hadoop2.0 HA集羣搭建步驟

    此示例以spark01節點服務器爲示例。

一、安裝

    直接解壓Hadoop壓縮包便可。

二、配置

    如下配置文件均在hadoop-2.7.1/etc/hadoop目錄下。

1.hadoop-env.sh

    編輯hadoop-env.sh文件,命令以下:

vim hadoop-env.sh

    此文件配置兩項:jdk安裝所在目錄、hadoop配置文件所在目錄。

    如圖:

 

2.core-site.xml

    直接編輯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>

3.hdfs-site.xml

    直接編輯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>

4.mapred-site.xml

    須要複製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>

5.yarn-site.xml

    直接編輯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>

6.slaves

    直接編輯slaves文件,命令以下:

vim slaves

    配置內容以下:

spark04
spark05
spark06

    這裏面能夠填寫主機名,也能夠填寫ip地址,建議填寫主機名,根據以上角色分配填寫。

三、環境變量

    若是在上面已經配置過了,此步驟能夠忽略

1.配置環境變量

    配置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的命令了。

2.從新加載

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

    遠程拷貝以前要先在其餘服務器上建立對應的目錄,不然拷貝失敗。

六、Hadoop集羣啓動

1.啓動zookeeper集羣

    在Zookeeper安裝目錄的bin目錄下執行:

sh zkServer.sh start

    此命令須要在全部的Zookeeper節點服務器上執行,執行完成可使用如下命令查看啓動狀態:

sh zkServer.sh status

    如下是查看進程命令:

jps

2.格式化zookeeper

    在zk的leader節點服務器上,Hadoop的bin目錄中執行以下命令:

sh hdfs zkfc -formatZK

    這個指令的做用是在zookeeper集羣上生成ha節點(ns節點)。

    若是配置了Hadoop的環境變量,那麼在此節點的任何目錄下均可以執行以下命令:

hdfs zkfc -formatZK

 

3.啓動journalnode集羣

    在0四、0五、06任意節點服務器上,即分配了journalnode角色的節點服務器上,切換到hadoop安裝目錄的sbin目錄下,執行以下命令:

sh hadoop-daemons.sh start journalnode

    注意:此命令執行一次就能夠啓動全部journalnode節點。以下圖,命令使用的是hadoop-daemons.sh,是有s的,啓動的時候必定要注意,不要用錯了命令。

    而後執行jps命令查看:

    若是此項啓動不成功嘗試重啓,這項啓動不成功會影響下一步的格式化。

4.格式化NameNode

    在spark01服務器上格式化namenode,執行以下命令:

hadoop namenode -format

5.啓動NameNode

1>spark01服務器

    在spark01節點上執行以下命令,啓動NameNode節點:

hadoop-daemon.sh start namenode

 

2>spark02服務器

    首先把spark02服務器的 namenode節點變爲standby namenode節點。

    執行命令以下:

hdfs namenode -bootstrapStandby

 

    啓動spark02服務器的namenode節點,執行命令以下:

hadoop-daemon.sh start namenode

6.啓動DataNode

    在spark0四、spark0五、spark06服務器上分別啓動datanode節點,在這三臺服務器上分別執行以下命令:

hadoop-daemon.sh start datanode

7.啓動zkfc

    FalioverControllerActive是失敗恢復線程。這個線程須要在NameNode節點所在的服務器上啓動,在spark0一、spark02服務器上執行以下命令:

hadoop-daemon.sh start zkfc

 

8.啓動Resourcemanager

1>spark01服務器

    在spark01服務器上啓動主Resourcemanager節點,執行以下命令:

start-yarn.sh

    啓動成功後,spark0四、spark0五、spark06服務器上的nodemanager 也會跟隨啓動。

2>spark03服務器

    在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端口)

 

4、Spark On Yarn搭建

一、安裝

    在spark0四、spark0五、spark06節點上安裝配置spark。此處以spark04服務器爲例。

    直接解壓壓縮包便可。

二、配置

    進入Spark安裝目錄的conf目錄,配置如下文件。

1.spark-env.sh

    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

2.spark-defaults.conf

    此文件在目錄下也沒有,也須要複製模版文件,改名而後編輯,命令以下:

cp spark-defaults.conf.template spark-defaults.conf
vim spark-defaults.conf

    直接在文件末尾添加內容,配置示例以下:

spark.yarn.jars=hdfs://spark01:9000/spark_jars/*

    此處hdfs的地址須要是active狀態的節點。

 

3.slaves

    此文件在conf目錄下也沒有,一樣須要賦值模版文件,改名而後編輯,命令以下:

cp slaves.template slaves
vim slaves

    一樣在文件末尾直接添加配置內容便可,配置示例以下:

spark04
spark05
spark06

三、上傳jar包

    在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>

    此項在生產環境不須要配置。

四、啓動

1.啓動spark shell

    啓動spark shell,進入Spark安裝目錄的bin目錄,執行以下命令:

sh spark-shell --master yarn-client

2.測試

    能夠經過yarn控制檯來驗證。

    至於spark的使用,和以前都是同樣的。只不過資源的分配和管理是交給yarn來控制了。

5、重啓集羣

    每每在測試的時候,須要從新啓動集羣服務,在從新啓動的時候,就不須要第一次配置時那麼麻煩,能夠按照以下步驟進行重啓集羣服務。

一、啓動zookeeper集羣

    在Zookeeper安裝目錄的bin目錄下執行:

sh zkServer.sh start

    此命令一樣須要在全部的Zookeeper節點服務器上執行。

二、啓動Hadoop集羣

1.啓動HDFS

    進入hadoop安裝目錄的sbin目錄,執行以下命令:

start-dfs.sh

    此命令會將HDFS相關的全部節點都啓動,不須要切換服務器來進行單獨啓動HDFS相關的節點進程。

2.啓動Yarn

1>spark01服務器

    在spark01服務器上啓動主Resourcemanager節點,執行以下命令:

start-yarn.sh

    啓動成功後,spark0四、spark0五、spark06服務器上的nodemanager 也會跟隨啓動。

2>spark03服務器

    在spark03服務器上啓動副 Resoucemanager節點,執行以下命令:

yarn-daemon.sh start resourcemanager

 

三、啓動spark shell

    啓動spark shell,進入Spark安裝目錄的bin目錄,執行以下命令:

sh spark-shell --master yarn-client

    這樣啓動,比第一次配置的完成啓動簡單了不少。

上一篇:Spark簡介及徹底分佈式安裝

下一篇:Spark框架核心概念

相關文章
相關標籤/搜索