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