在windows下通过的IntelliJ IDEA通过Ant构建工具远程提交Spark应用程序

来源:互联网 发布:java培训机构 知乎 编辑:程序博客网 时间:2024/05/02 00:09

这次看到以前写的这篇文章实在混乱不堪,所以决定修整一下

1、在linux上 已经搭建好了spark集群环境。(已经安装好了JDK、scala、hadoop、yarn、spark等)
2、在windows上已经安装IntelliJ IDEA
3、在windows上安装与集群环境相同版本的windows版的JDK(别忘了配置环境变量)。
4、在windows上安装与集群环境相同版本的windows版scala(这一步不是必须,可以在IDEA中安装scala插件,我用这个是为了方便在ant文件中添加scala的工具包,没有用IDEA自带的scala包)

本地IntelliJ IDEA在编译构件spark程序的时候需要用到下面的库
5、将相同版本的hadoop(已编译)解压到windows任意目录下
例如:D:\Program Files\Java\hadoop-2.7.3(其实就是将hadoop-2.7.3解压到D盘目录下,构建程序的时候需要用到的只是lib目录下的jar包而已)

6、将相同版本的spark(已编译)解压到windows任意目录下
例如:D:\Program Files\Java\spark-2.0.2-bin-hadoop2.7

7、在IntelliJ IDEA创建scala工程

创建scala工程

8、为项目添加library,将spark 目录lib下的所有全部jar包添加为library:

将lib下的所有jar包添加为library

9、如果是建立scala工程系统会自动添加scala的SDK,如果没有可以手动添加scala的SDK library选择

这里写图片描述

10、如果用到额外的jar按自行添加即可
特别说明:
jsch-0.1.53 jar包文件,此文件是ant构建远程传动功能所用到的文件,需要到网上下载并添加进来,可以是其他版本的,功能一样就行了。将此jar包添加到D:\Program Files\Java\IntelliJ IDEA Community Edition 2016.3.2\lib\ant\lib目录下此目录是IDEA的ant/lib目录,当使用ant构建时会自动调用此jar包的功能
JDK的添加更不用说了。

11、配置好的目录结构如下:

这里写图片描述

12、编写一个wordcount 程序

这里写图片描述

13.创建object 伴生对象,程序代码如下

object WordCount {  def main(args: Array[String]) {    val conf = new SparkConf().setAppName("WordCountApp")    //yarn 模式下运行    conf.setMaster("yarn")    //master 节点运行    //conf.setMaster("spark://masterVM:7077")    val sc = new SparkContext(conf)    val line = sc.textFile("/input/*")    line.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _).collect().foreach(println)        sc.stop()  }}

14.使用ant构建不同于一般的java程序,只需要一个antbuild.xml 文件就够了。
添加ant后的目录结构:

这里写图片描述

我的ant构建文件如下:

<?xml version="1.0" encoding="utf-8"?><project name="WordCount" default="all" basedir=".">    <!-- global properties -->    <property name="main-class" value="wordcount.WordCount"/>    <property name="spark.home" value="D:/Program Files/Java/spark-2.0.2-bin-hadoop2.7"/>    <property name="scala.home" value="D:/Program Files/Java/scala_2.11.8"/>    <property name="jar.dir" value="${basedir}/out"/>    <property name="src.dir" value="${basedir}" />    <property name="jarFileName" value="${ant.project.name}.jar" />    <property name="build.dir" value="${basedir}/out/${ant.project.name}" />    <!-- class path settings -->    <path id="build.path.spark">        <pathelement location="${build.dir}" />        <pathelement location="${scala.home}/lib/scala-library.jar" />        <pathelement location="${spark.home}/jars/hadoop-common-2.7.3.jar"/>        <pathelement location="${spark.home}/jars/hadoop-hdfs-2.7.3.jar"/>        <pathelement location="${spark.home}/jars/jackson-annotations-2.6.5.jar"/>        <pathelement location="${spark.home}/jars/jackson-core-2.6.5.jar"/>        <pathelement location="${spark.home}/jars/spark-core_2.11-2.0.2.jar"/>    </path>    <!-- define scalac, fsc, sbaz ... tasks -->    <target name="scala.tasks">        <echo message="初始化..."/>        <taskdef resource="scala/tools/ant/antlib.xml">            <classpath>                <pathelement location="${scala.home}/lib/scala-reflect.jar" />                <pathelement location="${scala.home}/lib/scala-library.jar" />                <pathelement location="${scala.home}/lib/scala-compiler.jar" />            </classpath>        </taskdef>    </target>    <target name="compile" depends="scala.tasks">        <echo message="编译。。。"/>        <mkdir dir="${build.dir}" />        <fsc srcdir="${src.dir}" destdir="${build.dir}" classpathref="build.path.spark" >                <include name="**/**.scala"   />        </fsc>    </target>    <!--对编译后的文件进行打包 -->    <target name="package_jar" depends="compile">        <echo message="将工程打包" />        <jar destfile="${basedir}/out/${jarFileName}" basedir="${build.dir}">            <manifest>                <!--指定main-class-->                <attribute name="Main-Class" value="${main-class}" />            </manifest>        </jar>    </target>    <!-- sftp上传到linux服务器利用hadoop命令运行 -->    <target name="scp_sshexec" depends="package_jar">        <echo message="sftp上传到linux服务器利用hadoop命令运行包" />        <scp                file="${basedir}/out/${jarFileName}"                todir="master:zhfk@192.168.161.135:~/sparkJarsDir"                trust="true">        </scp>        <sshexec                host="192.168.161.135"                username="master"                password="zhfk"                command="source /etc/profile;spark-submit  ~/sparkJarsDir/${jarFileName} "                trust="true" >        </sshexec>    </target>    <!-- 清理工作目录-->    <target name="clean" depends="scp_sshexec">        <echo message="清理工作目录" />        <delete dir="${basedir}/out/" />    </target>    <!--所有的动作完成 -->    <target name="all" depends="clean">    </target></project>

相信用过ant的人都能看懂这代码,这是自己写的简单了点。
主要设置两项参数:
project name=”WordCount” (这个时工程名可以改自己喜欢的名字)
main-class(主类,记得加上包名)
jsch-0.1.53 jar包的作用就是sftp上传到linux服务器利用hadoop命令运行这段。
如果main函数有参数,可以在

 command="source /etc/profile;spark-submit  ~/sparkJarsDir/${jarFileName} "

这一行添加main 参数。
注意点:
1、我的ant文件是放在src目录下某个包下的,这样只编译本包下的文件,如果放在根目录下则要修改源文件的src文件夹,这里要注意一下。
2、 这一项是你所编写的程序所使用到的jar包,不必把liarbry里的jar完全添加,只添加用到的即可(只能手动写进去)

 <!-- class path settings -->    <path id="build.path.spark">        <pathelement location="${build.dir}" />        <pathelement location="${scala.home}/lib/scala-library.jar" />        <pathelement location="${spark.home}/jars/hadoop-common-2.7.3.jar"/>        <pathelement location="${spark.home}/jars/hadoop-hdfs-2.7.3.jar"/>        <pathelement location="${spark.home}/jars/jackson-annotations-2.6.5.jar"/>        <pathelement location="${spark.home}/jars/jackson-core-2.6.5.jar"/>        <pathelement location="${spark.home}/jars/spark-core_2.11-2.0.2.jar"/>    </path>

15、这里是使用scala快速编译器编译程序,添加的是最基础的scala 编译用到的libarbry正如你所看到的一样是对scalac, fsc, sbaz … tasks 等工具的定义导入

 <!-- define scalac, fsc, sbaz ... tasks -->    <target name="scala.tasks">        <echo message="初始化..."/>        <taskdef resource="scala/tools/ant/antlib.xml">            <classpath>                <pathelement location="${scala.home}/lib/scala-reflect.jar" />                <pathelement location="${scala.home}/lib/scala-library.jar" />                <pathelement location="${scala.home}/lib/scala-compiler.jar" />            </classpath>        </taskdef>    </target>

16、最后确定这里配置的服务器参数是否正确

 <!-- sftp上传到linux服务器利用hadoop命令运行 -->    <target name="scp_sshexec" depends="package_jar">        <echo message="sftp上传到linux服务器利用hadoop命令运行包" />        <scp                file="${basedir}/out/${jarFileName}"                todir="master:zhfk@192.168.161.135:~/sparkJarsDir"                trust="true">        </scp>        <sshexec                host="192.168.161.135"                username="master"                password="zhfk"                command="source /etc/profile;spark-submit  ~/sparkJarsDir/${jarFileName} "                trust="true" >        </sshexec>    </target>

17、添加到ant控制板中(可以从菜单中调出),按运行按钮,提交程序。

这里写图片描述

点击ant控制板中的运行按钮一个进行工程的编译,构建,打包,上传,并在集群下运行,这些功能已经全部在ant.xml文件中定义。
以下是部分运行结果:

"C:\Program Files\Java\jdk1.8.0_111\bin\java" -Xmx128m -Xss2m "-Dant.home=D:\Program Files\Java\IntelliJ IDEA Community Edition 2016.3.2\lib\ant" "-Dant.library.dir=D:\Program Files\Java\IntelliJ IDEA Community Edition 2016.3.2\lib\ant\lib" -Dfile.encoding=UTF-8 -classpath "D:\Program Files\Java\IntelliJ IDEA Community Edition 2016.3.2\lib\ant\lib\ant-antlr.jar;D:\Program Files\Java\IntelliJ IDEA Community Edition 2016.3.2\lib\ant\lib\ant-apache-bcel.jar;D:\Program Files\Java\IntelliJ IDEA Community Edition 2016.3.2\lib\ant\lib\ant-apache-bsf.jar;D:\Program Files\Java\IntelliJ IDEA Community Edition 2016.3.2\lib\ant\lib\ant-apache-log4j.jar;D:\Program Files\Java\IntelliJ IDEA Community Edition 2016.3.2\lib\ant\lib\ant-apache-oro.jar;D:\Program Files\Java\IntelliJ IDEA Community Edition 2016.3.2\lib\ant\lib\ant-apache-regexp.jar;D:\Program Files\Java\IntelliJ IDEA Community Edition 2016.3.2\lib\ant\lib\ant-apache-resolver.jar;D:\Program Files\Java\IntelliJ IDEA Community Edition 2016.3.2\lib\ant\lib\ant-apache-xalan2.jar;D:\Program Files\Java\IntelliJ IDEA Community Edition 2016.3.2\lib\ant\lib\ant-commons-logging.jar;D:\Program Files\Java\IntelliJ IDEA Community Edition 2016.3.2\lib\ant\lib\ant-commons-net.jar;D:\Program Files\Java\IntelliJ IDEA Community Edition 2016.3.2\lib\ant\lib\ant-jai.jar;D:\Program Files\Java\IntelliJ IDEA Community Edition 2016.3.2\lib\ant\lib\ant-javamail.jar;D:\Program Files\Java\IntelliJ IDEA Community Edition 2016.3.2\lib\ant\lib\ant-jdepend.jar;D:\Program Files\Java\IntelliJ IDEA Community Edition 2016.3.2\lib\ant\lib\ant-jmf.jar;D:\Program Files\Java\IntelliJ IDEA Community Edition 2016.3.2\lib\ant\lib\ant-jsch.jar;D:\Program Files\Java\IntelliJ IDEA Community Edition 2016.3.2\lib\ant\lib\ant-junit.jar;D:\Program Files\Java\IntelliJ IDEA Community Edition 2016.3.2\lib\ant\lib\ant-junit4.jar;D:\Program Files\Java\IntelliJ IDEA Community Edition 2016.3.2\lib\ant\lib\ant-launcher.jar;D:\Program Files\Java\IntelliJ IDEA Community Edition 2016.3.2\lib\ant\lib\ant-netrexx.jar;D:\Program Files\Java\IntelliJ IDEA Community Edition 2016.3.2\lib\ant\lib\ant-swing.jar;D:\Program Files\Java\IntelliJ IDEA Community Edition 2016.3.2\lib\ant\lib\ant-testutil.jar;D:\Program Files\Java\IntelliJ IDEA Community Edition 2016.3.2\lib\ant\lib\ant.jar;D:\Program Files\Java\IntelliJ IDEA Community Edition 2016.3.2\lib\ant\lib\jsch-0.1.54.jar;C:\Program Files\Java\jdk1.8.0_111\lib\tools.jar;D:\Program Files\Java\IntelliJ IDEA Community Edition 2016.3.2\lib\idea_rt.jar" com.intellij.rt.ant.execution.AntMain2 -logger com.intellij.rt.ant.execution.IdeaAntLogger2 -inputhandler com.intellij.rt.ant.execution.IdeaInputHandler -buildfile D:\IDEA_project\spark_2016.12.28\src\wordcount\z_wordcount.xmlz_wordcount.xmlpropertypropertypathscala.tasksecho初始化...taskdefcompileecho编译。。。mkdirCreated dir: D:\IDEA_project\spark_2016.12.28\src\wordcount\out\WordCountfscCompiling 1 source file to D:\IDEA_project\spark_2016.12.28\src\wordcount\out\WordCount......package_jarecho将工程打包jarBuilding jar: D:\IDEA_project\spark_2016.12.28\src\wordcount\out\WordCount.jarscp_sshexecechosftp上传到linux服务器利用hadoop命令运行包scpConnecting to 192.168.161.135:22done.sshexecConnecting to 192.168.161.135:22cmd : source /etc/profile;spark-submit  ~/sparkJarsDir/WordCount.jar 17/01/11 15:58:24 INFO spark.SparkContext: Running Spark version 2.0.217/01/11 15:58:27 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable17/01/11 15:58:28 INFO spark.SecurityManager: Changing view acls to: master17/01/11 15:58:28 INFO spark.SecurityManager: Changing modify acls to: master...(authorship,,2)(Snappy,1)(JVM,1)(license/LICENSE.caliper.txt,1)(constant-size,1)(apply,7)(indemnity,,1)(IMPLIED,,7)(owner],1)......cleanecho清理工作目录deleteDeleting directory D:\IDEA_project\spark_2016.12.28\src\wordcount\outallAnt build completed with 240 warnings in 2m 23s at 2017/1/11 16:04

本文都是基于最简单的配置,没有优化任何东西,不管怎么样,这套流程可以实现windows主机向linux集群提交程序,并运行,还可以查看运行日志,这样直接在windows下操作感觉省事多了。

0 0
原创粉丝点击