记 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 。
尝试后发现可行。才踩坑完毕
再记:
忽略的那个命令为最先成功的命令,接着开发过程中我发现该命令报错。
接着又找到一个能编译打包并且成功的命令。
先用着,如果后续弄明白了再补上。
参考链接