溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Spark HA的部署方案

發(fā)布時(shí)間:2021-09-15 17:23:31 來(lái)源:億速云 閱讀:163 作者:chen 欄目:云計(jì)算

本篇內(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
HostIP
zookeeper1192.168.50.228
zookeeper2192.168.50.229
zookeeper3192.168.50.230
Spark HA Cluster


HOSTIPMasterWorker
nn1192.168.50.221YN
nn2192.168.50.222YN
dn1192.168.50.225NY
dn2192.168.50.226NY
dn3192.168.50.227NY

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í)!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI