Spark之本地部署,編譯打包以及遠程提交的條件和可行性:
1.條件:個人電腦主機(設為A)與集群服務器是處于同一個局域網內(比如校園網)。集群中各個主機形成一個分布式計算環境,也就是相當于集群是一個配置好的可用的Hadoop或者Spark集群。
2.原因:在個人電腦上需要用到集群來工作時大多數情況下是使用JupyterHub或者MobaXterm類似遠程軟件來遠程進入集群的主節點(Linux系統)來提交任務和編寫代碼。但是其實這樣步驟會不連貫和繁瑣,因為一般來說代碼都是在自己的個人電腦上寫比較方便,遠程的集群命令行界面和NoteBook等相關代碼編輯器也是有一定的不方便的時候,且一些文件和數據每次編譯好都要先往集群上傳遞一份才行。因此猜測能否使用A進行Spark程序的本地編譯打包,然后再使用Spark-Submit或者Spark-Shell遠程提交給集群跑。
3.可行性:A已經安裝和配置好JDK,Spark,Scala等環境,已經可以實現本地部署,編譯打包(用的本機的jdk,MVN,Spark等等 )。Win10系統可以在本機啟動WSL這樣一個Linux子系統,在WSL中使用?vim編輯.bashrc文件來寫入在A上安裝好的?JDK,Spark,Scala 等各種包的路徑(比如配置SPARK_HOME、YARN_CONF_DIR、HADOOP_CONF_DIR 要使用hive可能還需要 HIVE_CONF_DIR)。然后再將集群中的Hadoop的各個配置文件(我們從集群中拷貝出hadoop的各個配置文件,我是直接將143節點的 /etc/Hadoop/conf目錄拷貝過來的,這是一個軟鏈接),拷貝過來A的?HADOOP_CONF_DIR 中(這時候其實復制了一份集群的配置文件,因此,集群個主機的ip端口都擁有了)。 另外,需要將win10 的hosts文件中添加集群各個節點的主機名。以上配置完成,即可直接在wsl ubuntu中使用 spark-submit、spark-shell等命令,此時A的角色已經作為集群的一個Client了,可以直接提交任務給集群跑和啟動交互式。
Spark:2.4.0、maven:3.6.3、scala:2.11.12、scalatest:3.0.4(版本要自己去查查對應的)
編譯命令:
mvn -T 1C clean package -Dmaven.test.skip=true?
-Dmaven.test.skip=true 表示“不編譯測試模塊”,-pl 表示項目的相應模塊(編譯單個包時使用,比如只改了core包),-am 表示同時編譯它的依賴包
打包成Spark可運行版:
./dev/make-distribution.sh --name hadoop-3.2-hive-2.3 --tgz -Phadoop-3.2 -Phive-2.3 -Phive-thriftserver -pl core -Pyarn -DskipTests
上述打包過程會編譯整個項目生成各個模塊的jar包,同時在spark項目根目錄下生成dist目錄,并生成tgz壓縮包,實際上生成的dist包就是我們解壓tgz后的東西。
將集群中的Hadoop的各個配置文件拷貝過來A的?HADOOP_CONF_DIR 中,core-site.xml 需要將net.topology.script.file.name對應的值注釋掉,否則會報錯。
補充:更換集群時只需要新集群主節點102節點的 /etc/Hadoop/conf目錄拷貝過來的(yarn那個)替換了A的?HADOOP_CONF_DIR中的之前的那份集群的配置文件的即可。其他不用動。
注意本地的host文件的ip可能不是最新的,需要留意一下。也不是防火墻的問題。
WSL Ubuntu 的.bashrc文件追加內容:
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
任務提交:
spark-shell --master yarn …………
spark-submit --master yarn …………
結果,看app_ID:
猜測:
既然jar包是在本地進行編譯打包的,提交給集群的是打包好的jar包(可運行的spark程序)。那是否可以猜測其實集群中根本不需要安裝Spark,只要有Hadoop和jdk,jvm就行?
(補充)關于Maven的配置問題:
09-20更新:由于目前有兩個可用集群,大的和小的。因此idea的terminal還是使用小集群,而大集群的使用則通過102的shell界面的命令行命令來上傳hdfs文件和打包好的程序jar包,然后spark-submit或者spark-shell來提交程序,先傳進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在提交任務的節點(本機)上啟動,返回值也會返回到本機,所以能顯示出最后的返回值,如果使用cluster就不會,因為cluster模式是在集群中任意選擇一個worker來啟動driver。