【问题标题】:Which is better: sending many small messages or fewer large ones?哪个更好:发送许多小消息或更少大消息?
【发布时间】:2014-09-04 18:21:38
【问题描述】:

我有一个应用程序,其消息传递粒度可以通过两种方式编写 - 发送许多小消息与(可能远)更少的大消息。从概念上讲,移动的是一组“活动”顶点 ID,它们可能会在每个超级步骤中根据顶点管理的已处理列表(顶点值)进行过滤。活到最后的人是幸运的赢家。 compute() 会计算一组“对我来说很新”的传入 ID,它们非常适合传出消息,但我可以轻松地一次发送每个 ID。我的猜测是发送更少的消息更重要,但是每组可能包含数千个 ID。谢谢。

附:一个附带问题:我发现的少数自定义消息类型示例是具有一些原始实例变量的相对简单的对象,而不是集合。将一组 ID 作为消息发送是不是很疯狂?

【问题讨论】:

    标签: giraph


    【解决方案1】:

    我使用了列表甚至地图来发送或存储为顶点数据,所以这不是问题。我认为你想选择哪个 giraph 并不重要,我宁愿选择许多简单的小消息,因为你会适当地使用 Giraph。相反,您需要通过消息列表进入计算函数,并通过 ID 列表进入每条消息。

    就性能而言,它应该没有任何区别。我发现有一个很大的不同是,尝试在 on cycle 中尽可能多地进行计算,因为在周期之间切换和同步消息,......需要很多时间。只要这没有改变,它应该或多或少相同,并且当您保持较小的消息大小时可能更容易阅读和维护。

    【讨论】:

      【解决方案2】:

      为了回答您的问题,您需要了解MessageStore 接口及其实现。

      简而言之,在引擎盖下,它采取了以下步骤:

      1. worker 接收消息的字节原始输入和目标 ID
      2. worker 对消息进行排序并将它们放入 A Map of A Map 中。第一个map的key是partition ID,section map的key是vertex ID。 (有点像邮局。工作就像中心枢纽,它先将字母分类成不同的邮政编码,然后在每个邮政编码中按地址排序)
      3. 当轮到顶点计算时,该顶点的消息的Iterable 将传递给顶点的compute 方法,这就是您获取消息并使用它的地方。

      如果两种情况的总字节数相同,那么更少和更大的消息会更好,因为排序更少。

      【讨论】:

        【解决方案3】:

        此外,您可以发送许多小消息,但让 Giraph(几乎)自动将其转换为长消息。你可以使用Combiners

        Giraph 网站上关于这个主题的文档很糟糕,但您也许可以从书中提取一个示例 Practical Graph Analytics with Apache Giraph

        这主要取决于您发送的消息类型。

        【讨论】:

          猜你喜欢
          • 2012-03-27
          • 2012-08-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-23
          相关资源
          最近更新 更多