如何在公司代理的情况下,使用spark-shell解决外部包依赖问题?

22

我希望能在企业代理后面使用外部软件包运行spark-shell。不幸的是,通过--packages选项传递的外部软件包无法被解析。

例如,当运行以下命令时:

bin/spark-shell --packages datastax:spark-cassandra-connector:1.5.0-s_2.10

卡桑德拉连接器包未解决(卡在最后一行):

Ivy Default Cache set to: /root/.ivy2/cache
The jars for the packages stored in: /root/.ivy2/jars
:: loading settings :: url = jar:file:/opt/spark/lib/spark-assembly-1.6.1-hadoop2.6.0.jar!/org/apache/ivy/core/settings/ivysettings.xml
datastax#spark-cassandra-connector added as a dependency
:: resolving dependencies :: org.apache.spark#spark-submit-parent;1.0
        confs: [default]

经过一段时间,连接超时并包含以下错误消息:

:::: ERRORS
        Server access error at url https://repo1.maven.org/maven2/datastax/spark-cassandra-connector/1.5.0-s_2.10/spark-cassandra-connector-1.5.0-s_2.10.pom (java.net.ConnectException: Connection timed out)

当我关闭企业代理的VPN时,软件包立即被解析和下载。

到目前为止我尝试过:

将代理公开为环境变量:

export http_proxy=<proxyHost>:<proxyPort>
export https_proxy=<proxyHost>:<proxyPort>
export JAVA_OPTS="-Dhttp.proxyHost=<proxyHost> -Dhttp.proxyPort=<proxyPort>"
export ANT_OPTS="-Dhttp.proxyHost=<proxyHost> -Dhttp.proxyPort=<proxyPort>"

使用额外的Java选项运行spark-shell:

bin/spark-shell --conf "spark.driver.extraJavaOptions=-Dhttp.proxyHost=<proxyHost> -Dhttp.proxyPort=<proxyPort>" --conf "spark.executor.extraJavaOptions=-Dhttp.proxyHost=<proxyHost> -Dhttp.proxyPort=<proxyPort>" --packages datastax:spark-cassandra-connector:1.6.0-M1-s_2.10

还有其他的配置可能性我漏掉了吗?


你缺少了https.proxyHost和端口。 - Thomas Decaux
7个回答

32

找到了正确的设置:

bin/spark-shell --conf "spark.driver.extraJavaOptions=-Dhttp.proxyHost=<proxyHost> -Dhttp.proxyPort=<proxyPort> -Dhttps.proxyHost=<proxyHost> -Dhttps.proxyPort=<proxyPort>" --packages <somePackage>

需要将http和https代理设置为额外的驱动器选项。JAVA_OPTS似乎没有起到任何作用。


2
你知道如何使用spark-submit --master yarn --deploy-mode cluster来完成这个任务吗? - angelcervera
对于我在spark2-submit上,这个方法可行:'--driver-java-options "-Dhttps.proxyHost=httpproxy -Dhttps.proxyPort=80"' - A. Rabus
嗨@mtsz,我还是有问题。我已经使用其中一个代理配置了命令,该代理存在于此网站上。但它并没有解决我的问题。我不知道该怎么办。您能否指导我解决我的问题? 我的stackoverflow问题我的github问题 - Mostafa Ghadimi
@MostafaGhadimi,你能解决这个问题吗?因为我也遇到了同样的问题。 - abheet22
@abheet22 我使用了一些不同的jar文件,而不是之前的那个。 - Mostafa Ghadimi

12
如果您的操作系统已正确配置代理,则可以使用Java属性:java.net.useSystemProxies:
--conf "spark.driver.extraJavaOptions=-Djava.net.useSystemProxies=true"
这样,代理主机/端口和无代理主机将被配置。

这是最简单的方法,而且完美地运行,谢谢。 - Cross

5
这对我在Spark 1.6.1中有效:
bin\spark-shell --driver-java-options "-Dhttp.proxyHost=<proxyHost> -Dhttp.proxyPort=<proxyPort> -Dhttps.proxyHost=<proxyHost> -Dhttps.proxyPort=<proxyPort>" --packages <package>

2

在我找到以下内容之前一直苦恼于Pyspark:

延续@Tao Huang的答案:

bin/pyspark --driver-java-options="-Dhttp.proxyUser=user -Dhttp.proxyPassword=password -Dhttps.proxyUser=user -Dhttps.proxyPassword=password -Dhttp.proxyHost=proxy -Dhttp.proxyPort=port -Dhttps.proxyHost=proxy -Dhttps.proxyPort=port" --packages [groupId:artifactId]

即应该使用-Dhttp(s).proxyUser,而不是...proxyUsername

“Original Answer”翻译成“最初的回答”


1
如果您需要身份验证来使用代理,您可以在默认配置文件中使用以下内容:
spark.driver.extraJavaOptions  -Dhttp.proxyHost= -Dhttp.proxyPort= -Dhttps.proxyHost= -Dhttps.proxyPort= -Dhttp.proxyUsername= -Dhttp.proxyPassword= -Dhttps.proxyUsername= -Dhttps.proxyPassword= 

1
添加
spark.driver.extraJavaOptions=-Dhttp.proxyHost=<proxyHost> -Dhttp.proxyPort=<proxyPort> -Dhttps.proxyHost=<proxyHost> -Dhttps.proxyPort=<proxyPort>

$SPARK_HOME/conf/spark-defaults.conf 添加到我的配置文件中对我有用。

0
在Windows 7上,使用spark-2.0.0-bin-hadoop2.7,我在%SPARK_HOME%\spark-2.0.0-bin-hadoop2.7\conf\spark-defaults.conf中设置了spark.driver.extraJavaOptions,如下所示:spark.driver.extraJavaOptions
spark.driver.extraJavaOptions -Dhttp.proxyHost=hostname -Dhttp.proxyPort=port -Dhttps.proxyHost=host -Dhttps.proxyPort=port

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接