我对spark有一个非常基本的了解,我正在努力寻找可以帮助我实现以下目标的东西:
在所有节点上异步共享一个对象池。
我现在想的是,假设有十个节点从1到10编号 如果我有一个对象,我将必须使我的对象同步,以便任何节点都可以访问它。我不要那个。 第二个选择是,我可以有一个说10个对象的池。 我想以这样的方式编写我的代码:节点号1总是使用对象号1,节点号2总是使用对象号2等等。
在执行任务之前,示例方法是获取线程ID并使用对象编号(threadID%10)。这会导致很多碰撞而无法正常工作。
有没有办法可以以某种方式获取nodeID或processID,并使我的代码根据该ID获取对象?或者在我的集群上有一个异步的对象池的其他方法?
如果这听起来微不足道,我道歉,我刚刚开始,在网上找不到与我怀疑相关的大量资源。
PS:如果重要的话,我正在使用SparkStreaming + Kafka + YARN设置。
答案 0 :(得分:0)
Spark会自动在所有可用群集节点上对数据进行分区;您不需要控制或跟踪实际存储分区的位置。一些RDD操作还需要由Spark完全管理的混洗,因此您不能依赖于分区的布局。
共享对象只有在不可变的情况下才有意义。每个工作节点都会收到原始对象的副本,对其进行的任何本地更改都不会反映在其他节点上。如果这就是您所需要的,您可以使用sc.broadcast()
在并行操作之前有效地在所有工作人员之间分配对象。