通常使用spark-submit 提交任务时,是把第三方依赖与项目代码打成一个很大的jar包来运行,比如sbt-assembly。其实这样很不方便,每次改了代码,需要很长的打包时间,上传服务器也慢,还可能出现 Can’t open so many files的问题
常见的打可执行包方式有3种
- 1.所有第三方依赖和项目自身代码打成一个,且第三方依赖全部解压为class文件,例如sbt-assembly
- 2.项目自身代码打成很小的jar包,同级生成一个lib目录,lib下面为所有第三方依赖包,同样以lib包形式存在;maven 插件, gradle 自定义task均可实现
- 3.项目自身打成jar包,第三方依赖与项目同级,也是以jar包形式存在,以gradle的,apply plugin: ‘application’ 为例。
第2种方式是spark-submit中,我们比较想利用的,在没有引入新的依赖情况下,更新代码,每次只需要上传一个很小的jar包
- 下面以gradle 为例,实现此次打包提交,核心利用的spark-submit 的 –jars 参数
- 在gradle 中,添加任务
jar {
String someString = ''
configurations.runtime.each {someString = someString + " lib//"+it.name}
manifest {
attributes 'Main-Class': 'com.kylin.assembly.spark.sql.WordCountInSpark2'
attributes 'Class-Path': someString
}
}
//清除上次的编译过的文件
task clearPj(type:Delete){
delete 'build','target'
}
task copyJar(type:Copy){
from config