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

Azure Databricks中使用kusto-spark写入Spark表遇端口占用错误求助

问题分析与解决方案:Azure Databricks + Kusto-Spark 写入时端口占用报错

操作代码

my_df = (spark.read.format("com.microsoft.kusto.spark.datasource")
         .option("kustoQuery","??")
         .load())

my_df_final = do_various_things(my_df)

my_df_final.write.insertInto("workspace.output_table", overwrite = False)

报错信息

"Operation": DataExportToFile,
"Status": Partial query failure: Unable to perform requested operation. (message: 'ExecutePluginOperator failure ===> Unable to connect to the remote server: ', details: 'Source: Kusto.Cloud.Platform.Azure.Storage
[0]Kusto.Cloud.Platform.Storage.PersistentStorage.PersistentStorageServiceException: Unable to connect to the remote server
ActivityType=DN.DEQP.EvalPass.Plugin.export_to_blob
ActivityStack=(Activity stack: CRID=..;exportPartitionToBlob; > SubqueryPull/> DN.DEQP.EvalPass.Plugin.export_to_blob/..)
ExtendedErrorInformation=
 --->
Azure.RequestFailedException: Unable to connect to the remote server ---> System.Net.WebException: Unable to connect to the remote server ---> System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted 20.150.85.228:443

问题根源与解决方向

你的操作本身没有根本性语法错误,报错核心是Kusto执行DataExportToFile时,大量并发连接请求耗尽了节点的临时Socket端口,且你之前调整ADX节点数量、等待重试的方案没触达问题根源。以下是针对性解决思路:

  1. 限制Kusto导出操作的并发数
    Kusto读取数据时的导出作业默认并发可能过高,导致短时间创建过多Socket连接。可以在读取Kusto数据时添加参数控制并发:

    my_df = (spark.read.format("com.microsoft.kusto.spark.datasource")
             .option("kustoQuery","??")
             .option("clientRequestProperties", '{"MaxConcurrentOperations": 8}')  # 降低并发数,可根据集群规模调整
             .load())
    
  2. 优化Databricks集群的网络参数
    调整Spark集群的JVM网络配置,加快TIME_WAIT端口的回收,避免闲置连接占用资源。在集群的Spark配置中添加:

    spark.driver.extraJavaOptions -Dsun.net.inetaddr.ttl=60
    spark.executor.extraJavaOptions -Dsun.net.inetaddr.ttl=60
    spark.network.timeout 300s
    spark.executor.heartbeatInterval 60s
    
  3. 调整Spark写入策略
    直接用insertInto写入大表时,批量请求压力会间接放大Kusto侧的导出负载。可以改用Delta格式的高效写入方式(如果目标表支持):

    my_df_final.write.format("delta")
               .mode("append")
               .saveAsTable("workspace.output_table")
    

    若必须用insertInto,可先将数据写入临时表,再分批次插入目标表,降低单次写入的并发压力。

  4. 排查Kusto与存储的网络连通性
    报错中的IP是Azure存储地址,需确认:

    • 存储账户防火墙是否允许Kusto集群的IP段访问
    • VNet peering或私有端点配置是否正常,避免因连接不稳定引发大量重试,加剧端口消耗
  5. 调整Kusto节点的网络栈参数
    增加ADX节点数量无法解决单节点端口耗尽问题,可联系Azure支持,检查并开启节点的net.ipv4.tcp_tw_reuse参数,允许复用TIME_WAIT状态的端口,提升端口利用率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 12:30:57