You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Databricks PySpark Kusto作业随机报数据源类找不到异常

问题描述

运行环境为Azure Databricks LTS 7.3(内置Spark 3.0、PySpark),长期使用com.microsoft.azure.kusto:kusto-spark_3.0_2.12:2.9.1连接器运行Kusto读写作业,此前作业稳定性正常,近期出现随机失败现象:部分场景作业可正常跑完,部分场景直接抛出类找不到异常。
作业读取代码与报错信息如下:

df = pyKusto.read                                                        \
           .format("com.microsoft.kusto.spark.datasource")               \
           .option("kustoCluster", kustoOptions["kustoCluster"])          \
           .option("kustoDatabase", kustoOptions["kustoDatabase"])         \
           .option("kustoQuery", Query)                                    \
           .option("kustoAadAppId", kustoOptions["kustoAadAppId"])           \
           .option("kustoAadAppSecret", kustoOptions["kustoAadAppSecret"])    \
           .option("kustoAadAuthorityID", kustoOptions["kustoAadAuthorityID"]) \
           .load()
java.lang.ClassNotFoundException: Failed to find data source: com.microsoft.kusto.spark.datasource. Please find packages at http://spark.apache.org/third-party-projects.html

已确认集群侧已安装对应版本依赖库,未定位到触发异常的近期变更。

排查思路与修复方案
  • 优先排查集群节点依赖加载一致性问题
    这类随机出现的类找不到异常,最常见诱因是集群开了自动伸缩后,新拉起的工作节点因公网Maven源波动、本地缓存损坏,没有成功拉取到Kusto连接器依赖;或是驱动节点偶发重启后没有正确加载全局安装的库。
    排查方式:拉取失败作业对应执行节点、驱动节点的启动日志,对比正常运行节点与异常节点的/databricks/jars/目录下的jar列表,确认异常节点是否存在Kusto连接器对应的jar包。
    修复方式:不要依赖集群级在线Maven安装依赖,手动下载对应版本的Kusto连接器jar及其全量传递依赖,上传到DBFS固定路径,在集群Spark配置中通过spark.jars参数指定DBFS上的jar路径,强制所有节点启动时从DBFS读取本地存储的依赖包,规避公网拉取依赖的偶发失败问题。

  • 排查多作业并发的类加载冲突
    如果同一个共享集群同时运行多个作业,部分作业自带了不同版本的Kusto连接器,或是携带了与连接器依赖冲突的Jackson、OkHttp、Azure SDK包,会触发类加载器优先级混乱,偶发加载不到目标数据源类。
    排查方式:核对报错时间点同集群运行的所有作业的依赖配置,检查是否存在不同版本的Kusto相关包、或是和连接器依赖树版本冲突的公共包。
    修复方式:给Kusto作业配置作业级独立依赖,不依赖集群全局安装的库,同时在作业Spark配置中开启spark.driver.userClassPathFirst=true、spark.executor.userClassPathFirst=true,优先加载作业自带的Kusto连接器包,规避全局依赖冲突。

  • 修复连接器已知的懒加载bug
    2.9.1版本的kusto-spark连接器存在已知缺陷:如果Kusto数据源类第一次被加载的时机在执行器端、未在驱动端提前完成数据源注册,就会随机抛出类找不到异常,集群做过小版本热更新、节点OS补丁升级后,该问题触发概率会明显升高。
    快速验证方式:在执行Kusto读取代码前,主动加一行类加载逻辑,提前在驱动端完成数据源注册,测试是否还复现报错:

    # 主动触发Kusto数据源类加载与注册
    sc._jvm.Class.forName(
        "com.microsoft.kusto.spark.datasource.DefaultSource",
        True,
        sc._jvm.java.lang.Thread.currentThread().getContextClassLoader()
    )
    

    修复方式:如果加上述代码后报错消失,可保留该前置加载逻辑,也可将连接器升级到适配Spark 3.0、Scala 2.12的后续稳定版本,新版本已修复该类懒加载导致的随机注册失败问题。

  • 检查近期集群配置变更的影响
    如果近期调整过集群自定义容器镜像、节点出站访问规则、DBFS权限策略,可能导致节点启动时无法读取到对应路径下的连接器jar包,触发随机加载失败。
    排查方式:登录到异常节点手动执行类加载测试,检查节点到DBFS的网络连通性、jar包路径的读权限是否正常。
    修复方式:如果是权限问题,给集群运行身份授予jar存储路径的读权限;如果使用自定义镜像,可直接将Kusto连接器的jar包打入镜像内的Spark jars目录,彻底跳过节点启动时拉取依赖的流程。

内容的提问来源于stack exchange,提问作者Bha123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 05:33:16