我已经在docker容器中安装了spark 1.6.1。我可以在本地运行我的spark python应用程序,但是当我试图将它提交到我的主机之外的yarn集群时(spark-submit—master yarn myapp.py),它会保持在一个接受状态。如果我从我的应用程序进入stderr日志,我有以下内容:
16/10/26 11:07:25 INFO ApplicationMaster: Waiting for Spark driver to be reachable.
16/10/26 11:08:28 ERROR ApplicationMaster: Failed to connect to driver at 172.18.0.4:50229, retrying ...
16/10/26 11:09:31 ERROR ApplicationMaster: Failed to connect to driver at 172.18.0.4:50229, retrying ...
16/10/26 11:09:32 ERROR ApplicationMaster: Uncaught exception:
org.apache.spark.SparkException: Failed to connect to driver!
at org.apache.spark.deploy.yarn.ApplicationMaster.waitForSparkDriver(ApplicationMaster.scala:501)
at org.apache.spark.deploy.yarn.ApplicationMaster.runExecutorLauncher(ApplicationMaster.scala:362)
at org.apache.spark.deploy.yarn.ApplicationMaster.run(ApplicationMaster.scala:204)
at org.apache.spark.deploy.yarn.ApplicationMaster$$anonfun$main$1.apply$mcV$sp(ApplicationMaster.scala:672)
at org.apache.spark.deploy.SparkHadoopUtil$$anon$1.run(SparkHadoopUtil.scala:69)
at org.apache.spark.deploy.SparkHadoopUtil$$anon$1.run(SparkHadoopUtil.scala:68)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1709)
at org.apache.spark.deploy.SparkHadoopUtil.runAsSparkUser(SparkHadoopUtil.scala:68)
at org.apache.spark.deploy.yarn.ApplicationMaster$.main(ApplicationMaster.scala:670)
at org.apache.spark.deploy.yarn.ExecutorLauncher$.main(ApplicationMaster.scala:697)
at org.apache.spark.deploy.yarn.ExecutorLauncher.main(ApplicationMaster.scala)
172.18.0.4:50229的驱动程序是我的容器。由于我的容器位于IP为10.xx.xx的主机中。我觉得它达不到它是正常的。我如何指定spark必须尝试连接到主机而不是容器?或者有人有解决办法吗?
Ps:我检查了以下链接:使spark在YARN集群模式下使用/etc/hosts文件进行绑定,这与我的问题非常相似。但是spark说它不会修复这个问题
所以为了回答我的问题,我必须在主机网络上运行我的容器。如果您在代理之后,请注意为SPARK_LOCAL_IP (env变量)和spark.driver.host (conf选项)使用正确的虚拟接口(eth1)。
Yarn集群在连接驱动程序时遇到问题,因为容器ip是根据它的网络设置的。
由于容器位于主机网络中,因此容器部署的任何服务都将自动公开,无需公开或绑定。
我在客户端模式下在docker上运行Spark ThrifrServer 2.2.0时遇到了同样的问题。我的技巧是输入/etc/hosts(docker) docker接口的ip地址-如果你使用docker -h选项,这应该会自动完成。对/etc/hosts中的所有hadoop节点添加docker实际运行主机的ip地址。所有端口必须暴露(blockManager, driver.port)在配置文件中,而不是在SPARK_LOCAL_IP和spark.driver.host中使用ip,我使用dns主机名。