我正在尝试在本地托管一个Spark独立集群。我在 LAN 上连接了两台异构机器。下面列出的每个体系结构部分都在 docker 上运行。 我有以下配置
- 计算机 1 上的主服务器(端口 7077 公开)
- 机器 1 上的工人
- 机器 2 上的驱动程序
我使用一个测试应用程序来打开一个文件并计算其行数。 当文件复制到所有工作线程并且我使用SparkContext.readText()
但是,当我使用SparkContext.parallelize()
在工作线程上访问它时,当文件仅存在于 worker 上时,我有以下显示:
INFO StandaloneSchedulerBackend: Granted executor ID app-20180116210619-0007/4 on hostPort 172.17.0.3:6598 with 4 cores, 1024.0 MB RAM
INFO StandaloneAppClient$ClientEndpoint: Executor updated: app-20180116210619-0007/4 is now RUNNING
INFO StandaloneAppClient$ClientEndpoint: Executor updated: app-20180116210619-0007/4 is now EXITED (Command exited with code 1)
INFO StandaloneSchedulerBackend: Executor app-20180116210619-0007/4 removed: Command exited with code 1
INFO StandaloneAppClient$ClientEndpoint: Executor added: app-20180116210619-0007/5 on worker-20180116205132-172.17.0.3-6598 (172.17.0.3:6598) with 4 cores```
这种情况又一次地继续下去,而没有实际计算应用程序。
当我将驱动程序与工作人员放在同一台电脑上时,这是有效的。所以我想在网络上允许在如此两个之间建立某种连接。您是否知道一种方法可以做到这一点(要打开哪些端口,要在/etc/hosts 中添加哪些地址......
TL;灾难恢复确保可以从群集中的每个节点访问spark.driver.host:spark.driver.port
。
通常,您必须确保所有节点(执行程序和主节点)都可以访问驱动程序。
- 在群集模式下,驱动程序在其中一个执行程序上运行,只要没有为连接关闭端口,默认情况下就可以满足这一点(见下文)。
- 在已启动驱动程序的客户端模式计算机中,必须可从群集访问。这意味着
spark.driver.host
必须解析为可公开访问的地址。
在这两种情况下,您都必须记住,默认情况下驱动程序在随机端口上运行。可以通过设置spark.driver.port
来使用固定的。显然,如果您想同时提交多个申请,这效果不佳。
此外:
当文件仅存在于工作线程上时
行不通。所有输入都必须可从驱动程序以及每个执行器节点访问。