尝试使用公共 IP 在 EC2 节点上启动 Spark 主服务器时出现 java.net.BindException

Posted

技术标签:

【中文标题】尝试使用公共 IP 在 EC2 节点上启动 Spark 主服务器时出现 java.net.BindException【英文标题】:Getting java.net.BindException when attempting to start Spark master on EC2 node with public IP 【发布时间】:2015-07-27 17:11:53 【问题描述】:

我正在尝试为 EC2 节点上的独立集群启动 Spark 主服务器。我使用的 CLI 命令如下所示:

JAVA_HOME=<location of my JDK install> \ java -cp <spark install dir>/sbin/../conf/:<spark install dir>/lib/spark-assembly-1.4.0-hadoop2.6.0.jar:<spark install dir>/lib/datanucleus-core-3.2.10.jar:<spark install dir>/lib/datanucleus-api-jdo-3.2.6.jar:<spark install dir>/lib/datanucleus-rdbms-3.2.9.jar \ -Xms512m -Xmx512m -XX:MaxPermSize=128m \ org.apache.spark.deploy.master.Master --port 7077 --webui-port 8080 --host 54.xx.xx.xx

请注意,我指定了 --host 参数;我希望我的 Spark 主服务器监听特定的 IP 地址。我指定的主机(即 54.xx.xx.xx)是我的 EC2 节点的公共 IP;我已经确认在端口 7077 上没有其他任何东西在监听,并且我的 EC2 安全组已打开所有端口。我还仔细检查了公共 IP 是否正确。

当我使用 --host 54.xx.xx.xx 时,我收到以下错误消息:

15/07/27 17:04:09 ERROR NettyTransport: failed to bind to /54.xx.xx.xx:7093, shutting down Netty transport Exception in thread "main" java.net.BindException: Failed to bind to: /54.xx.xx.xx:7093: Service 'sparkMaster' failed after 16 retries! at org.jboss.netty.bootstrap.ServerBootstrap.bind(ServerBootstrap.java:272) at akka.remote.transport.netty.NettyTransport$$anonfun$listen$1.apply(NettyTransport.scala:393) at akka.remote.transport.netty.NettyTransport$$anonfun$listen$1.apply(NettyTransport.scala:389) at scala.util.Success$$anonfun$map$1.apply(Try.scala:206) at scala.util.Try$.apply(Try.scala:161) at scala.util.Success.map(Try.scala:206) at scala.concurrent.Future$$anonfun$map$1.apply(Future.scala:235) at scala.concurrent.Future$$anonfun$map$1.apply(Future.scala:235) at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) at akka.dispatch.BatchingExecutor$Batch$$anonfun$run$1.processBatch$1(BatchingExecutor.scala:67) at akka.dispatch.BatchingExecutor$Batch$$anonfun$run$1.apply$mcV$sp(BatchingExecutor.scala:82) at akka.dispatch.BatchingExecutor$Batch$$anonfun$run$1.apply(BatchingExecutor.scala:59) at akka.dispatch.BatchingExecutor$Batch$$anonfun$run$1.apply(BatchingExecutor.scala:59) at scala.concurrent.BlockContext$.withBlockContext(BlockContext.scala:72) at akka.dispatch.BatchingExecutor$Batch.run(BatchingExecutor.scala:58) at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:41) at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:393) at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)

如果我省略 --host 参数,则不会发生这种情况,如果我使用 --host 10.0.xx.xx,则不会发生这种情况,其中 10.0.xx.xx 是我的私有 EC2 IP 地址。

为什么 Spark 无法绑定到公共 EC2 地址?

【问题讨论】:

这里有同样的问题(但是使用更衣室的 Docker 机器)。 【参考方案1】:

我在使用 Oracle 云实例时遇到了同样的问题。我的私有 IP 是 10.x.x.2,我的公共 IP 是 140.x.x.238。

您可以按照以下步骤操作:

    检查您的私有 IP 地址

    使用命令ifconfig查看你的网卡地址

ens3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 9000
        inet 10.x.x.2  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::17ff:fe00:7cf9  prefixlen 64  scopeid 0x20<link>
        ether 02:00:17:00:7c:f9  txqueuelen 1000  (Ethernet)
        RX packets 146457  bytes 61901565 (61.9 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 142865  bytes 103614447 (103.6 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    设置 conf/spark-env.sh
SPARK_LOCAL_IP=127.0.0.1
SPARK_MASTER_IP=YOUR_HOST_NAME

    更改主机文件

    在 Ubuntu 18.04 中,修改 /etc/hosts

    删除127.0.1.1 YOUR_HOST_NAME之类的东西

    在我的情况下将 140.x.x.238 YOUR_HOST_NAME 更改为 10.x.x.2 YOUR_HOST_NAME

【讨论】:

【参考方案2】:

尝试设置环境变量 SPARK_LOCAL_IP=54.xx.xx.xx

引用第一个SO answer to a similar problem here。

【讨论】:

以上是关于尝试使用公共 IP 在 EC2 节点上启动 Spark 主服务器时出现 java.net.BindException的主要内容,如果未能解决你的问题,请参考以下文章

无法恢复 AWS EC2 公共 IP 地址

无法通过公共 ip 访问 EC2 实例上的站点

Amazon AWS负载均衡器EC2实例解决ip范围

在不更改公共 IP 的情况下增加 EC2 容量

在 EC2 上使用 nginx 设置 django

无法通过PHP中的fsockopen访问ec2实例,指向我的ec2公共IP和指定端口