我需要知道Spark如何允许工作节点之间的通信? 分配给工作人员的所有任务都来自主程序,但工作人员的输出可以发送给另一个工作人员,因此它可以处理其中的进一步步骤。
我正在研究一个案例,其中有多种类型的任务要执行,假设说任务A,B,C。 对于要启动的任务C,应该完成任务A和B,但是A和B可以彼此独立地完成。因此,我需要很少的工作人员来完成任务A,很少需要工作人员,他们必须召唤任务C的工人,而不需要主人。请告诉我如何实现这一目标的见解。 纱线有这种功能吗?
答案 0 :(得分:0)
我只是提出了一个可能的解决方案,虽然我自己没有测试过,但我不确定它的成功可能性。
我想到的是通过使用 count 等操作在 B 和 C 任务之间创建一种屏障。这将强制 Spark 在开始使用stage C 之前完成以前所有步骤 - 在所有节点中(我不太确定这个语句)。
然后,您可以使用广播功能来缓存变量,并使其可供所有执行程序使用,而无需与主服务器通信。
答案 1 :(得分:0)
我愿意为这个问题提供可能的答案。在我看来,这可以通过两种方式完成:
1。)如果任务A和B是独立的并且需要在C之前完成,为什么不首先在RDD上执行任务A和B,然后使用这些任务的结果(或新的rdd)并执行C使用另一个动作。
2。)工人间沟通是火花(AFAIK)中的问题。只有火花中的通信方式是广播和累加器变量。但它们都对驾驶员 - 工人沟通有用,而不是工人 - 工人沟通。一种可能的解决方法是将结果或变量从worker保存到公共存储(如HDFS)并从另一个worker访问它。对于例如在PySpark中,有使用Popep,Pydoop,Hadoopy等从工作机器到HDFS进行通信的有效方法。