使用IDEA創(chuàng)建spark項(xiàng)目,會(huì)用到 pom.xml的配置,現(xiàn)簡(jiǎn)單做個(gè)記錄。
1. 固定部分
當(dāng)我們創(chuàng)建好項(xiàng)目時(shí),會(huì)默認(rèn)生成pom.xml,其中有部分是不需要我們手動(dòng)更改的:
<?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.example</groupId>
<artifactId>algorithm_strategy</artifactId>
<version>1.0</version>
</project>
所有 POM 文件都需要 project 元素和三個(gè)必需字段:groupId,artifactId,version。
| 節(jié)點(diǎn) | 描述 |
|---|---|
| project | 工程的根標(biāo)簽。 |
| modelVersion | 模型版本需要設(shè)置為 4.0。 |
| groupId | 這是工程組的標(biāo)識(shí)。它在一個(gè)組織或者項(xiàng)目中通常是唯一的。例如,一個(gè)銀行組織 com.companyname.project-group 擁有所有的和銀行相關(guān)的項(xiàng)目。 |
| artifactId | 這是工程的標(biāo)識(shí)。它通常是工程的名稱。例如,消費(fèi)者銀行。groupId 和 artifactId 一起定義了 artifact 在倉(cāng)庫(kù)中的位置。 |
| version | 這是工程的版本號(hào)。在 artifact 的倉(cāng)庫(kù)中,它用來(lái)區(qū)分不同的版本。例如:org.example:consumer-banking:1.0 org.example:consumer-banking:1.1
|
2. 引用常量定義
接下來(lái)可以為pom定義一些常量,在pom中的其它地方可以直接引用
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<scala.binary.version>2.11</scala.binary.version>
<spark.version>2.4.4</spark.version>
<scala.binary.version>2.11</scala.binary.version>
<scala.version>2.11.12</scala.version>
</properties>
3. Maven倉(cāng)庫(kù)
運(yùn)行Maven的時(shí)候,Maven所需要的任何構(gòu)件都是直接從本地倉(cāng)庫(kù)獲取的。如果本地倉(cāng)庫(kù)沒(méi)有,它會(huì)首先嘗試從遠(yuǎn)程倉(cāng)庫(kù)下載構(gòu)件至本地倉(cāng)庫(kù),然后再使用本地倉(cāng)庫(kù)的構(gòu)件。
3.1 本地倉(cāng)庫(kù)
Maven缺省的本地倉(cāng)庫(kù)地址為${user.home}/.m2/repository 。一個(gè)用戶會(huì)對(duì)應(yīng)的擁有一個(gè)本地倉(cāng)庫(kù)。
可以自定義本地倉(cāng)庫(kù)的位置,修改 /usr/local/apache-maven-3.6.3/conf/settings.xml 。
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
3.2 Maven中央倉(cāng)庫(kù)
Maven安裝自帶了一個(gè)遠(yuǎn)程倉(cāng)庫(kù)即Maven中央倉(cāng)庫(kù)。具體可在 /usr/local/apache-maven-3.6.3/lib/maven-model-builder-3.6.3.jar文件里的 pom-4.0.0.xml中進(jìn)行查看。它是所有Maven POM的父POM,所有Maven項(xiàng)目繼承該配置。中央倉(cāng)庫(kù)的id為central,遠(yuǎn)程url地址為http://repo.maven.apache.org/maven2,它關(guān)閉了snapshot版本構(gòu)件下載的支持。
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
我們可以在POM中配置其它的遠(yuǎn)程倉(cāng)庫(kù),比如下面的中國(guó)的中央倉(cāng)庫(kù)
<project>
...
<repositories>
<repository>
<id>maven-net-cn</id>
<name>Maven China Mirror</name>
<url>http://maven.net.cn/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>maven-net-cn</id>
<name>Maven China Mirror</name>
<url>http://maven.net.cn/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
...
</project>
我們也可以在<repositories>下面添加多個(gè)<repository>,每個(gè)<repository>都有它唯一的id,一個(gè)描述性的name,以及最重要的,遠(yuǎn)程倉(cāng)庫(kù)的url。此外,<releases><enabled>true</enabled></releases>告訴Maven可以從這個(gè)倉(cāng)庫(kù)下載releases版本的構(gòu)件,而<snapshots><enabled>false</enabled></snapshots>告訴Maven不要從這個(gè)倉(cāng)庫(kù)下載snapshot版本的構(gòu)件。禁止從公共倉(cāng)庫(kù)下載snapshot構(gòu)件是推薦的做法,因?yàn)檫@些構(gòu)件不穩(wěn)定,且不受你控制,你應(yīng)該避免使用。當(dāng)然,如果你想使用局域網(wǎng)內(nèi)組織內(nèi)部的倉(cāng)庫(kù),你可以激活snapshot的支持。至于<pluginRepositories>,這是配置Maven從什么地方下載插件構(gòu)件(Maven的所有實(shí)際行為都由其插件完成)。該元素的內(nèi)部配置和<repository>完全一樣。
在工作中我們一般都是使用公司局域網(wǎng)的遠(yuǎn)程倉(cāng)庫(kù),使用該倉(cāng)庫(kù)能大大提高下載速度,繼而提高構(gòu)建速度。比如我們當(dāng)前的spark項(xiàng)目配置的遠(yuǎn)程倉(cāng)庫(kù)為 (鑒于公司隱私,其中 url被我替換了下)。
<repositories>
<repository>
<id>Central</id>
<url>http://nexus.org.example/content/repositories/central</url>
</repository>
<repository>
<id>Jcenter</id>
<url>http://nexus.org.example/content/repositories/Jcenter/</url>
</repository>
<repository>
<id>bili-nexus-release-server</id>
<url>http://nexus.org.example/content/repositories/releases</url>
</repository>
<repository>
<id>snapshots</id>
<url>http://nexus.org.example/content/repositories/snapshots</url>
</repository>
</repositories>
4. 項(xiàng)目依賴
由于當(dāng)前主要基于 XGBoost,所以主要引入相關(guān)的依賴。需要注意 scope 的參數(shù),這里的值為 provided,是因?yàn)楫?dāng)前的集群環(huán)境提供了這些依賴,所以打包的時(shí)候可以不用一起打包。但是在本地運(yùn)行時(shí)需要將其注釋掉 (此時(shí)為默認(rèn)值:compile)
<dependencies>
<!--scala-->
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${scala.version}</version>
</dependency>
<!-- spark -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_${scala.binary.version}</artifactId>
<version>${spark.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_${scala.binary.version}</artifactId>
<version>${spark.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-mllib_${scala.binary.version}</artifactId>
<version>${spark.version}</version>
<scope>provided</scope>
</dependency>
<!-- xgboost -->
<dependency>
<groupId>ml.dmlc</groupId>
<artifactId>xgboost4j-spark_${scala.binary.version}</artifactId>
<version>1.0.0</version>
<!--<scope>provided</scope>-->
</dependency>
</dependencies>
5. 構(gòu)建插件
打包成 jar 的配置,maven-assembly-plugin 和 maven-jar-plugin 配合使用,最后就只會(huì)生成一個(gè) xx-jar-with-dependencies.jar。
<build>
<!-- <sourceDirectory>src/main/scala</sourceDirectory>-->
<!-- <testSourceDirectory>src/test/scala</testSourceDirectory>-->
<plugins>
<plugin>
<groupId>org.scala-tools</groupId>
<artifactId>maven-scala-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
<configuration>
<scalaVersion>${scala.version}</scalaVersion>
<args>
<arg>-target:jvm-1.5</arg>
</args>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assemble</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<executions>
<execution>
<id>default-jar</id>
<phase>none</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>