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啟動叢集