1. 程式人生 > >Spark的部署及使用:2.hadoop+spark的HA搭建

Spark的部署及使用:2.hadoop+spark的HA搭建

    上章中,完全分散式叢集僅對namenode做了備份,並未對resourcemanager做備份,切不能自動切換主備,在生產環境中是十分危險的,本章將介紹一種HA的spark分散式計算叢集的搭建方式。

一、安裝前的準備

     (1) jdk1.8.0_171.zip

     (2)scala-2.11.1.tgz

     (3)zookeeper-3.4.10.tar.gz

     (4)hadoop-3.0.3.tar.gz

     (5)spark-2.3.1-bin-hadoop2.7.tgz

   伺服器準備及角色規劃:

   10.10.10.1   spark01    namenode(active)  resourcemanager(active)  zookeeper

   10.10.10.2   spark02    namenode(standby)  zookeeper

   10.10.10.3   spark03    resourcemanager(standby) zookeeper

   10.10.10.4   spark04    datanode  worker  journalnode   nodemanager

   10.10.10.5   spark05    datanode worker   journalnode nodemanager

   10.10.10.6   spark06    datanode worker journalnode nodemanager

二、配置hosts和SSH免密碼登陸

     參考上節內容

三、安裝JDK、SCALA

     參考上節內容

四、搭建zookeeper叢集

        解壓zookeeper 至使用者目錄(./usr/local/zookeeper) ,

       進入/usr/local/zookeeper/conf目錄下

cp zoo-sample.cfg  zoo.cfg

vim zook.cfg

#加入以下配置
#zookeeper資料存放位置
dataDir=/usr/local/zookeeper/datadir
#zookeeper日誌存放位置
dataLogDir=/usr/local/zookeeper/datalogdir

#2888原子廣播埠,3888選舉埠,zookeeper有幾個節點,就配置幾個server。
server.1=spark01:2888:3888
server.2=spark02:2888:3888
server.3=spark03:2888:3888

      建立zookeeper資料檔案路徑,並執行如下操作:

mkdir -p /usr/local/zookeeper/datadir

cd /usr/local/zookeeper/datadir

vim myid

1

      設定當前伺服器在zookeeper叢集中的編號

將zookeeper傳送到其他兩臺伺服器上,並修改myid編號:

scp -r /usr/local/zookeeper  [email protected]:/usr/local/
scp -r /usr/local/zookeeper  [email protected]:/usr/local/


#修改spark02的myid為2,spark03的myid為3

並分別配置環境變數ZOOKEEPER_HOME:

export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$PATH:$ZOOKEEPER/bin

啟動zookeeper叢集,在三臺伺服器上分別執行:

/usr/local/zookeeper/bin/zkServer.sh start

#使用下面的命令查詢zkServer狀態
/usr/local/zookeeper/bin/zkServer.sh status

五、hadoop HA叢集搭建

    解壓hadoop檔案至使用者目錄(/usr/local/hadoop)

   進入目錄/usr/local/hadoop/etc/hadoop

   修改檔案hadoop-env.sh

vim hadoop-env.sh

export JAVA_HOME=/usr/local/java
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native 
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop 
export HADOOP_LIBEXEC_DIR=$HADOOP_HOME/libexec 
export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH 


  
export HDFS_DATANODE_USER=root
export HDFS_DATANODE_SECURE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export HDFS_NAMENODE_USER=root 

修改core-site.xml檔案

vim core-site.xml

<configuration>
 <!--ns為在hdfs-site.xml中定義的名稱節點別名-->
  <property>
     <name>fs.defaultFS</name>
     <value>hdfs://ns</value>
  </property>
 <property>
<!--用來指定hadoop執行時產生檔案的存放目錄-->
     <name>hadoop.tmp.dir</name>
     <value>/usr/local/hadoop/tmp</value>
  </property>
 <property>
     <!--zookeeper叢集地址-->
     <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>/usr/local/hadoop/journaldata</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:///usr/local/hadoop/tmp/namenode</value>
</property>
<!--配置datanode資料存放的位置,可以不配置,如果不配置,預設用的是
          core-site.xml裡配置的hadoop.tmp.dir的路徑-->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///usr/local/hadoop/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

vim mapred-site.xml


<configuration>
<property>
<!--指定mapreduce執行在yarn上-->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
 <property>
        <name>mapreduce.application.classpath</name>
        <value>
            /usr/local/hadoop/etc/hadoop,
            /usr/local/hadoop/share/hadoop/common/*,
            /usr/local/hadoop/share/hadoop/common/lib/*,
            /usr/local/hadoop/share/hadoop/hdfs/*,
            /usr/local/hadoop/share/hadoop/hdfs/lib/*,
            /usr/local/hadoop/share/hadoop/mapreduce/*,
            /usr/local/hadoop/share/hadoop/mapreduce/lib/*,
            /usr/local/hadoop/share/hadoop/yarn/*,
            /usr/local/hadoop/share/hadoop/yarn/lib/*
        </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檔案(3.0以後為workers檔案)

spark04
spark05
spark06

配置環境變數

vim /etc/profile

export HADOOP_HOME=/usr/local/hadoop
export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

建立配置檔案中定義的資料夾

mkdir -p /usr/local/hadoop/tmp
mkdir -p /usr/local/hadoop/journaldata
mkdir -p /usr/local/hadoop/tmp/namenode
mkdir -p /usr/local/hadoop/tmp/datanode

拷貝檔案至其他五臺伺服器上,

然後執行如下命令啟動叢集

<!--首先啟動zookeeper叢集,在三臺伺服器上分別執行-->
zkServer.sh start
<!--在leader伺服器上執行如下命令,在zookeeper叢集上生成ha節點-->
hdfs zkfc -formatZK
<!在spark04、spark05、spark06任意一臺伺服器上執行如下命令,啟動journalnode叢集-->
hadoop-daemons.sh start journalnode
<!--在spark01上格式化名稱節點,並啟動-->
hadoop namenode -format
hadoop-daemon.sh start namenode
<!--在spark02上首先把namenode變為standby namenode,再啟動-->
hdfs namenode -bootstrapStandby
hadoop-daemon.sh start namenode
<!--在spark04、spark05、spark06上分別啟動datanode-->
hadoop-daemon.sh start datanode
<!--啟動zookeeper失敗恢復執行緒,這個執行緒需要在名稱節點上啟動即spark01、spark02-->
hadoop-daemon.sh start zkfc
<!--在spark01上啟動主resourcemanager-->
start-yarn.sh
<!--在spark03上啟動備resourcemanager-->
yarn-daemon.sh start resourcemanager

六、spark叢集搭建

 解壓spark至使用者目錄(/usr/local/spark)

進入/usr/local/spark/conf

修改spark-env.sh

export JAVA_HOME=/usr/local/spark
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop
export SPARK_HOME=/usr/local/spark

修改slaves檔案

spark04
spark05
spark06

複製$HADOOP_CONF_DIR目錄下hdfs-site.xml檔案和core-site.xml檔案至$SPARK_HOME/conf目錄下

spark叢集搭建完成

執行spark-shell  --mater  yarn驗證

七、重啟叢集

在spark01,spark02,spark03上分別執行zkServer.sh start 啟動zk叢集

在spark01上執行start-all.sh啟動叢集