獨(dú)立運(yùn)行Spark

2018-02-24 15:58 更新

Spark獨(dú)立部署模式

安裝Spark獨(dú)立模式集群

安裝Spark獨(dú)立模式,你只需要將Spark的編譯版本簡(jiǎn)單的放到集群的每個(gè)節(jié)點(diǎn)。你可以獲得每個(gè)穩(wěn)定版本的預(yù)編譯版本,也可以自己編譯。

手動(dòng)啟動(dòng)集群

你能夠通過(guò)下面的方式啟動(dòng)獨(dú)立的master服務(wù)器。

./sbin/start-master.sh

一旦啟動(dòng),master將會(huì)為自己打印出spark://HOST:PORT URL,你能夠用它連接到workers或者作為"master"參數(shù)傳遞給SparkContext。你也可以在master web UI上發(fā)現(xiàn)這個(gè)URL,master web UI默認(rèn)的地址是http://localhost:8080。

相同的,你也可以啟動(dòng)一個(gè)或者多個(gè)workers或者將它們連接到master。

./bin/spark-class org.apache.spark.deploy.worker.Worker spark://IP:PORT

一旦你啟動(dòng)了一個(gè)worker,查看master web UI。你可以看到新的節(jié)點(diǎn)列表以及節(jié)點(diǎn)的CPU數(shù)以及內(nèi)存。

下面的配置參數(shù)可以傳遞給master和worker。

Argument Meaning
-h HOST, --host HOST 監(jiān)聽(tīng)的主機(jī)名
-i HOST, --ip HOST 同上,已經(jīng)被淘汰
-p PORT, --port PORT 監(jiān)聽(tīng)的服務(wù)的端口(master默認(rèn)是7077,worker隨機(jī))
--webui-port PORT web UI的端口(master默認(rèn)是8080,worker默認(rèn)是8081)
-c CORES, --cores CORES Spark應(yīng)用程序可以使用的CPU核數(shù)(默認(rèn)是所有可用);這個(gè)選項(xiàng)僅在worker上可用
-m MEM, --memory MEM Spark應(yīng)用程序可以使用的內(nèi)存數(shù)(默認(rèn)情況是你的機(jī)器內(nèi)存數(shù)減去1g);這個(gè)選項(xiàng)僅在worker上可用
-d DIR, --work-dir DIR 用于暫存空間和工作輸出日志的目錄(默認(rèn)是SPARK_HOME/work);這個(gè)選項(xiàng)僅在worker上可用
--properties-file FILE 自定義的Spark配置文件的加載目錄(默認(rèn)是conf/spark-defaults.conf)

集群?jiǎn)?dòng)腳本

為了用啟動(dòng)腳本啟動(dòng)Spark獨(dú)立集群,你應(yīng)該在你的Spark目錄下建立一個(gè)名為conf/slaves的文件,這個(gè)文件必須包含所有你要啟動(dòng)的Spark worker所在機(jī)器的主機(jī)名,一行一個(gè)。如果conf/slaves不存在,啟動(dòng)腳本默認(rèn)為單個(gè)機(jī)器(localhost),這臺(tái)機(jī)器對(duì)于測(cè)試是有用的。注意,master機(jī)器通過(guò)ssh訪問(wèn)所有的worker。在默認(rèn)情況下,SSH是并行運(yùn)行,需要設(shè)置無(wú)密碼(采用私有密鑰)的訪問(wèn)。如果你沒(méi)有設(shè)置為無(wú)密碼訪問(wèn),你可以設(shè)置環(huán)境變量SPARK_SSH_FOREGROUND,為每個(gè)worker提供密碼。

一旦你設(shè)置了這個(gè)文件,你就可以通過(guò)下面的shell腳本啟動(dòng)或者停止你的集群。

  • sbin/start-master.sh:在機(jī)器上啟動(dòng)一個(gè)master實(shí)例
  • sbin/start-slaves.sh:在每臺(tái)機(jī)器上啟動(dòng)一個(gè)slave實(shí)例
  • sbin/start-all.sh:同時(shí)啟動(dòng)一個(gè)master實(shí)例和所有slave實(shí)例
  • sbin/stop-master.sh:停止master實(shí)例
  • sbin/stop-slaves.sh:停止所有slave實(shí)例
  • sbin/stop-all.sh:停止master實(shí)例和所有slave實(shí)例

注意,這些腳本必須在你的Spark master運(yùn)行的機(jī)器上執(zhí)行,而不是在你的本地機(jī)器上面。

你可以在conf/spark-env.sh中設(shè)置環(huán)境變量進(jìn)一步配置集群。利用conf/spark-env.sh.template創(chuàng)建這個(gè)文件,然后將它復(fù)制到所有的worker機(jī)器上使設(shè)置有效。下面的設(shè)置可以起作用:

Environment Variable Meaning
SPARK_MASTER_IP 綁定master到一個(gè)指定的ip地址
SPARK_MASTER_PORT 在不同的端口上啟動(dòng)master(默認(rèn)是7077)
SPARK_MASTER_WEBUI_PORT master web UI的端口(默認(rèn)是8080)
SPARK_MASTER_OPTS 應(yīng)用到master的配置屬性,格式是 "-Dx=y"(默認(rèn)是none),查看下面的表格的選項(xiàng)以組成一個(gè)可能的列表
SPARK_LOCAL_DIRS Spark中暫存空間的目錄。包括map的輸出文件和存儲(chǔ)在磁盤上的RDDs(including map output files and RDDs that get stored on disk)。這必須在一個(gè)快速的、你的系統(tǒng)的本地磁盤上。它可以是一個(gè)逗號(hào)分隔的列表,代表不同磁盤的多個(gè)目錄
SPARK_WORKER_CORES Spark應(yīng)用程序可以用到的核心數(shù)(默認(rèn)是所有可用)
SPARK_WORKER_MEMORY Spark應(yīng)用程序用到的內(nèi)存總數(shù)(默認(rèn)是內(nèi)存總數(shù)減去1G)。注意,每個(gè)應(yīng)用程序個(gè)體的內(nèi)存通過(guò)spark.executor.memory設(shè)置
SPARK_WORKER_PORT 在指定的端口上啟動(dòng)Spark worker(默認(rèn)是隨機(jī))
SPARK_WORKER_WEBUI_PORT worker UI的端口(默認(rèn)是8081)
SPARK_WORKER_INSTANCES 每臺(tái)機(jī)器運(yùn)行的worker實(shí)例數(shù),默認(rèn)是1。如果你有一臺(tái)非常大的機(jī)器并且希望運(yùn)行多個(gè)worker,你可以設(shè)置這個(gè)數(shù)大于1。如果你設(shè)置了這個(gè)環(huán)境變量,確保你也設(shè)置了SPARK_WORKER_CORES環(huán)境變量用于限制每個(gè)worker的核數(shù)或者每個(gè)worker嘗試使用所有的核。
SPARK_WORKER_DIR Spark worker運(yùn)行目錄,該目錄包括日志和暫存空間(默認(rèn)是SPARK_HOME/work)
SPARK_WORKER_OPTS 應(yīng)用到worker的配置屬性,格式是 "-Dx=y"(默認(rèn)是none),查看下面表格的選項(xiàng)以組成一個(gè)可能的列表
SPARK_DAEMON_MEMORY 分配給Spark master和worker守護(hù)進(jìn)程的內(nèi)存(默認(rèn)是512m)
SPARK_DAEMON_JAVA_OPTS Spark master和worker守護(hù)進(jìn)程的JVM選項(xiàng),格式是"-Dx=y"(默認(rèn)為none)
SPARK_PUBLIC_DNS Spark master和worker公共的DNS名(默認(rèn)是none)

注意,啟動(dòng)腳本還不支持windows。為了在windows上啟動(dòng)Spark集群,需要手動(dòng)啟動(dòng)master和workers。

SPARK_MASTER_OPTS支持一下的系統(tǒng)屬性:

Property Name Default Meaning
spark.deploy.retainedApplications 200 展示完成的應(yīng)用程序的最大數(shù)目。老的應(yīng)用程序會(huì)被刪除以滿足該限制
spark.deploy.retainedDrivers 200 展示完成的drivers的最大數(shù)目。老的應(yīng)用程序會(huì)被刪除以滿足該限制
spark.deploy.spreadOut true 這個(gè)選項(xiàng)控制獨(dú)立的集群管理器是應(yīng)該跨節(jié)點(diǎn)傳遞應(yīng)用程序還是應(yīng)努力將程序整合到盡可能少的節(jié)點(diǎn)上。在HDFS中,傳遞程序是數(shù)據(jù)本地化更好的選擇,但是,對(duì)于計(jì)算密集型的負(fù)載,整合會(huì)更有效率。
spark.deploy.defaultCores (infinite) 在Spark獨(dú)立模式下,給應(yīng)用程序的默認(rèn)核數(shù)(如果沒(méi)有設(shè)置spark.cores.max)。如果沒(méi)有設(shè)置,應(yīng)用程序總數(shù)獲得所有可用的核,除非設(shè)置了spark.cores.max。在共享集群上設(shè)置較低的核數(shù),可用防止用戶默認(rèn)抓住整個(gè)集群。
spark.worker.timeout 60 獨(dú)立部署的master認(rèn)為worker失?。](méi)有收到心跳信息)的間隔時(shí)間。

SPARK_WORKER_OPTS支持的系統(tǒng)屬性:

Property Name Default Meaning
spark.worker.cleanup.enabled false 周期性的清空worker/應(yīng)用程序目錄。注意,這僅僅影響?yīng)毩⒉渴鹉J健2还軕?yīng)用程序是否還在執(zhí)行,用于程序目錄都會(huì)被清空
spark.worker.cleanup.interval 1800 (30分) 在本地機(jī)器上,worker清空老的應(yīng)用程序工作目錄的時(shí)間間隔
spark.worker.cleanup.appDataTtl 7 24 3600 (7天) 每個(gè)worker中應(yīng)用程序工作目錄的保留時(shí)間。這個(gè)時(shí)間依賴于你可用磁盤空間的大小。應(yīng)用程序日志和jar包上傳到每個(gè)應(yīng)用程序的工作目錄。隨著時(shí)間的推移,工作目錄會(huì)很快的填滿磁盤空間,特別是如果你運(yùn)行的作業(yè)很頻繁。

連接一個(gè)應(yīng)用程序到集群中

為了在Spark集群中運(yùn)行一個(gè)應(yīng)用程序,簡(jiǎn)單地傳遞spark://IP:PORT URL到SparkContext

為了在集群上運(yùn)行一個(gè)交互式的Spark shell,運(yùn)行一下命令:

./bin/spark-shell --master spark://IP:PORT

你也可以傳遞一個(gè)選項(xiàng)--total-executor-cores <numCores>去控制spark-shell的核數(shù)。

啟動(dòng)Spark應(yīng)用程序

spark-submit腳本支持最直接的提交一個(gè)Spark應(yīng)用程序到集群。對(duì)于獨(dú)立部署的集群,Spark目前支持兩種部署模式。在client模式中,driver啟動(dòng)進(jìn)程與客戶端提交應(yīng)用程序所在的進(jìn)程是同一個(gè)進(jìn)程。然而,在cluster模式中,driver在集群的某個(gè)worker進(jìn)程中啟動(dòng),只有客戶端進(jìn)程完成了提交任務(wù),它不會(huì)等到應(yīng)用程序完成就會(huì)退出。

如果你的應(yīng)用程序通過(guò)Spark submit啟動(dòng),你的應(yīng)用程序jar包將會(huì)自動(dòng)分發(fā)到所有的worker節(jié)點(diǎn)。對(duì)于你的應(yīng)用程序依賴的其它jar包,你應(yīng)該用--jars符號(hào)指定(如--jars jar1,jar2)。

另外,cluster模式支持自動(dòng)的重啟你的應(yīng)用程序(如果程序一非零的退出碼退出)。為了用這個(gè)特征,當(dāng)啟動(dòng)應(yīng)用程序時(shí),你可以傳遞--supervise符號(hào)到spark-submit。如果你想殺死反復(fù)失敗的應(yīng)用,你可以通過(guò)如下的方式:

./bin/spark-class org.apache.spark.deploy.Client kill <master url> <driver ID>

你可以在獨(dú)立部署的Master web UI(http://:8080)中找到driver ID。

資源調(diào)度

獨(dú)立部署的集群模式僅僅支持簡(jiǎn)單的FIFO調(diào)度器。然而,為了允許多個(gè)并行的用戶,你能夠控制每個(gè)應(yīng)用程序能用的最大資源數(shù)。在默認(rèn)情況下,它將獲得集群的所有核,這只有在某一時(shí)刻只允許一個(gè)應(yīng)用程序才有意義。你可以通過(guò)spark.cores.maxSparkConf中設(shè)置核數(shù)。

val conf = new SparkConf()
             .setMaster(...)
             .setAppName(...)
             .set("spark.cores.max", "10")
val sc = new SparkContext(conf)

另外,你可以在集群的master進(jìn)程中配置spark.deploy.defaultCores來(lái)改變默認(rèn)的值。在conf/spark-env.sh添加下面的行:

export SPARK_MASTER_OPTS="-Dspark.deploy.defaultCores=<value>"

這在用戶沒(méi)有配置最大核數(shù)的共享集群中是有用的。

高可用

默認(rèn)情況下,獨(dú)立的調(diào)度集群對(duì)worker失敗是有彈性的(在Spark本身的范圍內(nèi)是有彈性的,對(duì)丟失的工作通過(guò)轉(zhuǎn)移它到另外的worker來(lái)解決)。然而,調(diào)度器通過(guò)master去執(zhí)行調(diào)度決定,這會(huì)造成單點(diǎn)故障:如果master死了,新的應(yīng)用程序就無(wú)法創(chuàng)建。為了避免這個(gè),我們有兩個(gè)高可用的模式。

用ZooKeeper的備用master

利用ZooKeeper去支持領(lǐng)導(dǎo)選舉以及一些狀態(tài)存儲(chǔ),你能夠在你的集群中啟動(dòng)多個(gè)master,這些master連接到同一個(gè)ZooKeeper實(shí)例上。一個(gè)被選為“領(lǐng)導(dǎo)”,其它的保持備用模式。如果當(dāng)前的領(lǐng)導(dǎo)死了,另一個(gè)master將會(huì)被選中,恢復(fù)老master的狀態(tài),然后恢復(fù)調(diào)度。整個(gè)的恢復(fù)過(guò)程大概需要1到2分鐘。注意,這個(gè)恢復(fù)時(shí)間僅僅會(huì)影響調(diào)度新的應(yīng)用程序-運(yùn)行在失敗master中的應(yīng)用程序不受影響。

配置

為了開(kāi)啟這個(gè)恢復(fù)模式,你可以用下面的屬性在spark-env中設(shè)置SPARK_DAEMON_JAVA_OPTS。

System property Meaning
spark.deploy.recoveryMode 設(shè)置ZOOKEEPER去啟動(dòng)備用master模式(默認(rèn)為none)
spark.deploy.zookeeper.url zookeeper集群url(如192.168.1.100:2181,192.168.1.101:2181)
spark.deploy.zookeeper.dir zookeeper保存恢復(fù)狀態(tài)的目錄(默認(rèn)是/spark)

可能的陷阱:如果你在集群中有多個(gè)masters,但是沒(méi)有用zookeeper正確的配置這些masters,這些masters不會(huì)發(fā)現(xiàn)彼此,會(huì)認(rèn)為它們都是leaders。這將會(huì)造成一個(gè)不健康的集群狀態(tài)(因?yàn)樗械膍aster都會(huì)獨(dú)立的調(diào)度)。

細(xì)節(jié)

zookeeper集群?jiǎn)?dòng)之后,開(kāi)啟高可用是簡(jiǎn)單的。在相同的zookeeper配置(zookeeper URL和目錄)下,在不同的節(jié)點(diǎn)上簡(jiǎn)單地啟動(dòng)多個(gè)master進(jìn)程。master可以隨時(shí)添加和刪除。

為了調(diào)度新的應(yīng)用程序或者添加worker到集群,它需要知道當(dāng)前l(fā)eader的IP地址。這可以通過(guò)簡(jiǎn)單的傳遞一個(gè)master列表來(lái)完成。例如,你可能啟動(dòng)你的SparkContext指向spark://host1:port1,host2:port2。這將造成你的SparkContext同時(shí)注冊(cè)這兩個(gè)master-如果host1死了,這個(gè)配置文件將一直是正確的,因?yàn)槲覀儗⒄业叫碌膌eader-host2。

"registering with a Master"和正常操作之間有重要的區(qū)別。當(dāng)啟動(dòng)時(shí),一個(gè)應(yīng)用程序或者worker需要能夠發(fā)現(xiàn)和注冊(cè)當(dāng)前的leader master。一旦它成功注冊(cè),它就在系統(tǒng)中了。如果錯(cuò)誤發(fā)生,新的leader將會(huì)接觸所有之前注冊(cè)的應(yīng)用程序和worker,通知他們領(lǐng)導(dǎo)關(guān)系的變化,所以它們甚至不需要事先知道新啟動(dòng)的leader的存在。

由于這個(gè)屬性的存在,新的master可以在任何時(shí)候創(chuàng)建。你唯一需要擔(dān)心的問(wèn)題是新的應(yīng)用程序和workers能夠發(fā)現(xiàn)它并將它注冊(cè)進(jìn)來(lái)以防它成為leader master。

用本地文件系統(tǒng)做單節(jié)點(diǎn)恢復(fù)

zookeeper是生產(chǎn)環(huán)境下最好的選擇,但是如果你想在master死掉后重啟它,FILESYSTEM模式可以解決。當(dāng)應(yīng)用程序和worker注冊(cè),它們擁有足夠的狀態(tài)寫入提供的目錄,以至于在重啟master進(jìn)程時(shí)它們能夠恢復(fù)。

配置

為了開(kāi)啟這個(gè)恢復(fù)模式,你可以用下面的屬性在spark-env中設(shè)置SPARK_DAEMON_JAVA_OPTS。

System property Meaning
spark.deploy.recoveryMode 設(shè)置為FILESYSTEM開(kāi)啟單節(jié)點(diǎn)恢復(fù)模式(默認(rèn)為none)
spark.deploy.recoveryDirectory 用來(lái)恢復(fù)狀態(tài)的目錄

細(xì)節(jié)

  • 這個(gè)解決方案可以和監(jiān)控器/管理器(如monit)相配合,或者僅僅通過(guò)重啟開(kāi)啟手動(dòng)恢復(fù)。
  • 雖然文件系統(tǒng)的恢復(fù)似乎比沒(méi)有做任何恢復(fù)要好,但對(duì)于特定的開(kāi)發(fā)或?qū)嶒?yàn)?zāi)康?,這種模式可能是次優(yōu)的。特別是,通過(guò)stop-master.sh殺掉master不會(huì)清除它的恢復(fù)狀態(tài),所以,不管你何時(shí)啟動(dòng)一個(gè)新的master,它都將進(jìn)入恢復(fù)模式。這可能使啟動(dòng)時(shí)間增加到1分鐘。
  • 雖然它不是官方支持的方式,你也可以創(chuàng)建一個(gè)NFS目錄作為恢復(fù)目錄。如果原始的master節(jié)點(diǎn)完全死掉,你可以在不同的節(jié)點(diǎn)啟動(dòng)master,它可以正確的恢復(fù)之前注冊(cè)的所有應(yīng)用程序和workers。未來(lái)的應(yīng)用程序會(huì)發(fā)現(xiàn)這個(gè)新的master。
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)