我尝试使用本地Ubuntu虚拟机作为主服务器和远程Ubuntu虚拟机作为worker来构建spark集群。 当本地虚拟机在虚拟机中运行时,为了使远程访客可以访问它,我将虚拟机的7077端口转发到主机的7077端口。 我开始掌握:
./sbin/start-master.sh -h 0.0.0.0 -p 7077
我在0.0.0.0
上进行了监听,因为如果我使用默认的127.0.1.1
,则远程访客无法连接到它。
我通过在远程计算机上执行以下命令来启动worker:
./bin/spark-class org.apache.spark.deploy.worker.Worker
spark://129.22.151.82:7077
然后我试图运行" pi"示例python代码:
from pyspark import SparkContext, SparkConf
conf=SparkConf().setAppName("Pi").setMaster("spark://0.0.0.0:7077)
sc=SparkContext(conf=conf)
....
一旦我运行它,程序永远不会停止,我注意到程序总是删除并添加执行程序,因为执行程序总是以错误代码1退出。这是执行程序stderr
:
Using Spark's default log4j profile: org/apache/spark/log4j- defaults.properties
16/02/25 13:22:22 INFO CoarseGrainedExecutorBackend:
Registered signal handlers for [TERM, HUP, INT]
16/02/25 13:22:22 WARN NativeCodeLoader: Unable to load
native-hadoop library for your platform... using builtin-java
classes where applicable
16/02/25 13:22:23 INFO SecurityManager: Changing view acls to: kxz138,adminuser
16/02/25 13:22:23 INFO SecurityManager: Changing modify acls to: kxz138,adminuser
16/02/25 13:22:23 INFO SecurityManager: SecurityManager:
authentication disabled; ui acls disabled; users with view
permissions: Set(kxz138, adminuser); users with modify permissions:
Set(kxz138, adminuser)
**16/02/25 13:22:23 ERROR UserGroupInformation:
PriviledgedActionException as:adminuser (auth:SIMPLE)
cause:java.io.IOException: Failed to connect to /10.0.2.15:34935
Exception in thread "main" java.io.IOException: Failed to connect to /10.0.2.15:34935**
at org.apache.spark.network.client.TransportClientFactory.createClient(TransportClientFactory.java:216)
at org.apache.spark.network.client.TransportClientFactory.createClient(TransportClientFactory.java:167)
at org.apache.spark.rpc.netty.NettyRpcEnv.createClient(NettyRpcEnv.scala:200)
at org.apache.spark.rpc.netty.Outbox$$anon$1.call(Outbox.scala:187)
我注意到这里的错误实际上是一个网络问题。该工作人员实际上正在尝试访问10.0.2.15
,这是我的虚拟机的本地NAT IP地址,但失败了。
当我仅从本地计算机部署worker时,不会发生此错误。
任何人都知道为什么会出现这个错误?为什么工作人员试图访问IP地址10.0.2.15
而不是我的公共IP?
顺便说一句,我已经设置了从主服务器到服务器的无密钥ssh访问。
答案 0 :(得分:0)
我通过确保集群中的VM属于同一子网解决了该问题。例如,最初,我将IP 192.168.56.101
设置为主节点,将192.168.57.101
设置为工作节点,并以255.255.255.0
作为子网掩码。但这意味着两个IP地址都不在同一个子网内。将子网掩码更改为255.255.0.0
后,可以正常运行我的应用程序。您可能还需要相应地编辑一些配置文件(例如~/.bashrc
,conf/spark-env.sh
,conf/slaves.sh
,conf/spark-default.conf
和/etc/hosts
)