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。