背景
spark maven项目构建不像flink一样官方提供了各个版本的maven archetype, 方便在本地构建相应的项目. 由于官方没有, 所以只能自己基于一个基础的spark scala项目构建maven archetype.
基于scala archetype 构建基础项目
spark scala项目是基于scala项目构建, 所以选择最基本的scala archetype构建项目 再往其中添加spark运行所需的基本依赖包(spark-core, spark-mllib等按需求添加即可)
构建好scala项目并加入spark本地开发依赖的对应版本的Jar包,我选择的spark是最新的3.0版本且scala对应的是2.12版本. 加入spark-core和相关的mllib以及删除不必要的dependencies之后的pom.xml文件如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.myspark</groupId>
<artifactId>test</artifactId>
<version>1.0-SNAPSHOT</version>
<inceptionYear>2008</inceptionYear>
<properties>
<scala.version>2.12.11</scala.version>
<spark.version>3.0.0</spark.version>
<spark.scala.version>2.12</spark.scala.version>
</properties>
<repositories>
<repository>
<id>scala-tools.org</id>
<name>Scala-Tools Maven2 Repository</name>
<url>http://scala-tools.org/repo-releases</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>scala-tools.org</id>
<name>Scala-Tools Maven2 Repository</name>
<url>http://scala-tools.org/repo-releases</url>
</pluginRepository>
</pluginRepositories>
<dependencies>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${scala.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_${spark.scala.version}</artifactId>
<version>${spark.version}</version>
<!-- do not packaged to jar-->
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-mllib_${spark.scala.version}</artifactId>
<version>${spark.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-mllib-local_${spark.scala.version}</artifactId>
<version>${spark.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<sourceDirectory>src/main/scala</sourceDirectory>
<testSourceDirectory>src/test/scala</testSourceDirectory>
</build>
</project>
在此基础项目上构建spark scala archetype
构建archetype
参考官方关于archetype的使用archetype plugin
首先在项目根目录执行mvn archetype:create-from-project
之后会在target/generated-sources/archetype
下面生成一个pom.xml文件 内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.myspark</groupId>
<artifactId>test-archetype</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>maven-archetype</packaging>
<name>test-archetype</name>
<build>
<extensions>
<extension>
<groupId>org.apache.maven.archetype</groupId>
<artifactId>archetype-packaging</artifactId>
<version>3.2.0</version>
</extension>
</extensions>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-archetype-plugin</artifactId>
<version>3.2.0</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
在这一步的时候 有可能遇到报错 settings.xml不存在的情况, 原因是.m2文件夹下没有配置全局的settings.xml. 这个比较好解决, 将maven所在目录的conf下面的settings.xml拷贝一份放到.m2文件夹下即可(要注意的是repository的配置路径 一般默认放.m2下面). target下面的archetype构建好之后 就可以在该目录下使用mvn install 安装在本地了. 值得注意的是生成的pom.xml文件可以更改其artifactId和 name 改成自己想要的即可.
<groupId>org.myspark</groupId>
<artifactId>spark-quickstart-scala</artifactId>
<version>1.0</version>
<packaging>maven-archetype</packaging>
<name>spark-quickstart-scala</name>
在target/generated-sources/archetype
目录下执行mvn install
发现在.m2/repository
目录下增加了archetype的 pom.xml 文件
然后在一个新的空文件夹下面用刚才安装的archetype构建项目即可
写个spark程序测试一下:
object MyApp extends App {
val conf = new SparkConf().setAppName("MyApp").setMaster("local")
val sc = new SparkContext(conf)
val res = sc.parallelize(Array(
Vectors.dense(1.0, 2.0),
Vectors.dense(4.0,5.0),
Vectors.dense(7.0, 8.0)))
val mat = new RowMatrix(res)
println(mat.rows.count())
sc.stop()
}
运行结果:
20/07/22 22:51:09 INFO SparkUI: Stopped Spark web UI at http://192.168.168.104:4040
3
20/07/22 22:51:09 INFO MapOutputTrackerMasterEndpoint: MapOutputTrackerMasterEndpoint stopped!
注意, 依赖的spark相关的jar包scope是provided.
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_${spark.scala.version}</artifactId>
<version>${spark.version}</version>
<!-- do not packaged to jar-->
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-mllib_${spark.scala.version}</artifactId>
<version>${spark.version}</version>
<scope>provided</scope>
为了不让打包进程序. 所以本地idea运行的时候别忘了勾选
网上也有比较多的文章描述了怎么把archetype部署到私服等等.此处不再赘述, 只是做这个样一个简单的spark-quickstart-scala的archtype(像flink一样)方便快速构建spark-scala项目.