我正在开发一个涉及遍历计算节点集群中的大型不平衡树的项目。树将在群集之间划分。但是,很快就会出现负载不平衡,我会调用Load Balancer来执行必要的迁移。我在为树提供一个好的设计时遇到了一些困难,它允许并行遍历并简化数据分区。
编辑:数据分发和迁移以预定大小的块发生(块大小不是块中的节点)。我需要弄清楚如何对树进行块化,以便每个块包含可以在单个进程中遍历的数据。
答案 0 :(得分:1)
假设一棵树有(大)节点数T,树是静态的。
整个子树很可能对" keep"并作为块进行处理。我很想挑选大小为K的叶子树(想象一个大三角形),然后是大小为K的内部树木,直到树木被这样的三角形平铺。你显然希望K足够大,以便在三角形上工作是有效的。与三角形边缘(父级和所有子级)的通信成本相比,您希望它足够小,因此存在比计算节点N更多的三角形。
一个有趣的问题是知道三角形之间会发生多少通信。我假设通过三角树根的通信量与三角形中每个叶子的通信成本大致相同。
我们最终得到了T / K三角形。我们假设它们是根据树的前缀走路编号的,因此最左边的三角形为零,其父级为1,等等。
您可以向节点n分配数量为N的所有三角形N等于n。
你可能会优化一下。您可以将最左边的P =(T / K)/ N三角形发送到节点0,将下一个P发送到节点1,...可能这会使跨越三角形边界的通信保持最小,因为每个节点拥有大的连续块树尽可能。如果通过三角形根的通信量明显大于通过叶子的数量,这也将有所帮助。毕竟,您可以在树上上下发送大型摘要。
您仍然希望处理大小为K的块,因为您希望以平均在所有节点上平均的方式分配工作。
并行计算中使用的一个标准技巧是所有数据的彻底复制。也就是说,如果它不是巨大的,你可以将整个树发送到每个计算节点。然后,每个节点可以根据上述规则决定它想要处理的树的哪个部分,但是当它需要查看它不拥有的树的一部分时,它可以避免通信。