目录
1.如何在Maven项目中加入Scala源码
在Maven项目中加入Scala,一种比较规整的方式是:
- 构建普通Maven项目
- 右键项目-Configure-Add Scala Nature
- 在main文件夹下新建一个名为Scala的Source Folder(右键项目-New-Package-src/main/scala),与Java并列,Scala文件放在Scala下,Java文件放在Java下,两文件夹下可以有相同的包(两文件夹下分别创建一个同名的包)。
- 通过在pom.xml中添加plugins,使项目能编译scala源码
<build>
<plugins>
<plugin>
<groupId>org.scala-tools</groupId>
<artifactId>maven-scala-plugin</artifactId>
<version>2.15.2</version>
<executions>
<execution>
<id>scala-compile-first</id>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<includes>
<include>**/*.scala</include>
</includes>
</configuration>
</execution>
<execution>
<id>scala-test-compile</id>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
- 编写源码
- 使用mvn clean scala:compile compile package编译打包。
传统的命令只能编译打包Java源码,这种方式使用maven-scala-plugin插件提供的选项scala:compile编译Scala源码。先编译scala,再编译java,最后打包。
2.构建测试提交Spark项目的流程
2.1 流程
-
在Windows环境下用IDE(如Eclipse)以local模式编写源码,并测试
需启动Windows下的HDFS,文件路径为
hdfs://127.0.0.1:9000/input/文件名
或不使用HDFS而使用本地文件系统下的文件,文件路径为
file:///E://...
-
将上述项目打包、用cmd提交测试(可跳过)
-
将代码改写成standalone模式下的代码
-
打包
-
在虚拟机集群上提交测试
需启动HDFS和Spark集群,文件路径为
hdfs://192.168.100.10:8020/input/文件名
如果不使用HDFS,则为
file:///.../文件名
其中,具体ip、端口号、路径按自己设置的。在两种模式中,我一般都使用HDFS下的路径。
2.2 不同模式下初始化SparkContext的区别
(1)local模式
val conf=new SparkConf().setMaster("local").setAppName("jobname")
val spark=new SparkContext(conf)
其中,
- local: 所有计算都运行在一个线程当中,没有任何并行计算,通常我们在本机执行一些测试代码,或者练手,就用这种模式。
- local[K]: 指定使用几个线程来运行计算,比如local[4]就是运行4个worker线程。通常我们的cpu有几个core,就指定几个线程,最大化利用cpu的计算能力
- local[*]: 这种模式直接帮你按照cpu最多cores来设置线程数了。
提交任务的命令
E:\Spark\spark-2.4.3-bin-hadoop2.7\bin>
spark-submit --class 主类所在package名.主类名 --master local jar包位置\jar
例: spark-submit --class pca.PCAMain --master local E:\\Spark\myjars\PcaSpark-0.0.1-SNAPSHOT-jar-with-dependencies.jar
(2)standalone模式
val conf=new SparkConf().setAppName("jobname")
val spark=new SparkContext(conf)
提交任务的命令
/opt/modules/hadoopentire/spark-2.4.3/bin/spark-submit --class 主类所在包名.主类名 --master spark://192.168.100.10:7077 jar包位置/jar包名
例: /opt/modules/hadoopentire/spark-2.4.3/bin/spark-submit --class pca.PCAMain --master spark://192.168.100.10:7077 /opt/data/input/pca.jar
2.3 带args输入参数
源代码中,主函数的参数列表不用变,得到的都是String类型
Java: xxx=args[0];
xxx=args[1];
Scala: xxx=args(0);
xxx=args(1);
Eclipse中测试,右键主类-Run As-Run Configurations-Scala Application-Arguments选项卡-在Program arguments里输入参数-Apply-Run 如果是Java直接点到选项卡即可
命令行命令:后面的参数不用带引号
java -jar xxx.jar 参数1 参数2 参数n
spark-submit ...... /xxx.jar 参数1 参数2 参数n
2.4 pom.xml文件的常用配置:
<properties>
<scala.version>2.11</scala.version>
<spark.version>2.4.3</spark.version>
<hadoop.version>2.7.0</hadoop.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_${scala.version}</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_${scala.version}</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_${scala.version}</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_${scala.version}</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>2.11.8</version>
</dependency>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-compiler</artifactId>
<version>2.11.8</version>
</dependency>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-reflect</artifactId>
<version>2.11.8</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.specs</groupId>
<artifactId>specs</artifactId>
<version>1.2.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>gov.nist.math</groupId>
<artifactId>jama</artifactId>
<version>1.0.3</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.scala-tools</groupId>
<artifactId>maven-scala-plugin</artifactId>
<version>2.15.2</version>
<executions>
<execution>
<id>scala-compile-first</id>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<includes>
<include>**/*.scala</include>
</includes>
</configuration>
</execution>
<execution>
<id>scala-test-compile</id>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>
org.scala-tools
</groupId>
<artifactId>
maven-scala-plugin
</artifactId>
<versionRange>
[2.15.2,)
</versionRange>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore></ignore>
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
参考文章
scala和maven整合实践
eclipse+scala+java+maven 整合实践
eclipse + maven + scala+spark环境搭建
Maven打包Java版的spark程序到jar包,本地Windows测试,上传到集群中运行
在Windows平台安装Hadoop&&idea调试spark程序(scala版)
Spark启动时的master参数以及Spark的部署方式
eclipse如何输入args参数
命令行运行jar 并传参数