Apache spark 本地Spark会话中的Spark URL无效

Apache spark 本地Spark会话中的Spark URL无效,apache-spark,Apache Spark,由于更新到Spark 2.3.0,在创建(本地)Spark上下文时,由于据称Spark url无效,在我的CI(信号量)中运行的测试失败: 18/03/07 03:07:11 ERROR SparkContext: Error initializing SparkContext. org.apache.spark.SparkException: Invalid Spark URL: spark://HeartbeatReceiver@LXC_trusty_1802-d57a40eb:44610

由于更新到Spark 2.3.0,在创建(本地)Spark上下文时,由于据称Spark url无效,在我的CI(信号量)中运行的测试失败:

18/03/07 03:07:11 ERROR SparkContext: Error initializing SparkContext.
org.apache.spark.SparkException: Invalid Spark URL: spark://HeartbeatReceiver@LXC_trusty_1802-d57a40eb:44610
    at org.apache.spark.rpc.RpcEndpointAddress$.apply(RpcEndpointAddress.scala:66)
    at org.apache.spark.rpc.netty.NettyRpcEnv.asyncSetupEndpointRefByURI(NettyRpcEnv.scala:134)
    at org.apache.spark.rpc.RpcEnv.setupEndpointRefByURI(RpcEnv.scala:101)
    at org.apache.spark.rpc.RpcEnv.setupEndpointRef(RpcEnv.scala:109)
    at org.apache.spark.util.RpcUtils$.makeDriverRef(RpcUtils.scala:32)
    at org.apache.spark.executor.Executor.<init>(Executor.scala:155)
    at org.apache.spark.scheduler.local.LocalEndpoint.<init>(LocalSchedulerBackend.scala:59)
    at org.apache.spark.scheduler.local.LocalSchedulerBackend.start(LocalSchedulerBackend.scala:126)
    at org.apache.spark.scheduler.TaskSchedulerImpl.start(TaskSchedulerImpl.scala:164)
    at org.apache.spark.SparkContext.<init>(SparkContext.scala:500)
    at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2486)
    at org.apache.spark.sql.SparkSession$Builder$$anonfun$7.apply(SparkSession.scala:930)
    at org.apache.spark.sql.SparkSession$Builder$$anonfun$7.apply(SparkSession.scala:921)
    at scala.Option.getOrElse(Option.scala:121)
    at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:921)

在升级到Spark 2.3.0之前,版本2.2.1和2.1.0中未遇到任何问题。此外,在本地运行测试也可以正常工作。

SPARK\u LOCAL\u主机名更改为
localhost
,然后重试

export SPARK_LOCAL_HOSTNAME=localhost

尝试在本地运行Spark,机器上的工作线程数与逻辑内核数相同:

.master("local[*]")

通过将sparkSession配置“spark.driver.host”设置为IP地址,可以解决此问题


从2.3版开始,似乎需要进行此更改。

将主机名更改为没有下划线

spark://HeartbeatReceiver@LXC_trusty_1802-d57a40eb:44610至spark://HeartbeatReceiver@LXCtrusty1802d57a40eb:44610

Ubuntu作为根

#hostnamectl status
#hostnamectl --static set-hostname LXCtrusty1802d57a40eb

#nano /etc/hosts
    127.0.0.1   LXCtrusty1802d57a40eb
#reboot 

我想补充@Prakash Annadurai的回答,说:

如果要在退出终端后使可变结算持续,请使用相同的命令将其添加到shell配置文件(例如,
~/.bash\u配置文件
):

export SPARK_LOCAL_HOSTNAME=localhost

适用于在Jupyter笔记本电脑中工作的任何人。将
%env SPARK\u LOCAL\u HOSTNAME=localhost
添加到单元格的最开头,我就解决了这个问题。像这样:

%env SPARK_LOCAL_HOSTNAME=localhost

import findspark
findspark.init()

from pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster("local").setAppName("Test")
sc = SparkContext(conf = conf)

如上所述,您需要将SPARK\u LOCAL\u主机名更改为localhost。在windows中,必须使用SET命令,
SET SPARK\u LOCAL\u HOSTNAME=localhost

但是这个SET命令是临时的。您可能需要在每个新终端中反复运行它。但是,您可以使用SETX命令,这是永久性的

SETX SPARK_LOCAL_HOSTNAME localhost
您可以在任何地方键入上述命令。只需打开命令提示符并在命令上方运行。请注意,与SET命令不同,SETX命令不允许使用公式标记。您需要用空格分隔环境变量和值

如果成功,您将看到类似“成功:已保存指定值”的消息


您还可以通过在不同的命令提示符下键入
SET
来验证变量是否已成功添加。(或键入
SET s
,它给出变量,以字母“s”开头)。您可以在结果中看到SPARK_LOCAL_HOSTNAME=localhost,如果您使用SET命令而不是SETX,则不会发生这种情况。您如何运行应用程序
sbt run
SPARK submit
?两者都不是,在maven测试阶段,代码是在单元测试中执行的。我尝试通过
sbt run
运行代码,但运行正常,如果其提供的Spark URL无效:spark://HeartbeatReceiver@LXC_trusty_1802-d57a40eb:44610那么不选择本地作为主机是因为您的测试正在docker容器中运行?该平台是一个Ubuntu 14.04 LTS v1802,在那里它不工作。一个是本地机器(Windows),没有问题。不过,感谢您的评论,我检查了信号灯中的平台设置,并切换到“Ubuntu14.04 LTS v1802(本机Docker 17.12支持)”。我不知道为什么,但现在我可以毫无问题地再次执行所有测试。在windows平台中,您必须使用SET SPARK\u LOCAL\u HOSTNAME=localhost
SETX SPARK_LOCAL_HOSTNAME localhost