您好,登錄后才能下訂單哦!
本篇內容主要講解“Spark HA的部署方案”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Spark HA的部署方案”吧!
目錄
一、 準備服務器環境
1.1、服務器規劃
1.2、軟件版本
二、安裝ZooKeeper Cluster
三、安裝Hadoop2 HA Cluster
四、安裝HBase HA Cluster
五、安裝Spark HA Cluster步驟
5.1、初始化配置
5.2、安裝Spark
5.3配置環境變量(需要切換Root命令執行,執行完畢后一定記著切換到普通用戶)
5.3.1修改系統環境變量(追加)
5.3.2修改spark的環境變量
5.3.3修改從節點
5.4安裝其他集群機器
5.5啟動spark
5.6啟動HA方式
5.7檢查是否啟動
5.8發布停止Dirver
5.9、啟動關閉Driver的歷史監控
5.10、hive on Spark配置
六、相關參數說明
***********************************************************************************
一、準備服務器環境
1.1、服務器規劃
ZooKeeper Cluster | |
Host | IP |
zookeeper1 | 192.168.50.228 |
zookeeper2 | 192.168.50.229 |
zookeeper3 | 192.168.50.230 |
Spark HA Cluster | |||
HOST | IP | Master | Worker |
nn1 | 192.168.50.221 | Y | N |
nn2 | 192.168.50.222 | Y | N |
dn1 | 192.168.50.225 | N | Y |
dn2 | 192.168.50.226 | N | Y |
dn3 | 192.168.50.227 | N | Y |
1.2、軟件版本
Linux: CentOS2.6.32-431.el6.x86_64
Hadoop:2.6.0
ZooKeeper:3.4.6
JDK/JRE: 1.7.0_75 (64bit)
spark-1.3.0-bin-hadoop2.4
二、安裝ZooKeeper Cluster參考《Zookeeper部署文檔_V1.0》
Spark依賴ZooKeeper做選舉,故需要先部署ZooKeeper
三、安裝Hadoop2 HA Cluster參考《Hadoop2 HA集群部署V1.0》
Spark獨立模式,可以不使用HDFS,如果有yarn的集群分發則需要部署
四、安裝HBase HA Cluster參考《HBase HA部署文檔V1.0》
Spark如果不存儲數據到HBase,可以不做部署
5.1、初始化配置
1、修改主機名稱第一步臨時修改
#hostname nn1
第二步修改永久修改,防止下次重啟后被重置
修改/etc/sysconfig/network中的hostname
NETWORKING=yes
HOSTNAME= nn1
第三步做DNS映射,可以直接訪問主機名則訪問的部本機IP地址
修改/etc/hosts文件
在最后增加一行,如
192.168.50.221 nn1
第四步重啟電腦
重啟后,ping nn1
如果能ping成功則配置完成
其他機器依次配置即可
2、關閉防火墻命令:service iptables stop
同時關閉防火墻自啟動服務:chkconfig iptables off
查看是否關閉了自啟動:chkconfig --list | grep iptables ,如果全部是off則表示都關閉了
查看狀態:service iptables status
# service iptables status
Firewall is stopped.
3、創建應用帳戶和組(可選,建議新建一個專門的用戶)
為了系統安全建議每個對外應用都創建單獨的帳戶和組,具體創建方法請網上搜索。
#新建組
[root@nn2 ~]# groupadd bdata
#添加用戶和分組
[root@nn2 ~]# useradd -g bdata bdata
#設置密碼
[root@nn2 ~]# passwd bdata
Changing password for user bdata.
New password:
BAD PASSWORD: it does not contain enough DIFFERENT characters
BAD PASSWORD: is a palindrome
Retype new password:
passwd: all authentication tokens updated successfully.
4、設置ssh
修改/etc/ssh/sshd_config root帳戶修改
#vim /etc/ssh/sshd_config
取消如下注釋
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
修改后,重啟ssh: service sshd restart
切換到普通用戶下進行設置
生成SSH通訊密鑰,有這個證書后,hadoop啟動時就可以免密碼登錄了
a、先在每臺機器上面執行ssh-keygen -t rsa -P "",密碼都為空,主要是每次hadoop啟動時需要認證,如果有密碼每次都需要輸入,實在麻煩,所以密碼留空,回車即可,執行后,將產生兩個文件,位于~/.ssh文件夾中
b、然后相互執行 ssh-copy-id userName@machineName,此功能可以快速把自己的公鑰發給對方,并自動追加
[root@nn1 ~]# ssh nn1
進入后,exit退出SSH即可
這里注意,有時候還是需要你輸入密碼,這里有可能是authorized_keys的權限問題,我們進一步設置權限,chmod 600 authorized_keys即可
如果對于其他計算機則需要把你的公鑰發送給對方,你就可以無密碼登錄了,認證了
5、安裝JDK/JRE
Spark是使用Scala語言開發的軟件,所以必須要安裝JRE或JDK才可以運行,為了測試方便建議安裝JDK(生產環境安裝JRE即可),JDK安裝步驟(略)
5.2、安裝Spark下載地址:
http://mirrors.cnnic.cn/apache/spark/spark-1.3.0/spark-1.3.0-bin-hadoop2.4.tgz
由于spark基于scale寫的,故需要scale庫
下載地址:
http://downloads.typesafe.com/scala/2.10.5/scala-2.10.5.tgz?_ga=1.126203213.1556481652.1427182777
5.3、配置環境變量(需要切換Root命令執行,執行完畢后一定記著切換到普通用戶)
5.3.1、修改系統環境變量(追加)
#vim /etc/profile
export JAVA_HOME=/home/utoken/software/jdk1.7.0_75
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export SCALA_HOME=/home/utoken/software/scala-2.10.5
export SPARK_HOME=/home/utoken/software/spark-1.3.0-bin-hadoop2.4
export PATH=$PATH:$JAVA_HOME/bin: $SCALA_HOME/bin:$SPARK_HOME/bin
5.3.2、修改spark的環境變量
5.3.2.1、修改Spark的環境變量配置文件
#vim spark-env.sh
#導入spark運行的環境變量
export JAVA_HOME=/home/utoken/software/jdk1.7.0_75
#關于這里為什么需要配置環境變量的解釋:雖然我們在所有機器都配置了環境變量(~/.bash_profile),但start-all.sh是通過ssh登錄slave機器,然后啟動spark worker進程的,所以~/.base_profile必須是用戶登錄后才會執行,ssh登錄是non-login登錄不會觸發.base_profile的執行,所以啟動時worker機器會找不到JAVA_HOME,解決辦法:把環境變更在復制一份到.baserc配置中,這個環境變量是在啟動shell腳本時執行的
#如果是多Master的情況下,不能定義Spark_Master_IP的屬性,否則無法啟動多個Master,這個屬性的定義可以在Application中定義
#export SPARK_MASTER_IP=nn1
#指定每個Worker需要的內存大小(全局)
export SPARK_WORKER_MEMORY=5g
#Spark的一直執行任務的文件
export SPARK_WORK_DIR=/home/utoken/datadir/spark/work
#Spark進行shuffle等的一些小文件,臨時文件,可以觀察打開的句柄數
export SPARK_LOCAL_DIRS=/home/utoken/datadir/spark/tmp
#采用Zookeeper保證HA,導入相應的環境變量
export SPARK_DAEMON_JAVA_OPTS="-Dsun.io.serialization.extendedDebugInfo=true -Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=zookeeper1:2181,zookeeper2:2181,zookeeper3:2181 -Dspark.deploy.zookeeper.dir=/spark"
或者采用另一種導入方式
#指定Spark恢復模式,這里采用Zookeeper模式,默認為NONE
export -Dspark.deploy.recoveryMode=ZOOKEEPER
export -Dspark.deploy.zookeeper.url=zookeeper1:2181,zookeeper2:2181,zookeeper3:2181
export -Dspark.deploy.zookeeper.dir=/spark
選項:
spark.deploy.recoveryMode NONE 恢復模式(Master重新啟動的模式),有三種:1, ZooKeeper, 2, FileSystem, 3 NONE
spark.deploy.zookeeper.url ZooKeeper的Server地址
spark.deploy.zookeeper.dir /spark ZooKeeper 保存集群元數據信息的文件目錄,包括Worker,Driver和Application。
#下面是結合Spark On Yarn方式的集群模式需要配置的,獨立集群模式不需要配置
export HADOOP_HOME=/home/utoken/software/hadoop-2.5.2
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/Hadoop
5.3.2.2、修改Spark針對每個Driver應用程序的全局配置
#vim spark-defaults.conf(針對每個Driver有效)
spark-defaults.conf文件說明
影響范圍:編輯driver所在機器上的spark-defaults.conf,該文件會影響到driver所提交運行的application,及專門為該application提供計算資源的executor的啟動參數。因此只需要在driver所在的機器上編輯該文件,不需要在worker或master所運行的機器上編輯該文件。
配置舉例:
spark.executor.extraJavaOptions -XX:MaxPermSize=1000m
spark.executor.memory 1g
spark.serializer org.apache.spark.serializer.KryoSerializer
spark.cores.max 32
spark.shuffle.manager SORT
spark.driver.memory 2g
spark.shuffle.consolidateFiles true
詳細說明:
spark.executor.extraJavaOptions 設置擴展Java選項,這里指定永久帶最大內存1000m
spark.executor.memory 指定該application提供計算資源的executor啟動時, heap memory需要有1g(占用的Worker內存),默認512m
spark.serializer 指定采用序列化的類,這里采用org.apache.spark.serializer.KryoSerializer
spark.cores.max 指定每個Driver運行的最大核心數,這里指定3G,默認系統擁有的所有核心數
spark.shuffle.manager 指定在shuffle的時候,采用的管理方式,這里指定SORT方式,進行排序可以減少臨時文件的產生,但是性能稍微有些消耗
spark.driver.memory 指定Driver自身占用的內存大小,這里2G
以上屬性也可以單獨在SparkConf中進行配置,并根據每個機器性能進行優化指定
spark.shuffle.consolidateFiles 指定合并小文件,在map的時候會有很多小文件,在reduce后,其實只有一個結果,而小文件會留下,設置下面的就是在map后的小文件合并成一個文件了
關于Spark屬性的優先權為:SparkConf方式 > 命令行參數方式 >文件配置方式
5.3.3、修改從節點
#vim slaves
dn1
dn2
dn3
5.4、安裝其他集群機器
Scala快速分發:
scp -r /home/utoken/software/scala-2.10.5 utoken@dn1:/home/utoken/software/
spark快速分發:
scp -r spark-1.3.0-bin-hadoop2.4 utoken@dn1:/home/utoken/software/
5.5、啟動/關閉spark啟動和關閉集群
[utoken@nn1 spark-1.3.0-bin-hadoop2.4]$ ./sbin/start-all.sh
[utoken@nn1 spark-1.3.0-bin-hadoop2.4]$ ./sbin/stop-all.sh
單獨啟動和關閉Master
[utoken@nn1 spark-1.3.0-bin-hadoop2.4]$ ./sbin/start-master.sh
[utoken@nn1 spark-1.3.0-bin-hadoop2.4]$ ./sbin/stop-master.sh
單獨啟動Slaves
[utoken@nn1 spark-1.3.0-bin-hadoop2.4]$ ./sbin/start-slaves.sh
[utoken@nn1 spark-1.3.0-bin-hadoop2.4]$ ./sbin/stop-slaves.sh
單獨啟動Slaves中的某個Worker,同時指定端口(不存在端口沖突的情況下不需要指定)
[utoken@nn1 spark-1.3.0-bin-hadoop2.4]$./bin/spark-class org.apache.spark.deploy.worker.Worker spark://master:7077
指定某個端口
-webui-port 8082
5.6、啟動HA方式第一步,啟動整個集群:
[utoken@nn1 spark-1.3.0-bin-hadoop2.4]$ ./sbin/start-all.sh
[utoken@nn1 spark-1.3.0-bin-hadoop2.4]$ ./sbin/stop-all.sh
第二步,啟動Standby,Spark
[utoken@nn2 spark-1.3.0-bin-hadoop2.4]$ ./sbin/start-master.sh
[utoken@nn2 spark-1.3.0-bin-hadoop2.4]$ ./sbin/stop-master.sh
5.7、檢查是否啟動主節點
[utoken@nn1 spark-1.3.0-bin-hadoop2.4]$ jps
31246 Master
Slaves節點
[utoken@dn2 software]$ jps
7734 Worker
5.8、發布/停止Driver應用5.8.1、發布應用命令:
./bin/spark-submit \
--class <main-class>
--master <master-url> \
--deploy-mode <deploy-mode> \
--conf <key>=<value> \
... # other options
<application-jar> \
[application-arguments]
參數說明:
--class指定你需要執行的主類,
如--class com.pride.market.spark.streaming.Bootstrap
--master指定master地址,如:spark://nn1:7077
--deploy-mode 指定Driver運行的模式,默認是Client方式,有如下兩個選項:client、cluster
--supervise 失敗后是否重啟Driver,僅限于Spark StandAlong模式
--jar 表示你的應用程序的依賴包,多個依賴包逗號分割即可
application-jar表示你的應用程序的jar包,該jar包必須在所有節點都可見,你可以上傳到HDFS文件系統中,采用hdfs://......jar方式,特別是采用cluster模式,就必須全局可見;如果采用的是client,只需要在命令最后跟上jar即可自動上傳到各個worker節點上去
application-arguments表示你的主類需要傳遞的參數main(args),
如果需要查看配置選項是從哪里來的,可以用打開--verbose選項來生成更詳細的運行信息以做參考
5.8.2、停止任務(Application/Driver)
1、Client方式發布的應用停止方式:
[utoken@nn1 ~]$ jps
18376 SparkSubmit
[utoken@nn1 ~]$kill -9 18376
2、Cluster模式發布的應用停止方式:
./bin/spark-class org.apache.spark.deploy.Client kill <master url> <driver ID>
其中Master URL表示集群Master地址,如spark://nn1:7077
Driver ID需要通過Master的8080端口查看,地址:http://nn1:8080
在Running Drivers中找到這里的Submission ID。
如:
[utoken@nn2 sbin]$ spark-class org.apache.spark.deploy.Client kill spark://nn1:7077 driver-20150505151651-0014
查看yarn任務列表
#yarn application -list
[bdata@nn1 ~]$ yarn application -kill applicationId
詳細發布命令及示例可見官網地址:
http://spark.apache.org/docs/latest/submitting-applications.html
5.9、啟動/關閉Driver的歷史監控
每一個SparkContext啟動一個web UI,默認情況下在端口4040, 顯示關于應用程序的有用信息,包括:
調度器階段和任務的列表
RDD大小和內存使用的概覽
環境信息。
關于運行中執行器的信息
5.9.1、修改spark-default.conf配置(如果沒有做下配置,日志將不會持久化,一旦運行完畢后,無法查看日志情況)
在最后增加如下選項
#是否啟用事件日志記錄,這里啟用
spark.eventLog.enabled true
#Driver任務運行的日志生成目錄
spark.eventLog.dir hdfs://dfscluster/sparktst/eventslog
#監控頁面需要監控的目錄,需要先啟用和指定事件日志目錄,配合上面兩項使用
spark.history.fs.logDirectory hdfs://dfscluster/sparktst/eventslog
特殊說明:hdfs://dfscluster/sparktst/eventslog,該目錄為HDFS的目錄,請提前創建好,同時這里用到了HADOOP HA模式的集群名稱dfscluster,所以我們需要把HADOOP的配置文件hdfs-site.xml復制到Spark的conf目錄下,這樣就不會報集群名字dfscluster找不到的問題,詳見問題12
更為詳細的文檔請查看官方文檔:
http://spark.apache.org/docs/latest/monitoring.html
5.9.2、啟動/關閉歷史記錄服務
[utoken@nn1 spark-1.3.0-bin-hadoop2.4]$ sbin/start-history-server.sh
[utoken@nn1 spark-1.3.0-bin-hadoop2.4]$ sbin/stop-history-server.sh
5.10、hive on spark的配置
5.10.1、根據《Hive安裝配置》文檔,進行Hive的安裝配置
5.10.2、復制Hive的配置文件hive-site.xml到Spark的配置目錄conf下,然后分發到Spark的整個集群
[bdata@bdata4 hadoop]$ for i in {34,35,36,37,38};do scp hive-site.xml 192.168.10.$i:/u01/spark-1.5.1/conf/ ; done
5.10.3、啟動整個集群,即可
5.10.4、測試
#采用集群方式啟動spark-shell
[bdata@bdata4 sbin]$ spark-shell --master spark://bdata4:7077
#構建hiveContext
scala> val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)
16/01/13 17:30:30 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
sqlContext: org.apache.spark.sql.hive.HiveContext = org.apache.spark.sql.hive.HiveContext@2f6c736
#進行sql的查詢操作,這里的表YHJHK_IY02,是提前在hive中創建好的,并已經加載了數據,故這里可以直接查詢
scala> sqlContext.sql("select * from YHJHK_IY02 where AAC002 = '510922197303151981'").collect().foreach(println)
數據略
其他啟動方式
直接基于spark-sql方式啟動
[bdata@bdata4 sbin]$./spark-sql --master spark://bdata4:7077
基于YARN模式啟動,與Hive整合只支持yarn-client模式,不支持yarn-cluster
[bdata@bdata4 sbin]$./spark-sql --master yarn-client
上面兩種方式都可以指定執行參數,如后面跟參數(注意有些參數在各個集群下生效情況是不一樣的哈)
--driver-memory 1G --driver-cores 2 --executor-memory 4G 或者 --driver-memory 1G --driver-cores 2 --executor-cores 4 --num-executors 8 --executor-memory 4G
注意:如果發布任務的總內存超過了物理機器的總內存,該任務將不會執行,因此,一定注意核算集群的內存總大小剩余,于系統核心數無關
六、相關參數說明
詳見官網配置表:
http://spark.apache.org/docs/latest/configuration.html
Driver Application設置(該內容也可以設置在spark-default.conf):
#允許通許的消息大小,由于默認消息太小導致通訊失敗,故可以設置更大的值(該值表示Spark使用AKKA框架中的Actor通信消息的最大容量(如任務task的輸出結果,因為整個spark集群的消息傳遞都是通過Actor進行的,默認10M,在處理大規模數據時,可以調整該值))
spark.akka.frameSize=10
#分區數量(可理解為并行線程數),建議設置成內核數的2-3倍
spark.default.parallelism=9
#是否自動清除不需要再次使用的RDD(優化內存存儲)
spark.streaming.unpersist=true
#是否將多個suffle小文件合并成一個大文件(優化磁盤存儲)
spark.shuffle.consolidateFiles=true
#把指定毫秒內接受到的流數據放入一個block文件中(優化磁盤存儲)
spark.streaming.blockInterval=1000
#spark存儲模式設為序列化存儲是才生效,序列化類
spark.serializer=org.apache.spark.serializer.KryoSerializer
spark-env.conf
# -SPARK_EXECUTOR_INSTANCES, Number of workers to start (Default: 2)
# -SPARK_EXECUTOR_CORES, Number of cores for the workers (Default: 1).
# -SPARK_WORKER_CORES, to set the number of cores to use on this machine
# -SPARK_WORKER_INSTANCES, to set the number of worker processes per node
性能優化
1、spark中有兩個性能優化比較重要的指標,數據壓縮和序列化
數據壓縮:
工具:目前一般采用LZF和Snappy兩種方式,LZF壓縮比高,Snappy壓縮時間花費長
配置:
spark-env.sh
export SPARK_JAVA_OPTS="-Dspark.broadcast.compress"
程序配置:conf.set("spark.broadcast.compress",true)
配置壓縮方式:spark.io.compression.codec
序列化:
目的:進程間通訊、數據持久化到磁盤
工具:Java自身序列化和Kyro序列化,Kyro擁有緊湊、快速、輕量、擴展性好、自定義強等有點
發布到yarn上面的應用需要設置的幾個特殊參數
--num-executors 控制為這個應用分配多少個Executor , 僅限于Spark on Yarn模式
--executor-memory 控制應用被分配到的每個Executor的內存大小,默認1G 支持Spark standalone、Yarn、Mesos
--executor-cores 控制應用被分配到的每個Executor的CPU核心數量
通過上面這些參數可以限制用戶提交的應用不會過多的占用系統資源
其他
--supervise 失敗后是否重啟Driver,僅限于Spark standalone模式
--driver-cores NUM Driver程序的使用CPU個數,僅限于Spark standalone模式
--total-executor-cores NUM executor使用的總核數,僅限于Spark standalone、Spark on Mesos模式
2、lineage(血統)
Narrow依賴:一個父分區對應一個子分區或多個父分區只對應一個子分區
Wide依賴:一個父分區對應多個子分區或多個父分區對應多個子分區
這里我們優先選擇使用Narrow Dependency,向上會查重算性能消耗比較低,而Wide方式會出現計算過度,由于依賴的父子分區較多,鏈條復雜,故計算消耗的性能也比較多,同時由于需要通過父分區重算數據,那么也會重新計算已經計算過未丟失的子分區數據,所以導致大量冗余數據重算開銷。
3、Checkpoint
用于設置檢查點數據的存儲,進而將數據存儲備份,是對lineage做容錯的輔助,lineage過長會導致容錯成本過高,那么我們可以使用檢查點方式進行數據恢復,在中間結果進行檢查點容錯,若出現分區丟失,可以直接通過檢查點還原了,在做檢查點時,記住需要對數據進行一個Cache,也就是最好是內存中已經緩存的RDD,否則會造成重新計算問題,消耗性能。
4、Shuffle
本意為洗牌、混洗,把一組有一定規則的數據進行打散重新組合轉換為一組無規則隨機數據分區。而在Spark中Shuffle則表示把一組無規則的數據盡量轉換成一組具有一定規則的數據,和它本意正好相反。
5、減少重復Jar包復制分發
由于spark每次提交任務的時候,都會把相應的jar包提交到任務所在的機器中,這樣同一個任務多次提交后,會出現jar包重復提交占用磁盤空間,為了減少jar包重復提交,我們需要把應用任務需要使用到的jar包上傳到HDFS中,進行地址引用即可,這樣就不會出現每次發布任務都上次一次jar包的情況了,達到了多次提交都引用同一個地址的jar包目的,減少了系統磁盤的占用。
6、監控java虛擬機(Linux)的性能
推薦采用:yourkit,一個比較友好的Java Profile工具
特殊說明(Spark、Flink):
1、流式計算:Flink、Storm支持毫秒級計算。Spark目前(V1.5.1)只支持秒級計算,并可運行在100個節點以上的集群。Storm目前最小的延遲是100ms左右。
Flink是一行一行處理,而Spark是基于數據片集合(RDD)進行小批量處理,所以Spark在流式處理方面,不可避免增加一些延時。
2、HADOOP兼容:Flink對Hadoop有著更好的兼容,如可以支持原生HBase的TableMapper和TableReducer,唯一不足是現在只支持老版本的MapReduce方法,新版本的MapReduce方法無法得到支持,Spark則不支持TableMapper和TableReducer這些方法。
3、SQL支持:Spark對SQL的支持比Flink支持的范圍要大一些,另外Spark支持對SQL的優化,而Flink支持主要是對API級的優化。
4、Flink支持自動優化迭代式計算
5、Spark后續優勢Spark SQL
6、Spark Streaming的Lineage容錯方式,數據都是多分冗余容錯的,如果數據來至與HDFS,那么默認一般HDFS是三份備份,如果數據來自于網絡,那么它會對每一個數據流復制兩份到其他的機器,冗余容錯。
到此,相信大家對“Spark HA的部署方案”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。