安裝Spark獨立模式,你只需要將Spark的編譯版本簡單的放到集群的每個節(jié)點。你可以獲得每個穩(wěn)定版本的預(yù)編譯版本,也可以自己編譯。
你能夠通過下面的方式啟動獨立的master服務(wù)器。
./sbin/start-master.sh
一旦啟動,master將會為自己打印出spark://HOST:PORT
URL,你能夠用它連接到workers或者作為"master"參數(shù)傳遞給SparkContext
。你也可以在master web UI上發(fā)現(xiàn)這個URL,master web UI默認(rèn)的地址是http://localhost:8080
。
相同的,你也可以啟動一個或者多個workers或者將它們連接到master。
./bin/spark-class org.apache.spark.deploy.worker.Worker spark://IP:PORT
一旦你啟動了一個worker,查看master web UI。你可以看到新的節(jié)點列表以及節(jié)點的CPU數(shù)以及內(nèi)存。
下面的配置參數(shù)可以傳遞給master和worker。
Argument | Meaning |
---|---|
-h HOST, --host HOST | 監(jiān)聽的主機名 |
-i HOST, --ip HOST | 同上,已經(jīng)被淘汰 |
-p PORT, --port PORT | 監(jiān)聽的服務(wù)的端口(master默認(rèn)是7077,worker隨機) |
--webui-port PORT | web UI的端口(master默認(rèn)是8080,worker默認(rèn)是8081) |
-c CORES, --cores CORES | Spark應(yīng)用程序可以使用的CPU核數(shù)(默認(rèn)是所有可用);這個選項僅在worker上可用 |
-m MEM, --memory MEM | Spark應(yīng)用程序可以使用的內(nèi)存數(shù)(默認(rèn)情況是你的機器內(nèi)存數(shù)減去1g);這個選項僅在worker上可用 |
-d DIR, --work-dir DIR | 用于暫存空間和工作輸出日志的目錄(默認(rèn)是SPARK_HOME/work);這個選項僅在worker上可用 |
--properties-file FILE | 自定義的Spark配置文件的加載目錄(默認(rèn)是conf/spark-defaults.conf) |
為了用啟動腳本啟動Spark獨立集群,你應(yīng)該在你的Spark目錄下建立一個名為conf/slaves
的文件,這個文件必須包含所有你要啟動的Spark worker所在機器的主機名,一行一個。如果conf/slaves
不存在,啟動腳本默認(rèn)為單個機器(localhost),這臺機器對于測試是有用的。注意,master機器通過ssh訪問所有的worker。在默認(rèn)情況下,SSH是并行運行,需要設(shè)置無密碼(采用私有密鑰)的訪問。如果你沒有設(shè)置為無密碼訪問,你可以設(shè)置環(huán)境變量SPARK_SSH_FOREGROUND
,為每個worker提供密碼。
一旦你設(shè)置了這個文件,你就可以通過下面的shell腳本啟動或者停止你的集群。
注意,這些腳本必須在你的Spark master運行的機器上執(zhí)行,而不是在你的本地機器上面。
你可以在conf/spark-env.sh
中設(shè)置環(huán)境變量進一步配置集群。利用conf/spark-env.sh.template
創(chuàng)建這個文件,然后將它復(fù)制到所有的worker機器上使設(shè)置有效。下面的設(shè)置可以起作用:
Environment Variable | Meaning |
---|---|
SPARK_MASTER_IP | 綁定master到一個指定的ip地址 |
SPARK_MASTER_PORT | 在不同的端口上啟動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),查看下面的表格的選項以組成一個可能的列表 |
SPARK_LOCAL_DIRS | Spark中暫存空間的目錄。包括map的輸出文件和存儲在磁盤上的RDDs(including map output files and RDDs that get stored on disk)。這必須在一個快速的、你的系統(tǒng)的本地磁盤上。它可以是一個逗號分隔的列表,代表不同磁盤的多個目錄 |
SPARK_WORKER_CORES | Spark應(yīng)用程序可以用到的核心數(shù)(默認(rèn)是所有可用) |
SPARK_WORKER_MEMORY | Spark應(yīng)用程序用到的內(nèi)存總數(shù)(默認(rèn)是內(nèi)存總數(shù)減去1G)。注意,每個應(yīng)用程序個體的內(nèi)存通過spark.executor.memory 設(shè)置 |
SPARK_WORKER_PORT | 在指定的端口上啟動Spark worker(默認(rèn)是隨機) |
SPARK_WORKER_WEBUI_PORT | worker UI的端口(默認(rèn)是8081) |
SPARK_WORKER_INSTANCES | 每臺機器運行的worker實例數(shù),默認(rèn)是1。如果你有一臺非常大的機器并且希望運行多個worker,你可以設(shè)置這個數(shù)大于1。如果你設(shè)置了這個環(huán)境變量,確保你也設(shè)置了SPARK_WORKER_CORES 環(huán)境變量用于限制每個worker的核數(shù)或者每個worker嘗試使用所有的核。 |
SPARK_WORKER_DIR | Spark worker運行目錄,該目錄包括日志和暫存空間(默認(rèn)是SPARK_HOME/work) |
SPARK_WORKER_OPTS | 應(yīng)用到worker的配置屬性,格式是 "-Dx=y"(默認(rèn)是none),查看下面表格的選項以組成一個可能的列表 |
SPARK_DAEMON_MEMORY | 分配給Spark master和worker守護進程的內(nèi)存(默認(rèn)是512m) |
SPARK_DAEMON_JAVA_OPTS | Spark master和worker守護進程的JVM選項,格式是"-Dx=y"(默認(rèn)為none) |
SPARK_PUBLIC_DNS | Spark master和worker公共的DNS名(默認(rèn)是none) |
注意,啟動腳本還不支持windows。為了在windows上啟動Spark集群,需要手動啟動master和workers。
SPARK_MASTER_OPTS
支持一下的系統(tǒng)屬性:
Property Name | Default | Meaning |
---|---|---|
spark.deploy.retainedApplications | 200 | 展示完成的應(yīng)用程序的最大數(shù)目。老的應(yīng)用程序會被刪除以滿足該限制 |
spark.deploy.retainedDrivers | 200 | 展示完成的drivers的最大數(shù)目。老的應(yīng)用程序會被刪除以滿足該限制 |
spark.deploy.spreadOut | true | 這個選項控制獨立的集群管理器是應(yīng)該跨節(jié)點傳遞應(yīng)用程序還是應(yīng)努力將程序整合到盡可能少的節(jié)點上。在HDFS中,傳遞程序是數(shù)據(jù)本地化更好的選擇,但是,對于計算密集型的負(fù)載,整合會更有效率。 |
spark.deploy.defaultCores | (infinite) | 在Spark獨立模式下,給應(yīng)用程序的默認(rèn)核數(shù)(如果沒有設(shè)置spark.cores.max )。如果沒有設(shè)置,應(yīng)用程序總數(shù)獲得所有可用的核,除非設(shè)置了spark.cores.max 。在共享集群上設(shè)置較低的核數(shù),可用防止用戶默認(rèn)抓住整個集群。 |
spark.worker.timeout | 60 | 獨立部署的master認(rèn)為worker失?。]有收到心跳信息)的間隔時間。 |
SPARK_WORKER_OPTS
支持的系統(tǒng)屬性:
Property Name | Default | Meaning |
---|---|---|
spark.worker.cleanup.enabled | false | 周期性的清空worker/應(yīng)用程序目錄。注意,這僅僅影響?yīng)毩⒉渴鹉J?。不管?yīng)用程序是否還在執(zhí)行,用于程序目錄都會被清空 |
spark.worker.cleanup.interval | 1800 (30分) | 在本地機器上,worker清空老的應(yīng)用程序工作目錄的時間間隔 |
spark.worker.cleanup.appDataTtl | 7 24 3600 (7天) | 每個worker中應(yīng)用程序工作目錄的保留時間。這個時間依賴于你可用磁盤空間的大小。應(yīng)用程序日志和jar包上傳到每個應(yīng)用程序的工作目錄。隨著時間的推移,工作目錄會很快的填滿磁盤空間,特別是如果你運行的作業(yè)很頻繁。 |
為了在Spark集群中運行一個應(yīng)用程序,簡單地傳遞spark://IP:PORT
URL到SparkContext
為了在集群上運行一個交互式的Spark shell,運行一下命令:
./bin/spark-shell --master spark://IP:PORT
你也可以傳遞一個選項--total-executor-cores <numCores>
去控制spark-shell的核數(shù)。
spark-submit腳本支持最直接的提交一個Spark應(yīng)用程序到集群。對于獨立部署的集群,Spark目前支持兩種部署模式。在client
模式中,driver啟動進程與客戶端提交應(yīng)用程序所在的進程是同一個進程。然而,在cluster
模式中,driver在集群的某個worker進程中啟動,只有客戶端進程完成了提交任務(wù),它不會等到應(yīng)用程序完成就會退出。
如果你的應(yīng)用程序通過Spark submit啟動,你的應(yīng)用程序jar包將會自動分發(fā)到所有的worker節(jié)點。對于你的應(yīng)用程序依賴的其它jar包,你應(yīng)該用--jars
符號指定(如--jars jar1,jar2
)。
另外,cluster
模式支持自動的重啟你的應(yīng)用程序(如果程序一非零的退出碼退出)。為了用這個特征,當(dāng)啟動應(yīng)用程序時,你可以傳遞--supervise
符號到spark-submit
。如果你想殺死反復(fù)失敗的應(yīng)用,你可以通過如下的方式:
./bin/spark-class org.apache.spark.deploy.Client kill <master url> <driver ID>
你可以在獨立部署的Master web UI(http://:8080)中找到driver ID。
獨立部署的集群模式僅僅支持簡單的FIFO調(diào)度器。然而,為了允許多個并行的用戶,你能夠控制每個應(yīng)用程序能用的最大資源數(shù)。在默認(rèn)情況下,它將獲得集群的所有核,這只有在某一時刻只允許一個應(yīng)用程序才有意義。你可以通過spark.cores.max
在SparkConf中設(shè)置核數(shù)。
val conf = new SparkConf()
.setMaster(...)
.setAppName(...)
.set("spark.cores.max", "10")
val sc = new SparkContext(conf)
另外,你可以在集群的master進程中配置spark.deploy.defaultCores
來改變默認(rèn)的值。在conf/spark-env.sh
添加下面的行:
export SPARK_MASTER_OPTS="-Dspark.deploy.defaultCores=<value>"
這在用戶沒有配置最大核數(shù)的共享集群中是有用的。
默認(rèn)情況下,獨立的調(diào)度集群對worker失敗是有彈性的(在Spark本身的范圍內(nèi)是有彈性的,對丟失的工作通過轉(zhuǎn)移它到另外的worker來解決)。然而,調(diào)度器通過master去執(zhí)行調(diào)度決定,這會造成單點故障:如果master死了,新的應(yīng)用程序就無法創(chuàng)建。為了避免這個,我們有兩個高可用的模式。
利用ZooKeeper去支持領(lǐng)導(dǎo)選舉以及一些狀態(tài)存儲,你能夠在你的集群中啟動多個master,這些master連接到同一個ZooKeeper實例上。一個被選為“領(lǐng)導(dǎo)”,其它的保持備用模式。如果當(dāng)前的領(lǐng)導(dǎo)死了,另一個master將會被選中,恢復(fù)老master的狀態(tài),然后恢復(fù)調(diào)度。整個的恢復(fù)過程大概需要1到2分鐘。注意,這個恢復(fù)時間僅僅會影響調(diào)度新的應(yīng)用程序-運行在失敗master中的應(yīng)用程序不受影響。
為了開啟這個恢復(fù)模式,你可以用下面的屬性在spark-env
中設(shè)置SPARK_DAEMON_JAVA_OPTS
。
System property | Meaning |
---|---|
spark.deploy.recoveryMode | 設(shè)置ZOOKEEPER去啟動備用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) |
可能的陷阱:如果你在集群中有多個masters,但是沒有用zookeeper正確的配置這些masters,這些masters不會發(fā)現(xiàn)彼此,會認(rèn)為它們都是leaders。這將會造成一個不健康的集群狀態(tài)(因為所有的master都會獨立的調(diào)度)。
zookeeper集群啟動之后,開啟高可用是簡單的。在相同的zookeeper配置(zookeeper URL和目錄)下,在不同的節(jié)點上簡單地啟動多個master進程。master可以隨時添加和刪除。
為了調(diào)度新的應(yīng)用程序或者添加worker到集群,它需要知道當(dāng)前l(fā)eader的IP地址。這可以通過簡單的傳遞一個master列表來完成。例如,你可能啟動你的SparkContext指向spark://host1:port1,host2:port2
。這將造成你的SparkContext同時注冊這兩個master-如果host1
死了,這個配置文件將一直是正確的,因為我們將找到新的leader-host2
。
"registering with a Master"和正常操作之間有重要的區(qū)別。當(dāng)啟動時,一個應(yīng)用程序或者worker需要能夠發(fā)現(xiàn)和注冊當(dāng)前的leader master。一旦它成功注冊,它就在系統(tǒng)中了。如果錯誤發(fā)生,新的leader將會接觸所有之前注冊的應(yīng)用程序和worker,通知他們領(lǐng)導(dǎo)關(guān)系的變化,所以它們甚至不需要事先知道新啟動的leader的存在。
由于這個屬性的存在,新的master可以在任何時候創(chuàng)建。你唯一需要擔(dān)心的問題是新的應(yīng)用程序和workers能夠發(fā)現(xiàn)它并將它注冊進來以防它成為leader master。
zookeeper是生產(chǎn)環(huán)境下最好的選擇,但是如果你想在master死掉后重啟它,FILESYSTEM
模式可以解決。當(dāng)應(yīng)用程序和worker注冊,它們擁有足夠的狀態(tài)寫入提供的目錄,以至于在重啟master進程時它們能夠恢復(fù)。
為了開啟這個恢復(fù)模式,你可以用下面的屬性在spark-env
中設(shè)置SPARK_DAEMON_JAVA_OPTS
。
System property | Meaning |
---|---|
spark.deploy.recoveryMode | 設(shè)置為FILESYSTEM開啟單節(jié)點恢復(fù)模式(默認(rèn)為none) |
spark.deploy.recoveryDirectory | 用來恢復(fù)狀態(tài)的目錄 |
stop-master.sh
殺掉master不會清除它的恢復(fù)狀態(tài),所以,不管你何時啟動一個新的master,它都將進入恢復(fù)模式。這可能使啟動時間增加到1分鐘。
更多建議: