Traté de construir un clúster Spark usando una máquina virtual local de Ubuntu como maestra y una máquina virtual remota de Ubuntu como trabajador. Como la máquina virtual local se ejecuta en una caja virtual, para que un invitado remoto pueda acceder a ella, reenvié el puerto 7077 de la máquina virtual al puerto 7077 del host. Comienzo maestro por:
./sbin/start-master.sh -h 0.0.0.0 -p 7077 Lo hice escuchando en 0.0.0.0 , porque si uso el 127.0.1.1 predeterminado, el invitado remoto no podrá conectarse. Comienzo el trabajador ejecutando el siguiente comando en la máquina remota:
./bin/spark-class org.apache.spark.deploy.worker.Worker spark://129.22.151.82:7077 El trabajador puede conectarse al maestro, que se puede ver en la interfaz de usuario: 
Luego traté de ejecutar el código python de ejemplo "pi":
from pyspark import SparkContext, SparkConf conf=SparkConf().setAppName("Pi").setMaster("spark://0.0.0.0:7077) sc=SparkContext(conf=conf) ... Una vez que lo ejecuto, el programa nunca se detiene, noté que el programa siempre está eliminando y agregando ejecutores, porque los ejecutores siempre salen con el código de error 1. Y este es el stderr del ejecutor:
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) Noté que el error aquí es en realidad un problema de red. El trabajador en realidad está tratando de acceder a 10.0.2.15 que es la dirección IP NAT local de mi máquina virtual, pero falló. Este error nunca ocurre cuando solo implemento el trabajador desde mi computadora local. ¿Alguien tiene alguna idea de por qué se produce este error? ¿Por qué el trabajador intenta acceder a la dirección IP 10.0.2.15 en lugar de mi IP pública?
Por cierto, ya configuré el acceso ssh sin llave de maestro a esclavo.
Resolví el problema asegurándome de que las VM dentro del clúster pertenezcan a la misma subred. Como ejemplo, inicialmente, configuré la IP 192.168.56.101 como nodo maestro y 192.168.57.101 como nodo trabajador con 255.255.255.0 como máscara de subred. Pero esto significa que ambas direcciones IP no están dentro de la misma subred. Después de cambiar la máscara de subred a, por ejemplo, 255.255.0.0 , pude ejecutar mi aplicación correctamente. Es posible que también deba editar algunos archivos de configuración en consecuencia (por ejemplo, ~/.bashrc , conf/spark-env.sh , conf/slaves.sh , conf/spark-default.conf y /etc/hosts )