0%

Maven 打包 Scala 项目

记 Spark 打包放到 Hadoop 集群运行踩坑


前言

因近期有写 使用 Spark 通过 BulkLoad 快速导入数据到 HBase 的需求。

在写过程中用 maven 打包一直失败。导致我无法测试自己的代码

折腾了一晚上终于踩坑完毕了

开发环境

操作系统:MAC

Scala:2.10.5

Maven: 3.3.9

Spark: 1.6.3

构建

在 IDEA 上新建 scala 项目。怎么构建的就不细说了。网上很多。如何在Java Maven工程中编写Scala代码

目录结构如图所示。记得给 scala 文件夹加上 source ,让其变成蓝色

新建一个 object

1
2
3
4
5
object Hive2HBase {
def main(args: Array[String]): Unit = {
print("lihm")
}
}

修改 pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<build>
<sourceDirectory>src/main/scala</sourceDirectory>
<plugins>
<plugin>
<groupId>org.scala-tools</groupId>
<artifactId>maven-scala-plugin</artifactId>
<version>2.15.2</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
<configuration>
<scalaVersion>2.10.5</scalaVersion>
<args>
<arg>-target:jvm-1.5</arg>
</args>
</configuration>
</plugin>
</plugins>
</build>
```

scalaVersion 我猜是 打包编译时指定的 scala 版本

这种 xml 配置打包的话是不会将依赖打成jar包的

在 plugins 下追加一个 plugin

```xml
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<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>

打包

在项目的顶级目录下执行下方命令打包

1
2
3
4
5
mvn clean scala:compile compile package -DskipTests=true

# 忽略此命令
# -Dscala.version 表示你打包时的编译版本。建议跟自己本机安装的相同
# mvn clean package -Dscala.version=2.10.5

scala:compile 表示编译 scala 文件

compile 表示编译 Java 文件

-DskipTests=true 表示跳过编译时的测试

打包完成之后可以在 项目的 target 文件夹下看到打包好的 jar 文件

示例运行

将编译好的 jar 包上传至服务器,使用spark-submit提交

1
2
3
4
5
6
7
8
9
export HADOOP_USER_NAME=hbase
spark-submit --class Hive2HBase \
--master yarn-client \
--driver-memory 2g \
--executor-cores 1 \
--num-executors 200 \
--executor-memory 2g \
--queue root.line.etl \
bulkLoadTool-1.0-SNAPSHOT.jar

–driver-memory 指定driver的内存

–class 是指定运行的主类。如果有路径,就把路径补全

–num-executors 是指定 executor 个数

–executor-memory 每个 executor 的内存

–queue 是指定提交时的队列。如果你的 yarn 没有资源队列限制就可以去掉。

总结

最先开始打包失败时一度以为时maven 的问题。配置 maven 就折腾了好久

最后实在没办法了,怀疑是不是打包命令的问题。找到一个 github issue 看到有人建议 -Dscala.version 。
尝试后发现可行。才踩坑完毕

再记:

忽略的那个命令为最先成功的命令,接着开发过程中我发现该命令报错。

接着又找到一个能编译打包并且成功的命令。

先用着,如果后续弄明白了再补上。


参考链接