我已经在docker容器中安装了spark 1.6.1。我可以在本地运行sparkpython应用程序,但当我尝试将它提交到主机外的一个yarn集群(sparksubmit--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.xx我发现这是正常的,它不能达到它。如何指定spark必须尝试连接到主机而不是容器?或者有人有解决办法吗?
ps:我已经检查了以下链接:making spark use/etc/hosts file for binding in yarn cluster mode,这与我的问题非常相似。但正如spark的问题所说,它不会解决这个问题
2条答案
按热度按时间z8dt9xmd1#
在客户端模式下,我在yarn上的docker上运行spark服务器2.2.0时遇到了同样的问题。我的诀窍是在docker接口的/etc/hosts(docker)ip地址中输入—如果使用docker-h选项,这应该是自动完成的。向/etc/hosts中的所有hadoop节点添加运行docker的实际主机的ip地址。所有端口必须在配置文件中公开(blockmanager,driver.port),而不是在spark\u local\u ip和spark.driver.host中使用ip我已经使用了dns主机名。
t98cgbkg2#
所以为了回答我的问题,我必须在主机网络上运行我的容器。如果您在代理后面,请小心使用spark\u local\u ip(env变量)和spark.driver.host(conf选项)的正确虚拟接口(eth1)。
由于容器ip是根据其网络设置的,因此Yarn集群无法联系驱动程序。
由于容器位于主机网络中,容器部署的任何服务都将自动公开,无需公开或绑定。
ps:我在客户端模式下部署我的应用程序。