我正在努力在多宿主网络情况下设置Spark集群,但遇到了一些问题。我将从物理配置开始。
我在一个机架中有 12 个节点,这些节点有一个使用 ipoib 的机架间 100G infiniband 网络和一个 1G 管理网络。
当我从集群上的主节点运行作业时,Spark 效果很好,但现在我正在尝试从连接到管理网络的工作站执行作业,这是我遇到麻烦的地方。
所有的 spark 节点都有它们的主机文件指向 infiniband 网络,因为我希望它们通过该网络进行通信。我必须将主节点的SPARK_MASTER_HOST设置为 0.0.0.0,以便能够从我的工作站连接到主节点。
现在我可以创建一个 SparkSession 并执行操作,但它总是挂起,当我查看工作人员的日志时,我看到他们收到"没有路由到主机"错误。似乎即使节点上的默认路由设置为管理子网,它也尝试使用 infiniband 网络连接回客户端。(我应该指出,我可以从所有客户端 ping 我的工作站,这样我知道网络路由很好。目前所有防火墙都已关闭(
作为旁注,由于此设置,spark master Web 界面不能很好地工作,因为所有指向工作线程的链接都指向 infiniband IP 地址,因此它总是失败,但如果您只是手动将地址栏中的 IP 更改为正确的子网,它可以工作。这也很好解决,但没什么大不了的。
我尝试浏览 Spark 文档,但我并没有真正找到任何看起来有用的东西,我尝试使用一些网络设置,但我没有太多运气。我很难相信 Spark 不支持拥有专用网络,但也许情况就是这样。
我感谢你们能给我的任何帮助或想法。
我过去一直面对这些问题(在InfiniBand的背景下也是如此(,但没有找到合适的解决方案,而只是一些解决方法。 问题是Spark不允许客户端<>主节点和主<>worker在不同的网络上连接。
解决方法 #1:使用 YARN 群集模式 您的应用程序将在 YARN 集群中运行(我假设它与您的 Spark 集群相同(,从而可以访问 InfiniBand 网络。在这种情况下,您必须确保作业可以通过管理网络提交到 YARN。然后,YARN将启动与InfiniBand网络绑定的Spark进程。
解决方法 #2:代理 另一种选择(我没有尝试,但应该有效(是在 Spark Master 节点上设置一个代理守护进程,该守护进程将中继您的管理<->IB 网络。