在 Dataproc 集群中使用 AD 身份验证写入 Azure SQL 时出现 NoClassDefFoundError。但在本地工作正常

NoClassDefFoundError while writing to Azure SQL using AD authetication in Dataproc cluster. But Works fine in Local

我写过 Spark Scala 代码。我有一个奇怪的问题,我能够在 Dataproc 集群中使用 AD 身份验证从 Azure SQL 成功读取。但是我在写入 Azure SQL.

时收到以下错误
NoClassDefFoundError: com/microsoft/aad/adal4j/AuthenticationException

而且我 仅在 运行 在 Dataproc 集群 中时收到此错误。相同的代码在我的本地机器上运行良好。

为了更清楚一点,我在 Dataproc 中阅读时也遇到了同样的错误,我使用 解决方案解决了这个问题,方法是使用 Maven 阴影插件重新定位冲突的库。但是现在我在写作时又遇到了同样的错误。不知道出了什么问题。为什么 Dataproc 中的写入失败?请帮忙

代码示例:

从 Azure 读取 SQL(工作正常):

spark.read
      .format("com.microsoft.sqlserver.jdbc.spark")
      .option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver")
      .option("encrypt", "false")
      .option("url", url)
      .option("database", database)
      .option("user", user)
      .option("password", password)
      .option("query",  query)
      .option("authentication", "ActiveDirectoryPassword")
      .load()

写入 Azure SQL(Dataproc 失败):

df.write
      .format("jdbc")
      .mode(mode)
      .option("url", url)
      .option("database", database)
      .option("user", user)
      .option("password", password)
      .option("dbtable",  table)
      .option("authentication", "ActiveDirectoryPassword")
      .save()

Maven Shade 插件:

                            <relocation>
                                <pattern>com</pattern>
                                <shadedPattern>repackaged.com.microsoft</shadedPattern>
                                <includes>
                                    <include>com.microsoft.**</include>
                                </includes>
                            </relocation>

其他 Azure 依赖项:

<dependency>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>msal4j</artifactId>
            <version>1.10.0</version>
        </dependency>

        <dependency>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>adal4j</artifactId>
            <version>1.6.7</version>
        </dependency>

        <dependency>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>spark-mssql-connector_2.12</artifactId>
            <version>1.2.0</version>
        </dependency>

我通过在写入操作中添加 .option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver") 解决了这个问题,它成功了。发现突出显示的问题 here