spark-submit提交最小包方式运行,与第三方依赖分离

通常使用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 configurations.runtime
    into ('build/libs/lib')
}
//把JAR复制到目标目录
task release(type: Copy,dependsOn: [build,copyJar]) {
// from 'conf'
// into ('build/libs/eachend/conf') // 目标位置
}
  • 运行gradle:release 得到上文提到的第二种打包方式(这种也是打可执行包的方式,可以直接java -jar XX运行)

spark-submit提交最小包方式运行,与第三方依赖分离_第1张图片

  • 上传至服务器
  • 在同级目录编写start.sh脚本,生成提交命令和 –jars 参数,指定main_class与java_home 根据自行需求修改
jarlib="lib"
CLASS_PATH="start.sh"
for i in `ls $jarlib/*.jar`; do
CLASS_PATH="$CLASS_PATH","$i";
done

APP_MAINCLASS="com.kylin.assembly.spark.sql.WordCountInSpark2"
JAVA_CMD="spark-submit --master yarn  --class $APP_MAINCLASS  --jars $CLASS_PATH --executor-memory 1G --total-executor-cores 7 --deploy-mode cluster --conf 'spark.yarn.appMasterEnv.JAVA_HOME=/opt/leap-jdk8'  --conf 'spark.executorEnv.JAVA_HOME=/opt/leap-jdk8' /opt/spark-streaming/spark-streaming-assembly.jar"
echo $JAVA_CMD
eval $JAVA_CMD
  • 赋权,执行,可以看到第三方依赖是提交到application运行环境中,yarn界面日志OK,没有class not found exception
    这里写图片描述
  • 到此,成功演示了spark-submit中,提交最小包的实现方式,之后每次更新,只需要gradle:jar 获取自身代码的jar包,上传即可提交任务
  • 项目代码github目录https://github.com/qiuwenxiang/bigdata_assembly/tree/master/spark-streaming-assembly

———————————-分割线———————————————
附上maven打包方式,打最小包,以及lib目录

 <plugin>
        <groupId>org.apache.maven.pluginsgroupId>
        <artifactId>maven-jar-pluginartifactId>
        <version>2.6version>
        <configuration>
          <archive>
            <manifest>
              <addClasspath>trueaddClasspath>
              <classpathPrefix>lib/classpathPrefix>
              <mainClass>user.controller.KafkaStreamingWordCountmainClass>
            manifest>
          archive>
        configuration>
      plugin>
      <plugin>
        <groupId>org.apache.maven.pluginsgroupId>
        <artifactId>maven-dependency-pluginartifactId>
        <version>2.10version>
        <executions>
          <execution>
            <id>copy-dependenciesid>
            <phase>packagephase>
            <goals>
              <goal>copy-dependenciesgoal>
            goals>
            <configuration>
              <outputDirectory>${project.build.directory}/liboutputDirectory>
            configuration>
          execution>
        executions>
      plugin>

你可能感兴趣的:(spark)