将 docker 容器内的 spark-submit 发送到 YARN 集群
Sending spark-submit inside a docker container to a YARN cluster
我在 docker 容器中安装了 spark 1.6.1。我可以在本地 运行 我的 spark python 应用程序,但是当我尝试将它提交到我的主机外部的 yarn 集群时(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.apply$mcV$sp(ApplicationMaster.scala:672)
at org.apache.spark.deploy.SparkHadoopUtil$$anon.run(SparkHadoopUtil.scala:69)
at org.apache.spark.deploy.SparkHadoopUtil$$anon.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: 我检查了以下link: ,这和我的问题确实很相似。但是正如 spark 的问题所说,它不会修复它
所以为了回答我的问题,我必须 运行 我的容器在主机网络上。如果您在代理后面,请注意为 SPARK_LOCAL_IP(env 变量)和 spark.driver.host(conf 选项)使用正确的虚拟接口 (eth1)。
Yarn 集群在联系驱动程序时遇到问题,因为容器 ip 是根据其网络设置的。
由于容器在宿主网络中,容器部署的任何服务都会自动暴露,无需暴露或绑定。
Ps:我在客户端模式下部署我的应用程序。
我有同样的问题 运行 Spark ThrifrServer 2.2.0 on docker on yarn in client mode。我的技巧是输入 /etc/hosts(docker) docker 接口的 ip 地址 - 如果您使用 docker -h 选项,这应该自动完成。向 /etc/hosts 中的所有 hadoop 节点添加 docker 为 运行 的实际主机的 IP 地址。所有端口都必须公开(blockManager,driver.port)在配置文件中而不是在 SPARK_LOCAL_IP 和 spark.driver.host 中使用 ip 我使用了 dns 主机名。
我在 docker 容器中安装了 spark 1.6.1。我可以在本地 运行 我的 spark python 应用程序,但是当我尝试将它提交到我的主机外部的 yarn 集群时(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.apply$mcV$sp(ApplicationMaster.scala:672)
at org.apache.spark.deploy.SparkHadoopUtil$$anon.run(SparkHadoopUtil.scala:69)
at org.apache.spark.deploy.SparkHadoopUtil$$anon.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: 我检查了以下link:
所以为了回答我的问题,我必须 运行 我的容器在主机网络上。如果您在代理后面,请注意为 SPARK_LOCAL_IP(env 变量)和 spark.driver.host(conf 选项)使用正确的虚拟接口 (eth1)。
Yarn 集群在联系驱动程序时遇到问题,因为容器 ip 是根据其网络设置的。
由于容器在宿主网络中,容器部署的任何服务都会自动暴露,无需暴露或绑定。
Ps:我在客户端模式下部署我的应用程序。
我有同样的问题 运行 Spark ThrifrServer 2.2.0 on docker on yarn in client mode。我的技巧是输入 /etc/hosts(docker) docker 接口的 ip 地址 - 如果您使用 docker -h 选项,这应该自动完成。向 /etc/hosts 中的所有 hadoop 节点添加 docker 为 运行 的实际主机的 IP 地址。所有端口都必须公开(blockManager,driver.port)在配置文件中而不是在 SPARK_LOCAL_IP 和 spark.driver.host 中使用 ip 我使用了 dns 主机名。