Apache Spark技术实战之6 -- spark-submit常见问题及其解决
除本人同意外,嚴(yán)禁一切轉(zhuǎn)載,徽滬一郎。
概要
編寫(xiě)了獨(dú)立運(yùn)行的Spark Application之后,需要將其提交到Spark Cluster中運(yùn)行,一般會(huì)采用spark-submit來(lái)進(jìn)行應(yīng)用的提交,在使用spark-submit的過(guò)程中,有哪些事情需要注意的呢?
本文試就此做一個(gè)小小的總結(jié)。
spark-defaults.conf
Spark-defaults.conf的作用范圍要搞清楚,編輯driver所在機(jī)器上的spark-defaults.conf,該文件會(huì)影響 到driver所提交運(yùn)行的application,及專門(mén)為該application提供計(jì)算資源的executor的啟動(dòng)參數(shù)
只需要在driver所在的機(jī)器上編輯該文件,不需要在worker或master所運(yùn)行的機(jī)器上編輯該文件
舉個(gè)實(shí)際的例子
spark.executor.extraJavaOptions -XX:MaxPermSize=896m spark.executor.memory 5g spark.serializer org.apache.spark.serializer.KryoSerializer spark.cores.max 32 spark.shuffle.manager SORT spark.driver.memory 2g?上述配置表示為該application提供計(jì)算資源的executor啟動(dòng)時(shí), heap memory需要有5g。
這里需要引起注意的是,如果worker在加入cluster的時(shí)候,申明自己所在的機(jī)器只有4g內(nèi)存,那么為上述的application分配executor是,該worker不能提供任何資源,因?yàn)?g<5g,無(wú)法滿足最低的資源需求。
spark-env.sh
spark-env.sh中最主要的是指定ip地址,如果運(yùn)行的是master,就需要指定SPARK_MASTER_IP,如果準(zhǔn)備運(yùn)行driver或worker就需要指定SPARK_LOCAL_IP,要和本機(jī)的IP地址一致,否則啟動(dòng)不了。
配置舉例如下
export SPARK_MASTER_IP=127.0.0.1 export SPARK_LOCAL_IP=127.0.0.1啟動(dòng)spark集群
第一步啟動(dòng)master
$SPARK_HOME/sbin/start-master.sh第二步啟動(dòng)worker
$SPARK_HOME/bin/spark-class org.apache.spark.deploy.worker.Worker spark://master:7077將master替換成MASTER實(shí)際運(yùn)行的ip地址
如果想在一臺(tái)機(jī)器上運(yùn)行多個(gè)worker(主要是用于測(cè)試目的),那么在啟動(dòng)第二個(gè)及后面的worker時(shí)需要指定—webui-port的內(nèi)容,否則會(huì)報(bào)端口已經(jīng)被占用的錯(cuò)誤,啟動(dòng)第二個(gè)用的是8083,第三個(gè)就用8084,依此類(lèi)推。
$SPARK_HOME/bin/spark-class org.apache.spark.deploy.worker.Worker spark://master:7077–webui-port 8083?這種啟動(dòng)worker的方式只是為了測(cè)試是啟動(dòng)方便,正規(guī)的方式是用SPARK_HOME/sbin/start-slaves.sh來(lái)啟動(dòng)多個(gè)worker,由于涉及到ssh的配置,比較麻煩,我這是圖簡(jiǎn)單的辦法。
用$SPARK\_HOME/sbin/start-slave.sh$來(lái)啟動(dòng)worker時(shí)有一個(gè)默認(rèn)的前提,即在每臺(tái)機(jī)器上$SPARK_HOME必須在同一個(gè)目錄。
使用相同的用戶名和用戶組來(lái)啟動(dòng)Master和Worker,否則Executor在啟動(dòng)后會(huì)報(bào)連接無(wú)法建立的錯(cuò)誤。
我在實(shí)際的使用當(dāng)中,遇到”no route to host”的錯(cuò)誤信息,起初還是認(rèn)為網(wǎng)絡(luò)沒(méi)有配置好,后來(lái)網(wǎng)絡(luò)原因排查之后,忽然意識(shí)到有可能使用了不同的用戶名和用戶組,使用相同的用戶名/用戶組之后,問(wèn)題消失。
spark-submit
spark集群運(yùn)行正常之后,接下來(lái)的問(wèn)題就是提交application到集群運(yùn)行了。
Spark-submit用于Spark application的提交和運(yùn)行,在使用這個(gè)指令的時(shí)候最大的困惑就是如何指定應(yīng)用所需要的依賴包。
首先查看一下spark-submit的幫助文件
$SPARK_HOME/bin/submit --help有幾個(gè)選項(xiàng)可以用來(lái)指定所依賴的庫(kù),分別為
- --driver-class-path driver所依賴的包,多個(gè)包之間用冒號(hào)(:)分割
- --jars ? driver和executor都需要的包,多個(gè)包之間用逗號(hào)(,)分割
為了簡(jiǎn)單起見(jiàn),就通過(guò)—jars來(lái)指定依賴,運(yùn)行指令如下
$SPARK_HOME/bin/spark-submit –class 應(yīng)用程序的類(lèi)名 \ --master spark://master:7077 \ --jars 依賴的庫(kù)文件 \ spark應(yīng)用程序的jar包需要提醒的時(shí),這些上傳到worker的文件,需要定時(shí)做手工清理,否則會(huì)占用許多磁盤(pán)空間
問(wèn)題1
由于Spark在計(jì)算的時(shí)候會(huì)將中間結(jié)果存儲(chǔ)到/tmp目錄,而目前l(fā)inux又都支持tmpfs,其實(shí)說(shuō)白了就是將/tmp目錄掛載到內(nèi)存當(dāng)中。
那么這里就存在一個(gè)問(wèn)題,中間結(jié)果過(guò)多導(dǎo)致/tmp目錄寫(xiě)滿而出現(xiàn)如下錯(cuò)誤
No Space Left on the device解決辦法就是針對(duì)tmp目錄不啟用tmpfs,修改/etc/fstab
問(wèn)題2
有時(shí)可能會(huì)遇到java.lang.OutOfMemory, unable to create new native thread的錯(cuò)誤,導(dǎo)致這種錯(cuò)誤的原因比較多。
有一種情況并非真的是內(nèi)存不足引起的,而是由于超出了允許的最大文件句柄數(shù)或最大進(jìn)程數(shù)。
排查的步驟就是查看一下允許打開(kāi)的文件句柄數(shù)和最大進(jìn)程數(shù),如果數(shù)值過(guò)低,使用ulimit將其調(diào)高之后,再試試問(wèn)題是否已經(jīng)解決。
ulimit -a修改允許打開(kāi)的最大進(jìn)程數(shù)
ulimit -u 65535修改允許打開(kāi)的文件句柄
ulimit -n 65535spark-shell
上面講述了spark-submit提交Spark Application如何解決依賴庫(kù)的問(wèn)題,那如果是spark-shell的話,該怎么辦呢?
spark-shell的話,利用--driver-class-path選項(xiàng)來(lái)指定所依賴的jar文件,注意的是--driver-class-path后如果需要跟著多個(gè)jar文件的話,jar文件之間使用冒號(hào)(:)來(lái)分割。
小結(jié)
本文部分內(nèi)容已由本人徽滬一郎在CSDN中通過(guò)”使用Spark+Cassandra打造高性能數(shù)據(jù)分析平臺(tái)“發(fā)表。
轉(zhuǎn)載于:https://www.cnblogs.com/hseagle/p/4052572.html
總結(jié)
以上是生活随笔為你收集整理的Apache Spark技术实战之6 -- spark-submit常见问题及其解决的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JQuery iframe 刷新效果
- 下一篇: mysql配置文件检查方法