Spark运行SparkPi示例时出现Cannot assign requested address错误的排查与解决尝试
解决Spark Pi运行时的Cannot assign requested address错误
我之前也碰到过完全一样的情况!从以太网切换到WiFi后,Spark的网络绑定逻辑就乱了,只设置SPARK_LOCAL_IP确实没法解决这个端口绑定失败的问题,核心是要明确指定Spark Driver的绑定地址。
问题根源
切换网络后,系统的主机名解析或者本地IP映射发生了变化,Spark Driver默认会尝试绑定到当前主机的某个可用地址,但找不到合适的端口/地址组合,就会抛出你看到的BindException。
快速临时解决方法
直接在运行示例的命令里加上spark.driver.bindAddress配置:
./bin/run-example SparkPi 10 --conf spark.driver.bindAddress=127.0.0.1
如果之后需要其他设备访问Spark的UI或者集群,也可以把127.0.0.1换成你当前WiFi的实际IP(可以用ip addr或者ifconfig命令查看)。
永久解决方法(无需每次加参数)
方法1:修改spark-env.sh配置
- 进入Spark的conf目录:
cd spark/conf - 如果没有
spark-env.sh,先复制模板文件:cp spark-env.sh.template spark-env.sh - 编辑
spark-env.sh,添加一行:
export SPARK_DRIVER_BIND_ADDRESS=127.0.0.1
- 保存后重新运行示例即可。
方法2:修改spark-defaults.conf配置
- 同样进入conf目录,复制模板(如果没有的话):
cp spark-defaults.conf.template spark-defaults.conf - 编辑文件,添加一行:
spark.driver.bindAddress 127.0.0.1
关于非法反射警告的说明
你看到的那几条非法反射访问警告是Spark 3.1.1和Java 11的兼容问题,不会影响Spark的正常运行。要是觉得看着碍眼,可以在Spark的配置里添加JVM参数:
export SPARK_DRIVER_OPTS="--add-opens java.base/java.nio=ALL-UNNAMED"
不过这个不是导致你当前绑定错误的原因,可以不用优先处理。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

