如何在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 在单独的进程中运行解释器 。
在你的情况下,Spark解释器JVM进程托pipe一个SparkContext
,并作为yarn-client
部署模式的SparkDriver
实例。 根据Apache Spark文档 ,容器内部的这个过程需要能够从YARN ApplicationMaster和群集的所有SparkWorkers机器来回传递。
这意味着你必须打开一些端口,并在容器和主机之间手动转发。 这里有一个ZEPL项目的例子 ,它做了类似的工作,在那里我们用了7个端口完成工作。
Anoter aproach可以在主机模式下运行Dockernetworking(虽然由于最近的一个bug ,它显然不能在os x上运行)