如何在dockerized Apache Zeppelin后面公开Spark Driver?

ThR*_*R37 6 docker apache-spark apache-zeppelin

我目前正在使用Apache Zeppelin + Spark 2.x内部的普通发行版构建自定义docker容器.

我的Spark作业将在远程集群中运行,我将yarn-client用作主人.

当我运行笔记本并尝试打印时sc.version,程序卡住了.如果我转到远程资源管理器,已经创建并接受了一个应用程序,但在日志中我可以阅读:

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

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

我目前正在使用以下配置:

  • 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无法启动,阻止该过程前一步.

提前感谢任何想法/建议!

小智 4

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

Apache Zeppelin 架构图

在您的情况下,Spark 解释器 JVM 进程托管 aSparkContext并充当部署模式SparkDriver的实例yarn-client。根据Apache Spark 文档,容器内的此进程需要能够与 YARN ApplicationMaster 和集群中的所有 SparkWorkers 机器来回通信。

Apache Spark架构图

这意味着您必须打开多个端口并在容器和主机之间手动转发。以下是ZEPL 的一个项目示例,该项目执行类似的工作,其中我们使用了7 个端口才能完成工作。

另一种方法可以在主机模式下运行 Docker 网络(尽管由于最近的错误,它显然不适用于 os x )