Maven 打包 Scala 项目

2019/03/05 Spark

记 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

object Hive2HBase {
  def main(args: Array[String]): Unit = {
    print("lihm")
  }
}

修改 pom.xml

<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

<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>

打包

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

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提交

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 。 尝试后发现可行。才踩坑完毕

再记:

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

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

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


参考链接

Search

    Table of Contents