• 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>
    
    • 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
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68

    使用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>
    
    • 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
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80

    使用sbt构建Scala编写的Spark Application

    目前未使用,暂时未记录

    依赖冲突

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

    依赖冲突通常表现为:

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

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

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

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

  • 相关阅读:
    Java 的开发效率究竟比 C++ 高在哪里?
    浅谈新能源汽车充电桩的选型与安装
    Mysql使用中的性能优化——索引数对插入操作性能的影响
    牛客多校-Link with Arithmetic Progression-(三分总结)
    FPGA 20个例程篇:14.千兆网口实现ICMP、UDP通信协议(上)
    JAVA在线招投标系统计算机毕业设计Mybatis+系统+数据库+调试部署
    深度学习(PyTorch)——shape、view、reshape用法及其区别
    VBA之正则表达式(44)-- 拆分商品和规格
    【Python 千题 —— 基础篇】进制转换:十进制转二进制
    Codeforces Round 857
  • 原文地址:https://blog.csdn.net/weixin_56058578/article/details/132718985