本文主要翻譯至鏈接且不局限于該文內容,也加入了筆者實踐內容丽猬,翻譯水平有限宿饱,歡迎指正,轉載請注明出處脚祟。
除了運行在Mesos和YARN集群管理模式上谬以,Spark也支持簡單的獨立部署模式。你可以通過手工啟動一個master進程(主管理進程)和若干workers進程(工作者進程)或者使用腳本兩種方式來啟動一個獨立模式的集群由桌。獨立模式允許在其他機器上運行這些鏡像为黎,并進行測試邮丰。
安裝
你可以通過已經構件好的各個發(fā)布版來安裝Spark,也可以按照這個教程自己完成構建铭乾。
筆者下載了spark-2.1.0-bin-hadoop2.7發(fā)布版剪廉,解壓之后的目錄如下:
啟動
你可以通過如下命令啟動一個獨立模式的master服務:
./sbin/start-master.sh
啟動后,master服務會打印出服務地址(后文中使用master-spark-URL來表示這個地址)炕檩,形如spark://HOST:PORT斗蒋,該地址就是workers服務連接的地址,執(zhí)行作業(yè)時傳遞給SparkContext的“master”參數(shù)笛质,也是這個地址泉沾。你還可以通過訪問“http://localhost:8080” (默認,后文中使用master web UI來表示)來查看spark集群的基本情況经瓷,在上面你也可以找到spark master服務的地址爆哑,形如:
類似地,你也可以通過如下命令來啟動一個或若干個連接到master服務的workers進程(一臺機器只能啟動一個worker進程):
./sbin/start-slave.sh <master-spark-URL>
一旦你啟動了一個worker舆吮,你就可以在master web UI中找到這個進程信息揭朝,還包括這個進程使用的CPU、內存(系統(tǒng)的內存中為操作系統(tǒng)留出了1G)等信息色冀,筆者上文的截圖中潭袱,你就可以看到有一個worker連接到了master服務。
下表列舉了所有可以傳遞給master和worker服務的配置選項:
參數(shù) | 含義 |
---|---|
-h HOST, --host HOST | 監(jiān)聽的主機名 |
-i HOST, --ip HOST | 監(jiān)聽的主機名(已廢棄锋恬,使用-h或--host代替) |
-p PORT, --port PORT | 服務監(jiān)聽的端口(master服務默認是7077屯换,worker服默認是隨機端口) |
--webui-port PORT | web UI 服務使用的端口,master服務默認使用8080与学,worker服務默認使用8081 |
-c CORES, --cores CORES | Spark應用程序允許使用的CPU數(shù)量彤悔,默認是所有的CPU,該參數(shù)僅對worker配置有效 |
-m MEM, --memory MEM | Spark應用程序允許使用的內存大小索守,格式形如1000M或2G晕窑,默認情況是機器所有內存減去1G,該參數(shù)僅對worker有效 |
-d DIR卵佛, --work-dir DIR | Spark服務的暫存空間目錄和作業(yè)的logs輸出目錄杨赤,默認是SPARK_HOME/work,該參數(shù)僅對worker有效 |
--properties-file FILE | Spark配置文件加載的文件路徑截汪,默認是conf/spark-defaults.conf |
集群執(zhí)行腳本
使用腳本運行一個獨立模式集群前疾牲,需要先創(chuàng)建一個SPARK_HOME/conf/slaves文件,該文件包含你想啟動的所有worker所在的機器配置衙解,每一條一行阳柔。如果conf/slaves文件不存在,spark會默認在本機啟動一個worker進程蚓峦,可以用這個worker來做測試盔沫。注意医咨,master所在的機器使用ssh來訪問其他worker機器。默認情況下架诞,ssh并行訪問worker機器拟淮,并且這些機器需要安裝免密模式(使用私鑰來登錄)。如果你沒有安裝免密模式谴忧,你可以通過設置環(huán)境變量SPARK_SSH_FOREGROUND來連續(xù)提供每個worker的密碼很泊。
一旦你創(chuàng)建和編輯好了slaves文件,你就可以通過下面這些腳本來運行Spark沾谓,這些腳本在SPARK_HOME/sbin目錄中可以找到委造,他們都是基于Hadoop的部署腳本:
- sbin/start-master.sh - 在該腳本所執(zhí)行的機器上啟動一個master實例
- sbin/start-slaves.sh - 根據conf/slaves機器的配置,啟動每一個worker實例
- sbin/start-slave.sh - 在該腳本所執(zhí)行的機器上啟動一個worker實例
- sbin/start-all.sh - 啟動一個master實例和一系列的worker實例(slaves中配置的實例)
- sbin/stop-master.sh - 停止master實例
- sbin/stop-slaves.sh - 以此停止slaves上配置的所有機器上的worker實例
- sbin/stop-all.sh - 停止master實例和所有worker實例
注意這些腳本都應該在在你想要作為master實例的機器上執(zhí)行均驶,不是你的本機昏兆。
你可以進一步通過在SPARK_HOME/conf/spark-env.sh文件中配置如下這些環(huán)境變量來更改集群的設置,你可以以SPARK_HOME/conf/spark-env.sh.template文件為模板來創(chuàng)建配置文件妇穴,然后拷貝到所有的worker機器以使這些配置生效:
參數(shù) | 含義 |
---|---|
SPARK_MASTER_HOST | 指定master所在的主機名或地址爬虱,必須是一個網絡可達的地址 |
SPARK_MASTER_PORT | 指定master進程的端口,默認是7077腾它,有不同的話必須配置 |
SPARK_MASTER_WEBUI_PORT | 指定master web UI的端口跑筝,默認是8080,有不同的話必須配置 |
SPARK_MASTER_OPTS | master主機的額外配置瞒滴,形如“-Dx=y”曲梗,默認是空,后文會進一步列舉 |
SPARK_LOCAL_DIRS | 指定Spark暫存目錄妓忍,用于存儲在磁盤上的map輸出文件和RDDs虏两,它最好應該是一個本地可以快速訪問的磁盤,可以通過逗號分隔不同磁盤上的多個目錄 |
SPARK_WORKER_CORES | 允許Spark應用程序使用的CPU總數(shù)世剖,默認是所有都可用 |
SPARK_WORKER_MEMORY | 允許Spark應用程序使用的內存總量定罢,例如1000m,2g搁廓,默認是該機器的內存總量減去1G引颈;注意每個Spark應用程序獨立的內存使用spark.executor.memory屬性來配置 |
SPARK_WORKER_PORT | 指定worker啟動的端口耕皮,默認是隨機端口 |
SPARK_WORKER_WEBUI_PORT | 指定worker在web UI中的端口境蜕,默認是8081 |
SPARK_WORKER_DIR | Spark應用程序使用的暫存空間目錄,用于存放日志等凌停,默認是SPARK_HOME/work |
SPARK_WORKER_OPTS | worker主機的額外配置粱年,形如“-Dx=y”,默認是空罚拟,后文會進一步列舉 |
SPARK_DAEMON_MEMORY | 分配給Spark master和worker鏡像進程自身的內存台诗,默認是1g |
SPARK_DAEMON_JAVA_OPTS | Spark master和worker鏡像進程使用的JVM配置完箩,默認是空 |
SPARK_PUBLIC_DNS | Spark master和worker機器的公共的DNS主機名,默認是空 |
注意拉队,上述這些腳本不支持在Windows中執(zhí)行弊知,如果要再Windows系統(tǒng)中使用Spark集群,請手工啟動master和workers粱快。
SPARK_MASTER_OPTS屬性支持如下這些配置:
參數(shù) | 默認值 | 含義 |
---|---|---|
spark.worker.cleanup.enabled | false | 開啟后將會周期性自動清理worker中的Spark應用程序目錄秩彤,注意該屬性只在獨立模式下有效,YARN使用不同的工作模式事哭,并且只有停止運行的應用程序會被清理 |
spark.worker.cleanup.interval | 1800(30分鐘)) | 自動清理的時間周期漫雷,以秒為單位 |
spark.worker.cleanup.appDataTtl | 7243600(7天) | 每個worker實例為應用程序工作目錄保留的時間,以s為單位鳍咱,這是一個存留時間降盹,且應該取決于你的磁盤空間可用量。應用程序在執(zhí)行時將會下載所需的jars文件和產生日志谤辜,隨著時間的推移蓄坏,磁盤可能很快會被占滿,特別是當你頻繁提交和執(zhí)行應用程序的時候 |
spark.worker.ui.compressedLogFileLengthCacheSize | 100 | (比較費解)每辟,對于壓縮的日志文件剑辫,只能通過解壓縮文件來計算未壓縮文件,Spark緩存了壓縮日志文件的未壓縮文件大小渠欺,本屬性用于控制緩存大小 |
連接應用程序到集群
在Spark集群上運行一個應用程序妹蔽,只要通過為SparkContext構造器傳遞master實例所在的URL即可,改地址即spark://IP:PORT挠将。
可以通過如下命令來使用可交互的Spark shell環(huán)境控制集群:
./bin/spark-shell --master spark://IP:PORT
上述命令中可以傳遞選項--total-executor-cores <numCores>來控制spark-shell使用的CPU數(shù)胳岂。
運行Spark應用程序
spark-submit腳本提供了一個最直接的方式來提交已編譯的Spark應用程序,對于獨立模式的集群舔稀,Spark目前支持兩種部署模式乳丰。1)使用client模式,則驅動程序運行在該客戶端所在的進程上内贮,2)使用cluster模式产园,則驅動程序運行在集群里的某一個worker進程上,且該客戶端進程在提交應用程序之后就會退出夜郁,不會等等應用程序的執(zhí)行什燕。
如果你的應用程序通過Spark submit提交,該程序運行所需的jars文件都會自動部署到所有worker節(jié)點竞端。對于你的應用程序依賴的其他附加jars文件屎即,都可以通過 --jars 標識引入(多個jars文件使用英文逗號間隔,例如 --jars jar1,jar2)。更改應用程序配置和執(zhí)行環(huán)境的方式技俐,可以參考鏈接乘陪。
此外,獨立cluster模式支持自動重啟應用程序雕擂,如果該程序是以非零值退出啡邑。如果要使用這個特征,你可以在以spark-submit命令啟動你的應用程序時傳遞 --supervice 標記井赌。如果你想殺掉一個重復失敗的應用程序谣拣,你可以執(zhí)行如下指令:
./bin/spark-class org.apache.spark.deploy.Client kill <master url> <driver ID>
其中的dirver ID,你可以在master web UI(地址:http://<master url>:8080)上找到族展。
資源調度
在提交的多個應用程序中森缠,獨立cluster模式目前只支持簡單的FIFO調度方式。然而仪缸,為了允許多個應用程序并發(fā)執(zhí)行贵涵,你可以通過修改每個應用程序使用的最大資源來控制。默認情況下恰画,它將獲得及群里的所有CPU資源宾茂,這意味著一次只能執(zhí)行一個應用程序。你可以在傳遞給SparkContext的SparkConf類實例中覆蓋 spark.cores.max屬性來修改這一限制拴还,例如:
val conf = new SparkConf()
.setMaster(...)
.setAppName(...)
.set("spark.cores.max", "10")
val sc = new SparkContext(conf)
此外跨晴,你還可以配置master服務上的spark.deploy.defaultCores環(huán)境變量來修改默認值,而不用每次都給應用程序傳遞spark.cores.max值片林。在 conf/spark-env.sh文件后追加一行如下配置:
export SPARK_MASTER_OPTS="-Dspark.deploy.defaultCores=<value>"
監(jiān)控和日志
Spark的獨立模式提供了一個web交互界面來控制集群端盆,master服務和每一個worker都有自己的ui界面以方便查看集群狀態(tài)和作業(yè)的統(tǒng)計。默認情況下费封,可以訪問master主機的8080端口(該端口可以通過前文所述的命令行參數(shù)方式修改)進入該界面焕妙,前文的截圖中可以看到類似的界面。
此外弓摘,作業(yè)運行的日志將會打印在每臺worker機器的工作目錄上(默認是SPARK_HOME/work目錄)焚鹊。你會看到每個作業(yè)有兩個日志文件,stdout和stderr韧献,他們將輸出作業(yè)打印到控制臺的所有信息末患。
與Hadoop一起運行
你可以讓Spark與一個已存在的Hadoop集群一起工作,只要在相同的機器上再啟動單獨的進程锤窑。如果想從Spark訪問Hadoop的數(shù)據璧针,只要使用該數(shù)據在HDFS系統(tǒng)上的地址(正常是形如hdfs://<namenode>:9000,具體的地址你可以在Hadoop Namenode的web界面上找到)果复〕旅В或者渤昌,你可以在獨立的集群上安裝Spark虽抄,然后通過網絡訪問HDFS系統(tǒng)上的數(shù)據走搁,當然這會比上一種方式更慢,因為數(shù)據的傳輸需要經過網絡(如果你是在同一個本地局域網內迈窟,數(shù)據的傳輸速度可能也不會太慢私植,例如你可以將部分Spark機器安裝在與Hadoop同一個機架上,這樣它的副本就可以被快速訪問)车酣。
配置網絡安全
Spark會重度依賴網絡曲稼,而一些環(huán)境對使用嚴格的防火墻設置有著嚴格的要求。你可以在這個鏈接中查看完整的配置湖员。
高可用性
默認情況下贫悄,獨立模式對worker故障具有彈性(Spark自身對無法工作的彈性是通過將它移到其他的worker上)。然而娘摔,這個過程需要使用一個Master服務來進行調度決策窄坦,于是存在一個單點故障的可能:如果Master服務崩潰了,新的應用程序將無法創(chuàng)建凳寺。為了保證可用性鸭津,Spark提供了如下兩種策略:
使用ZooKeeper的備用master
概述
通過利用Zookeeper來提供leader選舉和一些狀態(tài)存儲,你可以在Spark集群內運行多個master服務肠缨,并將它們連接到同一個zookeeper實例逆趋。這些master服務的其中一個將被選舉為“l(fā)eader”提供服務,其他的則作為備用運行晒奕。如果當前的leader掛了闻书,zookeeper會選舉一個新的master服務來充當leader,并應用老master的狀態(tài)脑慧,然后新的master服務將會重新提供調度服務惠窄。整個恢復過程大概花費1到2分鐘,時間從master服務掛了開始算起漾橙。注意杆融,這個延時只會影響新應用程序的調度,在老master掛了期間已經提交執(zhí)行的應用程序不會受到影響霜运。
關于Zookeeper脾歇,可以參考這里。
配置
你可以通過設置spark-env中的SPARK_DAEMON_JAVA_OPTS屬性來啟用恢復模式淘捡,方式是修改 spark.deploy.recoveryMode 和相關的spark.deploy.zookeeper.*配置藕各,詳細的配置請參考這里。
注意:在多master方式運行下焦除,如果你沒有正確的配置zookeeper屬性激况,他們無法正常恢復工作,因為所有的master都會認為自己是leader乌逐,也會單獨進行調度竭讳,造成錯誤的集群狀態(tài)。
細節(jié)
當你安裝了Zookeeper集群后浙踢,啟用高可用性就變得很簡單绢慢。只要使用相同的Zookeeper配置(包括Zookeeper目錄和URL)來啟動多個master服務。master服務可以隨時添加和移除洛波。
為了調度新的應用程序胰舆,或者添加新的worker,他們得知道當前l(fā)eader的IP地址蹬挤,解決方式是傳遞一個master地址列表而不是只傳一個缚窿,例如,你可以在SparkContext上下文中指定master地址為 spark://host1:port1,host2:port2焰扳。SparkContext會嘗試注冊所有的master滨攻,如果host1掛了,host2也能被正確發(fā)現(xiàn)蓝翰。
“注冊到Master服務”與普通操作之間有個很重要的特性光绕。當應用程序或worker啟動時,他們需要能夠找到和注冊到當前的lead master畜份,一旦成功注冊诞帐,他們就會被存到Zookeeper中,一旦出現(xiàn)故障爆雹,新的leader會聯(lián)系之前注冊的應用程序和workers去更新leader已變更的信息停蕉,而在新的master啟動期間,他們無需知道他的存在钙态。
由于這個特質慧起,新的master可以在任意時間創(chuàng)建,你唯一需要擔心的是當新的應用程序或workers啟動時能夠找到成為leader的master并成功注冊册倒。
使用本地文件系統(tǒng)進行單點恢復
概述
使用zookeeper是生產環(huán)境下保證高可用性的最好方式蚓挤,但是如果你只想重啟一下掛掉的master服務,也可以使用本地的文件系統(tǒng)進行恢復驻子。當注冊應用程序和workers時灿意,他們的狀態(tài)將被記錄到指定的暫存目錄中,使得master重啟時可以通過這些狀態(tài)文件恢復他們的狀態(tài)崇呵。
配置
通過在spark-env中設置SPARK_DAEMON_JAVA_OPTS屬性可以激活這一模式缤剧,相關配置如下:
系統(tǒng)屬性 | 含義 |
---|---|
spark.deploy.recoveryMode | 設置為FILESYSTEM可以開啟單機恢復模式,默認不啟用 |
spark.deploy.recoveryDirectory | 該目錄將用來存儲master恢復狀態(tài) |
細節(jié)
- 這個方案可以與一個進行監(jiān)控器例如monit一起工作域慷,也可以只簡單的通過重啟來恢復荒辕。
- 雖然文件系統(tǒng)恢復模式比不適用任何恢復模式要好汗销,但是在開發(fā)或者實驗環(huán)境下建議不必啟用。使用stop-master.sh腳本停止一個master服務時抵窒,Spark不會清空任何恢復狀態(tài)弛针,因此當重啟一個master服務時,它將進入恢復模式估脆,如果他需要等待所有之前的worker/clients超時,就會顯著的增加系統(tǒng)啟動的時間(接近一分鐘)座云。
- 雖然不是官方支持疙赠,但是你可以掛在一個NFS(網絡文件系統(tǒng))目錄來作為恢復目錄,如果master掛了朦拖,你可以在一個新的節(jié)點上啟動master圃阳,這樣也可以恢復所有workers和應用程序的狀態(tài)(等價于Zookeeper恢復)。但是新的應用程序必須能夠找到這個新的master璧帝。