Docker容器中的Apache Spark独立集群模式

11

我正试图构建一个包含Apache Spark的Docker镜像。它是基于openjdk-8-jre官方镜像构建的。

目标是以集群模式执行Spark,因此至少有一个主节点(通过sbin/start-master.sh启动)和一个或多个从节点(sbin/start-slave.sh)。有关我的Dockerfile和入口脚本,请参见spark-standalone-docker

构建本身实际上是可以通过的,问题在于当我想运行容器时,它会在短时间内启动并停止。原因是Spark主节点启动脚本以守护进程模式启动主节点并退出。因此,容器终止,因为不再有前台运行的进程。

明显的解决方案是在前台运行Spark主进程,但我无法弄清楚如何做到这一点(即使在谷歌上也没有找到任何东西)。我“解决方法”是在Spark日志目录上运行tail -f

因此,我的问题是:

  1. 如何在前台运行Apache Spark Master?
  2. 如果第一个方法不可行/不可行/不可行,保持容器“活动”的首选(即最佳实践)解决方案是什么(我真的不想使用无限循环和睡眠命令)?
2个回答

10

更新的答案(适用于spark 2.4.0):

要在前台启动spark主节点,只需在运行./start-master.sh之前,在您的环境中设置ENV变量SPARK_NO_DAEMONIZE=true即可。

然后您就可以开始了。

有关更多信息,请查看$SPARK_HOME/sbin/spark-daemon.sh。

# Runs a Spark command as a daemon.
#
# Environment Variables
#
#   SPARK_CONF_DIR  Alternate conf dir. Default is ${SPARK_HOME}/conf.
#   SPARK_LOG_DIR   Where log files are stored. ${SPARK_HOME}/logs by default.
#   SPARK_MASTER    host:path where spark code should be rsync'd from
#   SPARK_PID_DIR   The pid files are stored. /tmp by default.
#   SPARK_IDENT_STRING   A string representing this instance of spark. $USER by default
#   SPARK_NICENESS The scheduling priority for daemons. Defaults to 0.
#   SPARK_NO_DAEMONIZE   If set, will run the proposed command in the foreground. It will not output a PID file.
##

1
当在容器化环境中使用./start-master.sh脚本(即将Spark容器化)时,这实际上非常有用。在我的情况下,Kubernetes始终报告容器崩溃(因为Spark作为守护程序服务启动)。然而,设置了这个环境变量后,在Docker容器内一切都可以完美运行! - bajro
@Bajro,我有一个Gitlab仓库实现了一个Spark Docker解决方案。如果你感兴趣的话,请随意查看并给它一个star https://gitlab.com/dsncode/spark-docker - dsncode
这是将Spark进程置于前台的官方方法。请参阅Apache官方https://github.com/apache/spark/pull/15338 - Ben

6
如何在前台运行Apache Spark Master?
您可以使用带有Master参数的spark-class命令。
bin/spark-class org.apache.spark.deploy.master.Master

同样适用于工人:
bin/spark-class org.apache.spark.deploy.worker.Worker $MASTER_URL

如果您正在寻找生产就绪的解决方案,您应该考虑使用像 dumb-inittini 这样的适当的监管程序。

非常好用,非常感谢!关于监管器:我打算将主节点和从节点作为独立的容器运行。我发现使用监管器的主要原因是在一个容器内运行多个守护进程。除此之外还有其他原因吗? - akoeltringer
这里没有明确的对或不对,但是关于为什么你可能想要查看https://engineeringblog.yelp.com/2016/01/dumb-init-an-init-for-docker.html的一些理由。 - zero323

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接