02-打包代码与依赖

打包代码与依赖说明

在开发中,我们写的应用程序通常需要依赖第三方的库(即程序中引入了既不在 org.apache.spark包,也不再语言运行时的库的依赖),我们就需要确保所有的依赖在Spark应用运行时都能被找到

  • 对于Python而言,安装第三方库的方法有很多种
    • 可以通过包管理器(如pip)在集群中所有机器上安装所依赖的库,或者手动将依赖安装到python安装目录下的site-packages/目录在
    • 我们也可以通过spark-submit 的 --py-Files 参数提交独立的库
    • 如果我们没有在集群上安装包的权限,可以手动添加依赖库,但是要防范与已经安装在集群上的那些包发生冲突

注意:

​ 提交应用时,绝不要把spark本身放在提交的依赖中。spark-submit会自动确保spark在你的程序的运行路径中

  • 对于Java 和 Scala,可以通过spark-submit 的 --jars 标记提交独立的jar包依赖
    • 当只有一两个库的简单依赖,并且这些库不依赖与其他库时,这种方式比较合适
    • 当需要依赖很多库的使用,这种方式很笨拙,不太适用。
      • 此时的常规做法时使用构建工具(如maven、sbt)生成一个比较大的jar包,这个jar包中包含应用的所有的传递依赖。

使用Maven构建Java编写的Spark Application

参考POM

<repositories>
    
    <repository>
        <id>aliyunid>
        <url>http://maven.aliyun.com/nexus/content/groups/public/url>
    repository>
    <repository>
        <id>clouderaid>
        <url>https://repository.cloudera.com/artifactory/cloudera-repos/url>
    repository>
    <repository>
        <id>jbossid>
        <url>https://repository.jboss.com/nexus/content/groups/public/url>
    repository>
repositories>


<properties>
    <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    <maven.compiler.source>8maven.compiler.source>
    <maven.compiler.target>8maven.compiler.target>

    <scala.version>2.12.15scala.version>
    <scala.binary.version>2.12scala.binary.version>

    <hadoop.version>3.1.3hadoop.version>
    
    <spark.version>3.2.0spark.version>
    <spark.scope>compilespark.scope>  
properties>


<dependencies>
    
    <dependency>
        <groupId>org.scala-langgroupId>
        <artifactId>scala-libraryartifactId>
        <version>${scala.version}version>
    dependency>
    
    <dependency>
        <groupId>org.apache.sparkgroupId>
        <artifactId>spark-core_${scala.binary.version}artifactId>
        <version>${spark.version}version>
    dependency>
    
    <dependency>
        <groupId>org.apache.hadoopgroupId>
        <artifactId>hadoop-clientartifactId>
        <version>${hadoop.version}version>
    dependency>
dependencies>


<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.pluginsgroupId>
            <artifactId>maven-compiler-pluginartifactId>
            <version>3.10.1version>
            <configuration>
                <source>${maven.compiler.source}source>
                <target>${maven.compiler.target}target>
                <encoding>${project.build.sourceEncoding}encoding>
            configuration>
        plugin>
    plugins>
build>

使用Maven构建Scala编写的Spark Application

参考POM

<repositories>
    
    <repository>
        <id>aliyunid>
        <url>http://maven.aliyun.com/nexus/content/groups/public/url>
    repository>
    <repository>
        <id>clouderaid>
        <url>https://repository.cloudera.com/artifactory/cloudera-repos/url>
    repository>
    <repository>
        <id>jbossid>
        <url>https://repository.jboss.com/nexus/content/groups/public/url>
    repository>
repositories>

<properties>
    <maven.compiler.source>1.8maven.compiler.source>
    <maven.compiler.target>1.8maven.compiler.target>
    <scala.version>2.13.5scala.version>
    <scala.binary.version>2.13scala.binary.version>
    <spark.version>3.2.0spark.version>
    <hadoop.version>3.1.3hadoop.version>
properties>

<dependencies>
    
    <dependency>
        <groupId>org.scala-langgroupId>
        <artifactId>scala-libraryartifactId>
        <version>${scala.version}version>
    dependency>
    
    <dependency>
        <groupId>org.apache.sparkgroupId>
        <artifactId>spark-core_${scala.binary.version}artifactId>
        <version>${spark.version}version>
    dependency>
    
    <dependency>
        <groupId>org.apache.hadoopgroupId>
        <artifactId>hadoop-clientartifactId>
        <version>${hadoop.version}version>
    dependency>
dependencies>

<build>
    <plugins>
        
        <plugin>
            <groupId>org.apache.maven.pluginsgroupId>
            <artifactId>maven-assembly-pluginartifactId>
            <version>3.0.0version>
            <executions>
                <execution>
                    <id>make-assemblyid>
                    <phase>packagephase>
                    <goals>
                        <goal>singlegoal>
                    goals>
                execution>
            executions>
        plugin>
        
        <plugin>
            <groupId>net.alchim31.mavengroupId>
            <artifactId>scala-maven-pluginartifactId>
            <version>3.2.2version>
            <executions>
                
                <execution>
                    <goals>
                        <goal>compilegoal>
                        <goal>testCompilegoal>
                    goals>
                execution>
            executions>
        plugin>
    plugins>
build>

使用sbt构建Scala编写的Spark Application

目前未使用,暂时未记录

依赖冲突

当我们的Spark Application与Spark本身依赖于同一个库时可能会发生依赖冲突,导致程序崩溃。

依赖冲突通常表现为:

  • NoSuchMethodError
  • ClassNotFoundException
  • 或其他与类加载相关的JVM异常

对于这类问题,主要的两种解决方式:

1)修改Spark Application,使其使用的依赖库版本与Spark所使用的相同

2)通常使用”shading“的方式打包我们的Spark Application

你可能感兴趣的:(spark,spark,大数据)