将docker容器内的spark-submit发送到YARN集群

时间:2016-10-27 15:50:11

标签: python apache-spark docker containers yarn

我在docker容器中安装了spark 1.6.1。我可以在本地运行我的spark python应用程序,但是当我尝试将它提交到我的主机之外的一个纱线集群中时(spark-submit --master yarn myapp.py)它仍处于ACCEPTED状态。如果我从我的应用程序进入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 个答案:

答案 0 :(得分:2)

所以要回答我的问题,我必须在主机网络上运行我的容器。如果您在代理后面,请小心使用正确的虚拟接口(eth1)作为SPARK_LOCAL_IP(env变量)和spark.driver.host(conf选项)。

由于容器ip是根据网络设置的,因此纱线群集在接触驱动程序时遇到了麻烦。

由于容器位于主机网络中,容器部署的任何服务都将自动公开,无需公开或绑定。

Ps:我正在客户端模式下部署我的应用程序。

答案 1 :(得分:0)

在客户端模式下,我在docker上的docker上运行Spark ThrifrServer 2.2.0时遇到了同样的问题。我的诀窍是输入docker接口的/ etc / hosts(docker)ip地址-如果您使用docker -h选项,这应该自动完成。向/ etc / hosts中的所有hadoop节点添加运行docker的实际主机的IP地址。所有端口都必须公开(blockManager,driver.port)在配置文件中,而不是在SPARK_LOCAL_IP和spark.driver.host中使用ip,我使用了dns主机名。