提交Spark任務(wù)的三種方式 | 您所在的位置:網(wǎng)站首頁(yè) › 母親屬鼠孩子屬豬好嗎女孩 › 提交Spark任務(wù)的三種方式 |
在使用Spark的過(guò)程中,一般都會(huì)經(jīng)歷調(diào)試,提交任務(wù)等等環(huán)節(jié),如果每個(gè)環(huán)節(jié)都可以確認(rèn)程序的輸入結(jié)果,那么無(wú)疑對(duì)加快代碼的調(diào)試起了很大的作用,現(xiàn)在,借助IDEA可以非常快捷方便的對(duì)Spark代碼進(jìn)行調(diào)試,在借助IDEA來(lái)完成Spark時(shí),可以大致通過(guò)以下幾個(gè)步驟來(lái)完成: 初始構(gòu)建項(xiàng)目階段,使用Local模式本地運(yùn)行項(xiàng)目大致完成階段,使用IDEA連接集群自動(dòng)提交任務(wù)運(yùn)行最終部署運(yùn)行階段,手動(dòng)將源碼包上傳到集群并使用 spark-submit 提交任務(wù)運(yùn)行下面,針對(duì)三種方式分別舉例說(shuō)明每種方式需要注意的地方。 使用IDEA本地運(yùn)行(Local模式)代碼語(yǔ)言:javascript復(fù)制本地運(yùn)行,本地計(jì)算,本地輸出,與集群無(wú)關(guān)代碼語(yǔ)言:javascript復(fù)制import org.apache.log4j.{Level, Logger} import org.apache.spark.{SparkConf, SparkContext} object demo { def main(args: Array[String]) { Logger.getLogger("org.apache.spark").setLevel(Level.WARN) Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF) val conf = new SparkConf().setAppName("DemoApp").setMaster("local") val sc = new SparkContext(conf) val data = sc.makeRDD(Seq(1,2,3,4,5,6,7,8,9)) data.map{ x =>{ (x,s"My number is $x") } }.foreach(println) } }![]() 注意: 1. 此處打包時(shí)需要將環(huán)境依賴包含在內(nèi) 2. 注意勾選 Include in build,然后 Rebuild Module 即可打包 ![]() 3. 代碼內(nèi)需要指定jar包的具體路徑(setJar)和主節(jié)點(diǎn)(setMaster) ![]() 4. 注意setMaster地址就是webUI中置頂?shù)牡刂?/p> 5. 注意這種方式的代碼輸出 這種方式 rdd.foreach(println) 或者是一般的 println() 都不能在 Console 打印出結(jié)果,如果希望在控制臺(tái)打印出特定輸出必須使用 collect() 將數(shù)據(jù)取回本地(這時(shí)可以將本地想象為集群中的一個(gè)節(jié)點(diǎn)),對(duì)于文件也是同理,其作相當(dāng)于對(duì)遠(yuǎn)程hdfs的作,這里不展開(kāi). ![]() 注意: 1. 此時(shí)打包時(shí)只打包源碼文件,即無(wú)需添加環(huán)境依賴 ![]() 2. 此Jar文件內(nèi)只有源碼,一般很小 ![]() 3. 代碼內(nèi) Sparkconf 的獲取不用具體指定 代碼語(yǔ)言:javascript復(fù)制import org.apache.log4j.{Level, Logger} import org.apache.spark.{SparkConf, SparkContext} object demo { def main(args: Array[String]) { Logger.getLogger("org.apache.spark").setLevel(Level.WARN) Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF) val conf = new SparkConf().setAppName("DemoApp") val sc = new SparkContext(conf) val data = sc.makeRDD(Seq(1,2,3,4,5,6,7,8,9)) data.map{ x =>{ (x,s"My number is $x") } }.foreach(println) } }4. 需要使用 spark-submit 命令提交任務(wù) ![]() 上述代碼中,Spark仍然是Local模式,但資源文件卻在遠(yuǎn)程集群的HDFS上,這也是可以運(yùn)行的!這時(shí)訪問(wèn)的資源確實(shí)是遠(yuǎn)程的資源,但是計(jì)算仍然在本地,仍然算做第一種方式(Local模式)。 結(jié)束語(yǔ)在提交任務(wù)的過(guò)程中可能會(huì)遇到各種各樣的問(wèn)題,一般分為task本身的配置項(xiàng)問(wèn)題和Spark集群本身的問(wèn)題兩部分,task本身的配置問(wèn)題一般可以通過(guò): ?- SparkContext().set() 來(lái)設(shè)置,第二種方式即IDEA連接集群 ?- spark-submit添加參數(shù)–executor-memory 來(lái)設(shè)置,即手動(dòng)提交方式 ?- 具體配置項(xiàng)參見(jiàn)[ Spark配置參數(shù) ] 集群本身的問(wèn)題涉及Worker、Master的啟動(dòng)等等,關(guān)聯(lián)的地方較多,在此不進(jìn)行展開(kāi)。 最后,整個(gè)提交過(guò)程的前提是IDEA項(xiàng)目配置和Spark集群環(huán)境的正確,以及兩者正確的匹配(比如打包的1.x版本的Saprk任務(wù)大概率是不能運(yùn)行在Spark2.x的集群上的)。 |
CopyRight 2018-2019 實(shí)驗(yàn)室設(shè)備網(wǎng) 版權(quán)所有 |