我对spark有一个非常基本的了解,我正在努力找到一些可以帮助我实现以下目标的东西:
在所有节点上异步共享对象池。
我现在想的是,假设有10个节点,从1到10。
如果我只有一个对象,我必须使我的对象同步,以便任何节点都可以访问它。我不想那样。第二个选择是,我可以有一个10个对象的池。我想以这样一种方式来编写代码:节点1总是使用对象1,节点2总是使用对象2,依此类推。。
示例方法是,在执行任务之前,获取线程id并使用对象号(threadid%10)。这将导致大量碰撞,无法工作。
有没有一种方法可以让我以某种方式获取一个nodeid或processid,并让我的代码根据该id获取一个对象?或者以其他方式在集群上拥有异步对象池?
我很抱歉,如果这听起来微不足道,我只是刚刚开始,无法找到很多资源有关我的怀疑网上。
附言:我正在使用sparkstreaming+kafka+Yarn设置,如果有关系的话。
1条答案
按热度按时间6ioyuze21#
spark自动将数据划分到所有可用的集群节点上;您不需要控制或跟踪分区实际存储的位置。一些rdd操作还需要完全由spark管理的洗牌,因此您不能依赖分区的布局。
共享一个对象只有当它是不可变的时才有意义。每个工作节点接收原始对象的副本,对它的任何本地更改都不会反映在其他节点上。如果你需要的话,你可以用
sc.broadcast()
在并行操作之前有效地将对象分布到所有工作进程。