spark-maven在delta-core和spark-avro之间的依赖不兼容

hivapdat  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(347)

我正在尝试将delta core添加到我的scalaspark项目中,运行2.4.4。
我看到的一个奇怪的行为是,它似乎与spark avro有冲突。maven构建成功,但在运行时我会出错。
如果首先声明了增量表依赖关系,则会出现一个运行时错误,即未安装spark avro:
用户类引发异常:org.apache.spark.sql.analysisexception:找不到数据源:avro。avro是内置的,但外部数据源模块,因为Spark2.4。请按照“ApacheAvro数据源指南”的部署部分部署应用程序。;

<dependencies>
    <dependency>
        <groupId>io.delta</groupId>
        <artifactId>delta-core_2.11</artifactId>
        <version>0.6.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-avro_2.11</artifactId>
        <version>2.4.4</version>
    </dependency>

如果首先定义了spark avro,那么avro可以工作,但是delta会得到一个异常:
用户类引发异常:java.lang.classnotfoundexception:找不到数据源:delta。请在以下地址查找包裹http://spark.apache.org/third-party-projects.html

<dependencies>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-avro_2.11</artifactId>
            <version>2.4.4</version>
        </dependency>

        <dependency>
            <groupId>io.delta</groupId>
            <artifactId>delta-core_2.11</artifactId>
            <version>0.6.1</version>
        </dependency>

我认为这可能是某种依赖冲突,所以我尝试:

<exclusions>
        <exclusion>
            <groupId>*</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>

但都没用。

btxsgosb

btxsgosb1#

在delta核心问题页面找到了答案。谢谢你!
完整的解决方案是基于这个先前的堆栈溢出答案来合并meta-inf下的服务,这样不同的spark源就不会相互覆盖。
完整的解决方案-我将maven程序集插件更改为:

<plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.3.0</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <descriptors>
                        <descriptor>${project.basedir}\src\assembly\tvm_assembly.xml</descriptor>
                    </descriptors>
                </configuration>
            </plugin>

在新的tvm\u assembly.xml文件中(基于带有dependencies的原始jar,添加了merge的属性):

<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 http://maven.apache.org/xsd/assembly-2.1.0.xsd">
    <!-- TODO: a jarjar format would be better -->
    <id>jar-with-dependencies</id>
    <formats>
        <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <outputDirectory>/</outputDirectory>
            <useProjectArtifact>true</useProjectArtifact>
            <unpack>true</unpack>
            <scope>runtime</scope>
        </dependencySet>
    </dependencySets>
    <containerDescriptorHandlers>
        <containerDescriptorHandler>
            <handlerName>metaInf-services</handlerName>
        </containerDescriptorHandler>
        <containerDescriptorHandler>
            <handlerName>metaInf-spring</handlerName>
        </containerDescriptorHandler>
        <containerDescriptorHandler>
            <handlerName>plexus</handlerName>
        </containerDescriptorHandler>
    </containerDescriptorHandlers>
</assembly>

相关问题