Spark之本地部署,編譯打包以及遠(yuǎn)程提交的條件和可行性:
1.條件:個人電腦主機(jī)(設(shè)為A)與集群服務(wù)器是處于同一個局域網(wǎng)內(nèi)(比如校園網(wǎng))。集群中各個主機(jī)形成一個分布式計(jì)算環(huán)境,也就是相當(dāng)于集群是一個配置好的可用的Hadoop或者Spark集群。
2.原因:在個人電腦上需要用到集群來工作時大多數(shù)情況下是使用JupyterHub或者M(jìn)obaXterm類似遠(yuǎn)程軟件來遠(yuǎn)程進(jìn)入集群的主節(jié)點(diǎn)(Linux系統(tǒng))來提交任務(wù)和編寫代碼。但是其實(shí)這樣步驟會不連貫和繁瑣,因?yàn)橐话銇碚f代碼都是在自己的個人電腦上寫比較方便,遠(yuǎn)程的集群命令行界面和NoteBook等相關(guān)代碼編輯器也是有一定的不方便的時候,且一些文件和數(shù)據(jù)每次編譯好都要先往集群上傳遞一份才行。因此猜測能否使用A進(jìn)行Spark程序的本地編譯打包,然后再使用Spark-Submit或者Spark-Shell遠(yuǎn)程提交給集群跑。
3.可行性:A已經(jīng)安裝和配置好JDK,Spark,Scala等環(huán)境,已經(jīng)可以實(shí)現(xiàn)本地部署,編譯打包(用的本機(jī)的jdk,MVN,Spark等等 )。Win10系統(tǒng)可以在本機(jī)啟動WSL這樣一個Linux子系統(tǒng),在WSL中使用?vim編輯.bashrc文件來寫入在A上安裝好的?JDK,Spark,Scala 等各種包的路徑(比如配置SPARK_HOME、YARN_CONF_DIR、HADOOP_CONF_DIR 要使用hive可能還需要 HIVE_CONF_DIR)。然后再將集群中的Hadoop的各個配置文件(我們從集群中拷貝出hadoop的各個配置文件,我是直接將143節(jié)點(diǎn)的 /etc/Hadoop/conf目錄拷貝過來的,這是一個軟鏈接),拷貝過來A的?HADOOP_CONF_DIR 中(這時候其實(shí)復(fù)制了一份集群的配置文件,因此,集群個主機(jī)的ip端口都擁有了)。 另外,需要將win10 的hosts文件中添加集群各個節(jié)點(diǎn)的主機(jī)名。以上配置完成,即可直接在wsl ubuntu中使用 spark-submit、spark-shell等命令,此時A的角色已經(jīng)作為集群的一個Client了,可以直接提交任務(wù)給集群跑和啟動交互式。
Spark:2.4.0、maven:3.6.3、scala:2.11.12、scalatest:3.0.4(版本要自己去查查對應(yīng)的)
編譯命令:
mvn -T 1C clean package -Dmaven.test.skip=true?
-Dmaven.test.skip=true 表示“不編譯測試模塊”,-pl 表示項(xiàng)目的相應(yīng)模塊(編譯單個包時使用,比如只改了core包),-am 表示同時編譯它的依賴包
打包成Spark可運(yùn)行版:
./dev/make-distribution.sh --name hadoop-3.2-hive-2.3 --tgz -Phadoop-3.2 -Phive-2.3 -Phive-thriftserver -pl core -Pyarn -DskipTests
上述打包過程會編譯整個項(xiàng)目生成各個模塊的jar包,同時在spark項(xiàng)目根目錄下生成dist目錄,并生成tgz壓縮包,實(shí)際上生成的dist包就是我們解壓tgz后的東西。
將集群中的Hadoop的各個配置文件拷貝過來A的?HADOOP_CONF_DIR 中,core-site.xml 需要將net.topology.script.file.name對應(yīng)的值注釋掉,否則會報(bào)錯。
補(bǔ)充:更換集群時只需要新集群主節(jié)點(diǎn)102節(jié)點(diǎn)的 /etc/Hadoop/conf目錄拷貝過來的(yarn那個)替換了A的?HADOOP_CONF_DIR中的之前的那份集群的配置文件的即可。其他不用動。
注意本地的host文件的ip可能不是最新的,需要留意一下。也不是防火墻的問題。
WSL Ubuntu 的.bashrc文件追加內(nèi)容:
export JAVA_HOME=/home/***/java/jdk1.8.0_151
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
export SCALA_HOME=/home/***/scala/scala-2.11.8
export PATH=${SCALA_HOME}/bin:$PATH
export MVN_HOME=/mnt/d/ideaMaven/apache-maven-3.6.3
export PATH=${MVN_HOME}/bin:$PATH
export HADOOP_CONF_DIR=/mnt/d/hadoop-2.6.5/conf
export YARN_CONF_DIR=/mnt/d/hadoop-2.6.5/conf
export SPARK_HOME=/mnt/d/spark_smile/spark-2.4.0/dist
任務(wù)提交:
spark-shell --master yarn …………
spark-submit --master yarn …………
結(jié)果,看app_ID:


猜測:
既然jar包是在本地進(jìn)行編譯打包的,提交給集群的是打包好的jar包(可運(yùn)行的spark程序)。那是否可以猜測其實(shí)集群中根本不需要安裝Spark,只要有Hadoop和jdk,jvm就行?
(補(bǔ)充)關(guān)于Maven的配置問題:




09-20更新:由于目前有兩個可用集群,大的和小的。因此idea的terminal還是使用小集群,而大集群的使用則通過102的shell界面的命令行命令來上傳hdfs文件和打包好的程序jar包,然后spark-submit或者spark-shell來提交程序,先傳進(jìn)102本地目錄里。
//spark-submit --jars spark-nlp.jar --class Main app.jar
//spark-submit --class org.apache.spark.Bspml.BspBinaryClassificationSVM --master yarn --deploy-mode cluster --name BspBinaryClassificationSVM --jars spark-bsp_2.11-2.4.0.jar spark-bsp_2.11-2.4.0.jar
//spark-submit --class org.apache.spark.Bspml.BspBinaryClassificationSVM --master yarn --deploy-mode cluster --jars spark-rsp_2.11-2.4.0.jar spark-rsp_2.11-2.4.0.jar
//spark-submit --class org.apache.spark.Bspml.BspBinaryClassificationSVM --master yarn --deploy-mode client --jars spark-rsp_2.11-2.4.0.jar spark-rsp_2.11-2.4.0.jar
//使用client部署模式的話 driver在提交任務(wù)的節(jié)點(diǎn)(本機(jī))上啟動,返回值也會返回到本機(jī),所以能顯示出最后的返回值,如果使用cluster就不會,因?yàn)閏luster模式是在集群中任意選擇一個worker來啟動driver。