Hadoop、Spark——完全分布式HA集群搭建


 

前言

完全分布式就是把Hadoop核心組件分開部署到不同的服務器節點上運行。

通常,建議HDFS和YARN以單獨的用戶身份運行。在大多數安裝中,HDFS進程以“hdfs”執行。YARN通常使用“yarn”帳戶。

搭建分為四個階段,每一個是環境准備,第二個是Zookeeper集群的搭建,第三是Hadoop集群的搭建,第四是Spark集群的搭建。

 

一、准備

1、軟件及版本

  • centOS-6.5
  • jdk-8u65-linux-x64.tar.gz
  • scala-2.11.11.tgz
  • zookeeper-3.4.7.tar.gz
  • hadoop-2.7.3_64bit.tar.gz
  • spark-2.3.3-bin-hadoop2.7.tgz

2、服務器

這里將使用六台服務器進行搭建。分別命名spark01、spark02、spark03、spark04、spark05、spark06。

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

  • 角色分配

Zookeeper集群分配三台。

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

示例:

source /etc/sysconfig/network

經過上面的修改,主機名稱不會馬上改變,必須重啟才能生效。所以可以使用如下命令進行立即更改:

hostname spark01
    • 配置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
    • 配置免密登錄

集群中所有主機都要互相進行免密登錄,包括自己和自己。

生成密鑰:

ssh-keygen

發送公鑰:

ssh-copy-id root@spark01

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

通過以下命令遠程連接,檢驗是否可以不需密碼連接:

ssh spark01

記得免密登錄一定要給本機發送。

此次集群數量,互相發送免密登錄的次數為36次。

  • 安裝Jdk

1、將jdk安裝包上傳、解壓安裝包,並更名,命令如下:

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

2、修改/etc/profile, 在文件行尾加入以下內容后保存退出。

JAVA_HOME=/home/software/jdk1.8/
PATH=$PATH:$JAVA_HOME/bin
export JAVA_HOME PATH
  • 安裝Scala

1、上傳解壓scala-2.11.0.tgz,並更名,命令如下:

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

2、修改/etc/profile,配置如下:

注:上圖將Hadoop的環境變量也一起配置了,下面也有Hadoop的環境變量配置。

3、重新加載profile使配置生效:

source /etc/profile

 

二、Zookeeper完全分布式搭建

參見:Zookeeper集群的搭建

 

三、Hadoop2.0 HA集群搭建步驟

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

1、安裝

直接解壓Hadoop壓縮包即可。

2、配置

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

  • hadoop-env.sh

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

vim hadoop-env.sh

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

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

<!--指定yarn的老大 resoucemanager的地址--> <property>   <name>yarn.resourcemanager.hostname</name>   <value>spark03</value> </property>

<!--NodeManager獲取數據的方式--> <property>   <name>yarn.nodemanager.aux-services</name>   <value>mapreduce_shuffle</value> </property>

 <!--開啟日志聚合-->
  <property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
  </property>

 <!--日志在HDFS上最多保存多長時間-->
  <property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>106800</value>
  </property>

</configuration>
  • slaves

slaves文件是指定HDFS上有哪些DataNode節點。

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

vim slaves

配置內容如下:

spark04
spark05
spark06

3、環境變量

如果在上面已經配置過了,此步驟可以忽略。

配置hadoop的環境變量,命令如下:

vim /etc/profile

內容如下:

JAVA_HOME=/home/software/jdk1.8
HADOOP_HOME=/home/software/hadoop-2.7.3
PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
export JAVA_HOME PATH HADOOP_HOME

重新加載:

source /etc/profile

4、創建文件夾

根據配置文件,創建相關的文件夾,用來存放對應數據。

在hadoop-2.7.1目錄下創建:

  • journal目錄。
  • 創建tmp目錄。
  • 在tmp目錄下,分別創建namenode目錄和datanode目錄。

命令如下:

#當前所在Hadoop根目錄
mkdir journal
mkdir tmp
cd tmp/
mkdir namenode
mkdir datanode

5、拷貝文件

通過scp 命令,將hadoop安裝目錄遠程copy到其他5台機器上。

比如向spark02節點傳輸:

scp -r hadoop-2.7.1  root@spark02:/home/software/hadoop-2.7.1

遠程拷貝之前要先在其他服務器上創建對應的目錄,否則拷貝失敗。

6、Hadoop集群啟動

  • 啟動zookeeper集群

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

zkServer.sh start

此命令需要在所有的Zookeeper節點服務器上執行,執行完成可以使用以下命令查看啟動狀態:

zkServer.sh status

以下是查看進程命令:

jps
  • 格式化zkfc

zkfc用來做兩個namenode的狀態切換管理或者失敗切換管理。

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

sh hdfs zkfc -formatZK

如果配置了Hadoop的環境變量,那么在此節點的任何目錄下都可以執行,這個指令的作用是在zookeeper集群上生成ha節點(ns節點)。

格式化以后會在Zookeeper寫一些東西,現在可以看一下去(master節點):

  • 啟動journalnode集群

為hadoop提供元數據管理(edits)。在04、05、06任意節點服務器上,即分配了journalnode角色的節點服務器上,切換到hadoop安裝目錄的sbin目錄下,執行如下命令:

hadoop-daemons.sh start journalnode

注意:1、第一次需要手動起,以后就不需要手動啟動了,就包含在了start-dfs.sh腳本里面了;

           2、此命令執行一次就可以啟動所有journalnode節點。如下圖,命令使用的是hadoop-daemons.sh,是有s的,啟動的時候一定要注意,不要用錯了命令。

然后執行jps命令查看,如果此項啟動不成功嘗試重啟,這項啟動不成功會影響下一步的格式化。

  • 格式化NameNode

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

hadoop namenode -format
  • 啟動NameNode
    • spark01服務器

在spark01節點上執行如下命令,啟動NameNode節點:

hadoop-daemon.sh start namenode
    • spark02服務器

首先把spark02服務器的 namenode節點變為standby namenode節點,執行命令如下:

hdfs namenode -bootstrapStandby

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

hadoop-daemon.sh start namenode
  • 啟動DataNode

在spark04、spark05、spark06服務器上分別啟動datanode節點,在這三台服務器上分別執行如下命令:

hadoop-daemon.sh start datanode
  • 啟動zkfc

FalioverControllerActive是失敗恢復線程。這個線程需要在NameNode節點所在的服務器上啟動,在spark01、spark02服務器上執行如下命令:

hadoop-daemon.sh start zkfc
  • 啟動Resourcemanager
    • spark01服務器

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

start-yarn.sh

 啟動成功后,spark04、spark05、spark06服務器上的nodemanager 也會跟隨啟動。

    • spark03服務器

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

yarn-daemon.sh start resourcemanager

7、測試

在瀏覽器中輸入地址: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端口)

 

四、Spark On Yarn搭建

1、安裝

    在spark04、spark05、spark06節點上安裝配置spark。此處以spark04服務器為例。

    直接解壓壓縮包即可。

2、配置

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

  • 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
  • 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狀態的節點。

  • slaves

此文件在conf目錄下也沒有,同樣需要賦值模版文件,更名然后編輯,命令如下:

cp slaves.template slaves
vim slaves

同樣在文件末尾直接添加配置內容即可,配置示例如下:

spark04
spark05
spark06
  • yarn-site.xml

如果是用虛擬機搭建,可能會由於虛擬機內存過小而導致啟動失敗,比如內存資源過小,yarn會直接kill掉進程導致rpc連接失敗。

所以,我們還需要配置Hadoop的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>

3、上傳jar包

在HDFS上,創建一個目錄,用來存放spark的依賴jar包。此目錄是spark-defaults.conf目錄中配置的目錄名稱,命令如下:

hadoop fs -mkdir /spark_jars

進入spark安裝目錄的jars目錄,執行:

hadoop fs -put ./* /spark_jars

至此,完成Spark-Yarn的配置。

4、啟動

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

spark-shell --master yarn-client

可以通過yarn控制台來驗證:

 

五、重啟集群

往往在測試的時候,需要重新啟動集群服務,在重新啟動的時候,就不需要第一次配置時那么麻煩,可以按照如下步驟進行重啟集群服務。

1、啟動zookeeper集群

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

sh zkServer.sh start

此命令同樣需要在所有的Zookeeper節點服務器上執行。

2、啟動Hadoop集群

  • 啟動HDFS

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

start-dfs.sh

此命令會將HDFS相關的所有節點都啟動,不需要切換服務器來進行單獨啟動HDFS相關的節點進程。

  • 啟動Yarn

    • spark01服務器

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

start-yarn.sh

啟動成功后,spark04、spark05、spark06服務器上的nodemanager 也會跟隨啟動。

    • spark03服務器

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

yarn-daemon.sh start resourcemanager

3、啟動spark shell

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

sh spark-shell --master yarn-client

 

 

引用:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM