閱讀720 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《Spark 官方文檔》Spark獨立模式

Spark獨立模式

Spark除了可以在Mesos和YARN集群上運行之外,還支持一種簡單的獨立部署模式。獨立部署模式下,你既可以手工啟動(手動運行master和workers),也可以利用我們提供的啟動腳本(launch scripts)。同時,獨立部署模式下,你可以在單機上運行這些程序,以方便測試。

Spark集群獨立安裝

要獨立安裝Spark,你隻需要將編譯好的Spark包複製到集群中每一個節點上即可。你可以下載一個編譯好的Spark版本,也可以在這裏自己編譯一個版本(build it yourself)。

手動啟動集群

執行以下命令,啟動獨立部署的master server:

./sbin/start-master.sh

一旦啟動完成,master會打印出master URL(spark://HOST:PORT),後續worker需要用這個URL來連接master,寫代碼的時候SparkContext中的master參數也需要設置成這個master URL。你還可以在master的web UI(默認為https://localhost:8080)上查看master URL。

類似地,你可以通過以下命令,啟動一個或多個worker節點,並將其連接到master:

./sbin/start-slave.sh <master-spark-URL>

啟動一個worker以後,刷新一下master的web UI(默認為https://localhost:8080),你應該可以在這裏看到一個新的節點。

最後,以下配置選項將會被傳給master和worker:

參數 含義
-h HOST--host HOST 監聽的主機名
-i HOST--ip HOST 監聽的主機名(已經廢棄,請使用-h 或者 –host)
-p PORT--port PORT 服務監聽的端口(master節點默認7077,worker節點隨機)
--webui-port PORT web UI端口(master節點默認8080,worker節點默認8081)
-c CORES--cores CORES 單節點上,Spark應用能夠使用的CPU core數上限(默認,等於CPU core的個數);僅worker節點有效
-m MEM--memory MEM 單節點上,Spark應用能夠使用的內存上限,格式為1000M 或者 2G(默認為,機器上所有內存減去1G);僅worker節點有效
-d DIR--work-dir DIR 工作目錄,同時job的日誌也輸出到該目錄(默認:${SPAKR_HOME}/work);僅worker節點有效
--properties-file FILE 自定義Spark屬性文件的加載路徑(默認:conf/spark-defaults.conf)

集群啟動腳本

要使用啟動腳本,來啟動一個Spark獨立部署集群,首先你需要在Spark目錄下創建一個文件conf/slaves,並且在文件中寫入你需要作為worker節點啟動的每一台機器主機名(或IP),每行一台機器。如果conf/slaves文件不存在,啟動腳本會默認會用單機方式啟動,這種方式對測試很有幫助。注意,master節點訪問各個worker時使用ssh。默認情況下,你需要配置ssh免密碼登陸(使用秘鑰文件)。如果你沒有設置免密碼登陸,那麼你也可以通過環境變量SPARK_SSH_FOREGROUND來一個一個地設置每個worker的密碼。

設置好conf/slaves文件以後,你就可以用一下shell腳本來啟動或停止集群了,類似於Hadoop的部署,這些腳本都在${SPARK_HOME}/sbin目錄下:

  • sbin/start-master.sh – 在本機啟動一個master實例
  • sbin/start-slaves.sh – 在conf/slaves文件所指定的每一台機器上都啟動一個slave實例
  • sbin/start-slave.sh – 在本機啟動一個slave實例
  • sbin/start-all.sh – 啟動一個master和多個slave實例,詳細見上麵的描述。
  • sbin/stop-master.sh – 停止 start-master.sh所啟動的master實例
  • sbin/stop-slaves.sh – 停止所有在conf/slaves中指定的slave實例
  • sbin/stop-all.sh – 停止master節點和所有slave節點,詳細見上麵的描述

注意,這些腳本都需要在你啟動Spark master的機器上運行,而不是你的本地機器。

Spark獨立部署集群的其他可選的環境變量見conf/spark-env.sh。你可以通過複製conf/spark-env.sh.template來創建這個文件,同時你還需要將配置好的文件複製到所有的worker節點上。以下是可用的設置:

環境變量 含義
SPARK_MASTER_IP master實例綁定的IP地址,例如,綁定到一個公網IP
SPARK_MASTER_PORT mater實例綁定的端口(默認7077)
SPARK_MASTER_WEBUI_PORT master web UI的端口(默認8080)
SPARK_MASTER_OPTS master專用配置屬性,格式如”-Dx=y” (默認空),可能的選項請參考下麵的列表。
SPARK_LOCAL_DIRS Spark的本地工作目錄,包括:映射輸出的臨時文件和RDD保存到磁盤上的臨時數據。這個目錄需要快速訪問,最好設成本地磁盤上的目錄。也可以通過使用逗號分隔列表,將其設成多個磁盤上的不同路徑。
SPARK_WORKER_CORES 本機上Spark應用可以使用的CPU core上限(默認所有CPU core)
SPARK_WORKER_MEMORY 本機上Spark應用可以使用的內存上限,如:1000m,2g(默認為本機所有內存減去1GB);注意每個應用單獨使用的內存大小要用 spark.executor.memory 屬性配置的。
SPARK_WORKER_PORT Spark worker綁定的端口(默認隨機)
SPARK_WORKER_WEBUI_PORT worker web UI端口(默認8081)
SPARK_WORKER_INSTANCES 每個slave機器上啟動的worker實例個數(默認:1)。如果你的slave機器非常強勁,可以把這個值設為大於1;相應的,你需要設置SPARK_WORKER_CORES參數來顯式地限製每個worker實例使用的CPU個數,否則每個worker實例都會使用所有的CPU。
SPARK_WORKER_DIR Spark worker的工作目錄,包括worker的日誌以及臨時存儲空間(默認:${SPARK_HOME}/work)
SPARK_WORKER_OPTS worker的專用配置屬性,格式為:”-Dx=y”,可能的選項請參考下麵的列表。
SPARK_DAEMON_MEMORY Spark master和worker後台進程所使用的內存(默認:1g)
SPARK_DAEMON_JAVA_OPTS Spark master和workers後台進程所使用的JVM選項,格式為:”-Dx=y”(默認空)
SPARK_PUBLIC_DNS Spark master和workers使用的公共DNS(默認空)

注意: 啟動腳本目前不支持Windows。如需在Windows上運行,請手工啟動master和workers。

SPARK_MASTER_OPTS支持以下屬性:

屬性名 默認值 含義
spark.deploy.retainedApplications 200 web UI上最多展示幾個已結束應用。更早的應用的數將被刪除。
spark.deploy.retainedDrivers 200 web UI上最多展示幾個已結束的驅動器。更早的驅動器進程數據將被刪除。
spark.deploy.spreadOut true 獨立部署集群的master是否應該盡可能將應用分布到更多的節點上;設為true,對數據本地性支持較好;設為false,計算會收縮到少數幾台機器上,這對計算密集型任務比較有利。
spark.deploy.defaultCores (無限製) Spark獨立模式下應用程序默認使用的CPU個數(沒有設置spark.cores.max的情況下)。如果不設置,則為所有可用CPU個數(除非設置了spark.cores.max)。如果集群是共享的,最好將此值設小一些,以避免用戶占滿整個集群。
spark.worker.timeout 60 如果master沒有收到worker的心跳,那麼將在這麼多秒之後,master將丟棄該worker。

SPARK_WORKER_OPTS支持以下屬性:

屬性名 默認值 含義
spark.worker.cleanup.enabled false 是否定期清理 worker 和應用的工作目錄。注意,該設置僅在獨立模式下有效,YARN有自己的清理方式;同時,隻會清理已經結束的應用對應的目錄。
spark.worker.cleanup.interval 1800 (30 minutes) worker清理本地應用工作目錄的時間間隔(秒)
spark.worker.cleanup.appDataTtl 7 * 24 * 3600 (7 days) 清理多久以前的應用的工作目錄。這個選項值將取決於你的磁盤總量。spark應用會將日誌和jar包都放在其對應的工作目錄下。隨著時間流逝,應用的工作目錄很快會占滿磁盤,尤其是在你的應用提交比較頻繁的情況下。

連接到集群

要在Spark集群上運行一個應用,隻需把spark://IP:PORT這個master URL傳給SparkContext(參考SparkContext constructor

如需要運行交互式的spark shell,運行如下命令:

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

你也可以通過設置選線 –total-executor-cores <numCores> 來控製spark-shell在集群上使用的CPU總數。

啟動Spark應用

spark-submit腳本(spark-submit script )是提交spark應用最簡潔的方式。對於獨立安裝的集群來說,spark目前支持兩種運行模式。客戶端(client)模式下,驅動器進程(driver)將在提交應用的機器上啟動。而在集群(cluster)模式下,驅動器(driver)將會在集群中的某一台worker上啟動,同時提交應用的客戶端在提交動作完成之後立即退出,而不會等到Spark應用運行結束。

如果你的應用時通過spark-submit提交啟動的,那麼應用對應的jar包會自動發布到所有的worker節點上。任何額外的依賴項jar包,都必須在–jars參數中指明,並以逗號分隔(如:–jars jar1,jar2)。

另外,獨立安裝的集群還支持異常退出(返回值非0)時自動重啟。要啟用這個特性,你需要在spark-submit時指定–supervise參數。其後,如果你需要殺掉一個重複失敗的應用,你可能需要運行如下指令:

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

你可以在master web UI(https://<master url>:8080)上查看驅動器ID。

資源調度

獨立安裝集群目前隻支持簡單的先進先出(FIFO)調度器。這個調度器可以支持多用戶,你可以控製每個應用所使用的最大資源。默認情況下,Spark應用會申請集群中所有的CPU,這不太合理,除非你的進群同一時刻隻運行一個應用。你可以通過SparkConf中的spark.cores.max,來設置一個CPU帽子以限製其使用的CPU總數。例如:

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

另外,你也可以通過conf/spark-env.sh中的spark.deploy.defaultCores設置應用默認使用的CPU個數(特別針對沒有設置spark.cores.max的應用)。

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

在一些共享的集群上,用戶很可能忘記單獨設置一個最大CPU限製,那麼這個參數將很有用。

監控和日誌

Spark獨立安裝模式提供了一個基於web的集群監控用戶界麵。master和每個worker都有其對應的web UI,展示集群和Spark作業的統計數據。默認情況下,你可以在master機器的8080端口上訪問到這個web UI。這個端口可以通過配置文件或者命令行來設置。

另外,每個作業的詳細日誌,將被輸出到每個slave節點上的工作目錄下(默認為:${SPARK_HOME}/work)。每個Spark作業下都至少有兩個日誌文件,stdout和stderr,這裏將包含所有的輸出到控製台的信息。

和Hadoop同時運行

你可以讓Spark和已有的Hadoop在同一集群上同時運行,隻需要將Spark作為獨立的服務啟動即可。這樣Spark可以通過hdfs:// URL來訪問Hadoop上的數據(通常情況下是,hdfs://<namenode>:9000/path,你可以在Hadoop Namenode的web UI上找到正確的鏈接)。當然,你也可以為Spark部署一個獨立的集群,這時候Spark仍然可以通過網絡訪問HDFS上的數據;這會比訪問本地磁盤慢一些,但如果Spark和Hadoop集群都在同一個本地局域網內的話,問題不大(例如,你可以在Hadoop集群的每個機架上新增一些部署Spark的機器)。

網絡安全端口配置

Spark會大量使用網絡資源,而有些環境會設置嚴密的防火牆設置,以嚴格限製網絡訪問。完整的端口列表,請參考這裏:security page.

高可用性

默認情況下,獨立調度的集群能夠容忍worker節點的失敗(在Spark本身來說,它能夠將失敗的工作移到其他worker節點上)。然而,調度器需要master做出調度決策,而這(默認行為)會造成單點失敗:如果master掛了,任何應用都不能提交和調度。為了繞過這個單點問題,我們有兩種高可用方案,具體如下:

基於Zookeeper的熱備master

概要

利用Zookeeper來提供領導節點選舉以及一些狀態數據的存儲,你可以在集群中啟動多個master並連接到同一個Zookeeper。其中一個將被選舉為“領導”,而另一個將處於備用(standby)狀態。如果“領導”掛了,則另一個master會立即被選舉,並從Zookeeper恢複已掛“領導”的狀態,並繼續調度。整個恢複流程(從“領導”掛開始計時)可能需要1到2分鍾的時間。注意,整個延時隻會影響新增應用 – 已經運行的應用不會受到影響。

更多關於Zookeeper信息請參考這裏:here

配置

要啟用這種恢複模式,你可以在spark-env中設置 SPARK_DAEMON_JAVA_OPTS,可用的屬性如下:

係統屬性 含義
spark.deploy.recoveryMode 設為ZOOKEEPER以啟用熱備master恢複模式(默認空)
spark.deploy.zookeeper.url Zookeeper集群URL(如:192.168.1.100:2181,192.168.1.101:2181)
spark.deploy.zookeeper.dir 用於存儲可恢複狀態的Zookeeper目錄(默認 /spark)

可能的問題:如果你有多個master,但沒有正確設置好master使用Zookeeper的配置,那麼這些master彼此都不可見,並且每個master都認為自己是“領導”。這件會導致整個集群處於不穩定狀態(多個master都會獨立地進行調度)

詳細

如果你已經有一個Zookeeper集群,那麼啟動高可用特性是很簡單的。隻需要在不同節點上啟動多個master,並且配置相同的Zookeeper(包括Zookeeper URL和目錄)即可。masters可以隨時添加和刪除。

在調度新提交的Spark應用或者新增worker節點時,需要知道當前”領導“的IP地址。你隻需要將以前單個的master地址替換成多個master地址即可。例如,你可以在SparkContext中設置master URL為spark://host1:port1.host2:port2。這會導致SparkContext在兩個master中都進行登記 – 那麼這時候,如果host1掛了,這個應用的配置同樣可以在新”領導“(host2)中找到。

”在master注冊“和普通操作有一個顯著的區別。在Spark應用或worker啟動時,它們需要找當前的”領導“master,並在該master上注冊。一旦注冊成功,它們的狀態將被存儲到Zookeeper上。如果”老領導“掛了,”新領導“將會聯係所有之前注冊過的Spark應用和worker並通知它們領導權的變更,所以Spark應用和worker在啟動時甚至沒有必要知道”新領導“的存在。

由於這一特性,新的master可以在任何時間添加進來,你唯一需要關注的就是,新的應用或worker能夠訪問到這個master。總之,隻要應用和worker注冊成功,其他的你都不用管了。

基於本地文件係統的單點恢複

概要

利用Zookeeper當然是生成環境下高可用的最佳選擇,但有時候你仍然希望在master掛了的時候能夠重啟之,FILESYSTEM模式能幫你實現這一需求。當應用和worker注冊到master的時候,他們的狀態都將被寫入文件係統目錄中,一旦master掛了,你隻需要重啟master,這些狀態都能夠恢複。

配置

要使用這種恢複模式,你需要在spark-env中設置SPARK_DAEMON_JAVA_OPTS,可用的屬性如下:

係統屬性 含義
spark.deploy.recoveryMode 設為FILESYSTEM以啟用單點恢複模式(默認空)
spark.deploy.recoveryDirectory 用於存儲可恢複狀態數據的目錄,master進程必須有訪問權限

Details(詳細)

  • 這個解決方案可以用於和一些監控、管理係統進行串聯(如:monit),或者與手動重啟相結合。
  • 至少,基於文件係統工單恢複總比不能恢複強;同時,這種恢複模式也會是開發或者實驗場景下的不錯的選擇。在某些情況下,通過stop-master.sh殺死master可能不會清理其狀態恢複目錄下的數據,那麼這時候你啟動或重啟master,將會進入恢複模式。這可能導致master的啟動時間長達一分鍾(master可能要等待之前注冊的worker和客戶端超時)。
  • 你也可以使用NFS目錄來作為數據恢複目錄(雖然這不是官方聲明支持的)。如果老的master掛了,你可以在另一個節點上啟動master,這個master隻要能訪問同一個NFS目錄,它就能夠正確地恢複狀態數據,包括之前注冊的worker和應用(等價於Zookeeper模式)。後續的應用必須使用新的master來進行注冊。
  • 轉載自 並發編程網 - ifeve.com

最後更新:2017-05-19 17:31:50

  上一篇:go  圖解微服務架構演進
  下一篇:go  《Spark 官方文檔》在Amazon EC2上運行Spark