pyspark 如何解决运行spark代码时“无法分配请求的地址:服务'sparkDriver'在16次重试后失败”?

33qvvth1  于 12个月前  发布在  Spark
关注(0)|答案(9)|浏览(171)

我正在用intelliJ学习spark + scala,从下面的一小段代码开始

import org.apache.spark.{SparkConf, SparkContext}

object ActionsTransformations {

  def main(args: Array[String]): Unit = {
    //Create a SparkContext to initialize Spark
    val conf = new SparkConf()
    conf.setMaster("local")
    conf.setAppName("Word Count")
    val sc = new SparkContext(conf)

    val numbersList = sc.parallelize(1.to(10000).toList)

    println(numbersList)
  }

}

字符串
尝试运行时,低于异常

Exception in thread "main" java.net.BindException: Can't assign requested address: Service 'sparkDriver' failed after 16 retries (on a random free port)! Consider explicitly setting the appropriate binding address for the service 'sparkDriver' (for example spark.driver.bindAddress for SparkDriver) to the correct binding address.
    at sun.nio.ch.Net.bind0(Native Method)
    at sun.nio.ch.Net.bind(Net.java:433)
    at sun.nio.ch.Net.bind(Net.java:425)
    at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
    at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:127)
    at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:501)
    at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1218)
    at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:496)
    at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:481)
    at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:965)
    at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:210)
    at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:353)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:399)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:446)
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:131)
    at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144)
    at java.lang.Thread.run(Thread.java:745)

Process finished with exit code 1


谁能给我出个主意。

9nvpjoqh

9nvpjoqh1#

有时问题与连接的VPN或类似的东西有关!只需断开VPN或任何其他可能影响网络的工具,然后重试。

mrphzbgm

mrphzbgm2#

在spark/bin目录下的load-spark-env.sh文件中添加SPARK_SPARK_IP
export SPARK_EXPLORE_IP=”127.0.0.1“

yyyllmsg

yyyllmsg3#

看起来你使用了一些旧版本的spark。在你的情况下,尝试添加这行:

conf.set("spark.driver.bindAddress", "127.0.0.1")

字符串
如果你使用spark 2.0+,下面应该可以做到:

val spark: SparkSession = SparkSession.builder()
.appName("Word Count")
.master("local[*]")
.config("spark.driver.bindAddress", "127.0.0.1")
.getOrCreate()

gijlo24d

gijlo24d4#

下面的代码应该可以做到这一点:

sudo hostname -s 127.0.0.1

字符串

du7egjpx

du7egjpx5#

这对我在pySpark中遇到的同样的错误很有效:

from pyspark import SparkContext, SparkConf
conf_spark = SparkConf().set("spark.driver.host", "127.0.0.1")
sc = SparkContext(conf=conf_spark)

字符串

zhte4eai

zhte4eai6#

我认为 setMastersetAppName 将返回一个新的SparkConf对象,并且conf.setMaster("local")行不会影响conf变量。所以你应该尝试:

val conf = new SparkConf()
    .setMaster("local[*]")
    .setAppName("Word Count")

字符串

o4hqfura

o4hqfura7#

spark试图绑定的端口似乎已经在使用中。这个问题是在你成功运行spark几次之后开始发生的吗?你可能想检查那些以前运行过的spark进程是否还活着,并且正在占用一些端口(一个简单的jps/ps -ef应该告诉你)。如果是,杀死这些进程并重试。

vx6bjr1n

vx6bjr1n8#

将您的主机名和内部IP添加到/etc/hosts

更多说明

使用以下命令获取主机名:

hostname
# OR
cat /proc/sys/kernel/hostname

字符串
使用此命令获取内部IP:

ip a


更改值并添加到/etc/hosts
联系我们
范例:
192.168.1.5 www.example.com
或者(前一行更好!)
127.0.0.1 www.example.com

tjrkku2a

tjrkku2a9#

另外,dataK推荐的解决方案也适用于Spark集群和PySpark之间的K8S。简短说明:

  • 当您将驱动程序主机设置为127.0.0.1时,您实际上是在告诉Spark将驱动程序服务绑定到pod的localhost,然后Kubernetes可以正确地将其路由到同一命名空间内的Spark集群服务。

相关问题