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

PySpark通过代理访问资源报错407 Proxy Authentication Required问题问询

配置失效核心原因

  1. 配置项误用:方案3中将JVM代理参数错误配置到spark.driver.extraClassPath,该参数仅用于指定Driver进程的类路径,不会作为JVM启动参数生效,正确的参数应为spark.driver.extraJavaOptions和spark.executor.extraJavaOptions。
  2. 配置顺序错误:SparkContext.setSystemProperty必须在SparkContext或SparkSession初始化前调用,若上下文已完成初始化再修改属性不会生效。
  3. 配置项缺失:方案1仅配置了HTTP代理的用户名密码,未同步配置HTTPS代理的对应参数,访问HTTPS资源时会触发认证失败。
  4. 拼写错误:YARN Application Master的环境变量配置应为spark.yarn.appMasterEnv.*,原写法缺失字母n,导致YARN模式下环境变量不生效。

可行解决方案

代码内配置(适用交互式/脚本运行)

在脚本最开头、SparkSession初始化前完成所有配置,示例如下:

from pyspark import SparkContext
from pyspark.sql import SparkSession
import os

# 先同步Python进程的代理环境变量,匹配直连时的生效逻辑
os.environ['HTTP_PROXY'] = 'http://<代理用户名>:<代理密码>@<代理主机>:<代理端口>'
os.environ['HTTPS_PROXY'] = 'http://<代理用户名>:<代理密码>@<代理主机>:<代理端口>'

# 提前设置JVM系统属性,必须放在SparkSession初始化前
SparkContext.setSystemProperty("http.proxyUser", "<代理用户名>")
SparkContext.setSystemProperty("http.proxyPassword", "<代理密码>")
SparkContext.setSystemProperty("http.proxyHost", "<代理主机>")
SparkContext.setSystemProperty("http.proxyPort", "<代理端口>")
SparkContext.setSystemProperty("https.proxyUser", "<代理用户名>")
SparkContext.setSystemProperty("https.proxyPassword", "<代理密码>")
SparkContext.setSystemProperty("https.proxyHost", "<代理主机>")
SparkContext.setSystemProperty("https.proxyPort", "<代理端口>")
SparkContext.setSystemProperty("jdk.http.auth.tunneling.disabledSchemes", "")
SparkContext.setSystemProperty("jdk.http.auth.proxying.disabledSchemes", "")

# 构建SparkSession,补全所有正确配置
spark = SparkSession.builder.appName("<你的应用名称>") \
    .config("spark.driver.extraJavaOptions", "-Dhttp.proxyUser=<代理用户名> -Dhttp.proxyPassword=<代理密码> -Dhttp.proxyHost=<代理主机> -Dhttp.proxyPort=<代理端口> -Dhttps.proxyUser=<代理用户名> -Dhttps.proxyPassword=<代理密码> -Dhttps.proxyHost=<代理主机> -Dhttps.proxyPort=<代理端口> -Djdk.http.auth.tunneling.disabledSchemes= -Djdk.http.auth.proxying.disabledSchemes=") \
    .config("spark.executor.extraJavaOptions", "-Dhttp.proxyUser=<代理用户名> -Dhttp.proxyPassword=<代理密码> -Dhttp.proxyHost=<代理主机> -Dhttp.proxyPort=<代理端口> -Dhttps.proxyUser=<代理用户名> -Dhttps.proxyPassword=<代理密码> -Dhttps.proxyHost=<代理主机> -Dhttps.proxyPort=<代理端口> -Djdk.http.auth.tunneling.disabledSchemes= -Djdk.http.auth.proxying.disabledSchemes=") \
    .config("spark.executorEnv.HTTP_PROXY", "http://<代理用户名>:<代理密码>@<代理主机>:<代理端口>") \
    .config("spark.executorEnv.HTTPS_PROXY", "http://<代理用户名>:<代理密码>@<代理主机>:<代理端口>") \
    .config("spark.driverEnv.HTTP_PROXY", "http://<代理用户名>:<代理密码>@<代理主机>:<代理端口>") \
    .config("spark.driverEnv.HTTPS_PROXY", "http://<代理用户名>:<代理密码>@<代理主机>:<代理端口>") \
    .config("spark.yarn.appMasterEnv.HTTP_PROXY", "http://<代理用户名>:<代理密码>@<代理主机>:<代理端口>") \
    .config("spark.yarn.appMasterEnv.HTTPS_PROXY", "http://<代理用户名>:<代理密码>@<代理主机>:<代理端口>") \
    .getOrCreate()

spark-submit提交配置(适用集群提交,避免硬编码密码)

提交时直接在命令行传入参数即可:

spark-submit \
  --conf spark.driver.extraJavaOptions="-Dhttp.proxyUser=<代理用户名> -Dhttp.proxyPassword=<代理密码> -Dhttp.proxyHost=<代理主机> -Dhttp.proxyPort=<代理端口> -Dhttps.proxyUser=<代理用户名> -Dhttps.proxyPassword=<代理密码> -Dhttps.proxyHost=<代理主机> -Dhttps.proxyPort=<代理端口> -Djdk.http.auth.tunneling.disabledSchemes= -Djdk.http.auth.proxying.disabledSchemes=" \
  --conf spark.executor.extraJavaOptions="-Dhttp.proxyUser=<代理用户名> -Dhttp.proxyPassword=<代理密码> -Dhttp.proxyHost=<代理主机> -Dhttp.proxyPort=<代理端口> -Dhttps.proxyUser=<代理用户名> -Dhttps.proxyPassword=<代理密码> -Dhttps.proxyHost=<代理主机> -Dhttps.proxyPort=<代理端口> -Djdk.http.auth.tunneling.disabledSchemes= -Djdk.http.auth.proxying.disabledSchemes=" \
  --conf spark.executorEnv.HTTP_PROXY=http://<代理用户名>:<代理密码>@<代理主机>:<代理端口> \
  --conf spark.executorEnv.HTTPS_PROXY=http://<代理用户名>:<代理密码>@<代理主机>:<代理端口> \
  --conf spark.driverEnv.HTTP_PROXY=http://<代理用户名>:<代理密码>@<代理主机>:<代理端口> \
  --conf spark.driverEnv.HTTPS_PROXY=http://<代理用户名>:<代理密码>@<代理主机>:<代理端口> \
  --conf spark.yarn.appMasterEnv.HTTP_PROXY=http://<代理用户名>:<代理密码>@<代理主机>:<代理端口> \
  --conf spark.yarn.appMasterEnv.HTTPS_PROXY=http://<代理用户名>:<代理密码>@<代理主机>:<代理端口> \
  你的脚本名称.py

验证方法

配置完成后可执行以下代码验证代理是否生效:

# 尝试拉取公网资源验证
spark.sparkContext.addFile("https://example.com/index.html")

如果没有抛出407错误则说明配置生效。

内容的提问来源于stack exchange,提问作者Gonzalo Pérez Fernández

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 22:06:07