如何在dockerized Apache Zeppelin后面展示Spark Driver?

我目前正在使用Apache Zeppelin + Spark 2.x从简单的发行版中构build一个定制的docker容器。

我的Spark作业将在远程集群中运行,并使用yarn-client作为主节点。

当我运行笔记本并尝试打印sc.version ,程序卡住了。 如果我去远程资源pipe理器,一个应用程序已经被创build和接受,但在日志中,我可以读:

INFO yarn.ApplicationMaster: Waiting for Spark driver to be reachable

我对这种情况的理解是,集群无法与容器中的驱动程序交谈,但是我不知道如何解决这个问题。

我目前正在使用以下configuration:

  • spark.driver.port设置为PORT1 ,选项-p PORT1:PORT1传递给容器
  • spark.driver.host设置为172.17.0.2 (容器的ip)
  • SPARK_LOCAL_IP设置为172.17.0.2 (容器的IP地址)
  • spark.ui.port设置为PORT2 ,选项-p PORT2:PORT2传递给容器

我觉得我应该把SPARK_LOCAL_IP改成主机IP,但是如果我这样做的话,SparkUI将无法启动,阻止了之前的一个步骤。

提前感谢您的任何想法/build议!

好问题! 首先,如您所知,Apache Zeppelin 在单独的进程中运行解释器 。

Apache Zeppelin架构图

在你的情况下,Spark解释器JVM进程托pipe一个SparkContext ,并作为yarn-client部署模式的SparkDriver实例。 根据Apache Spark文档 ,容器内部的这个过程需要能够从YARN ApplicationMaster和群集的所有SparkWorkers机器来回传递。

Apache Spark体系结构图

这意味着你必须打开一些端口,并在容器和主机之间手动转发。 这里有一个ZEPL项目的例子 ,它做了类似的工作,在那里我们用了7个端口完成工作。

Anoter aproach可以在主机模式下运行Dockernetworking(虽然由于最近的一个bug ,它显然不能在os x上运行)