【问题标题】:Apache Giraph 1.0.0 - How is memory allocated for vertices?Apache Giraph 1.0.0 - 如何为顶点分配内存?
【发布时间】:2014-11-12 05:01:29
【问题描述】:

最近,我成功地创建了一个自定义顶点类,其中每个顶点都有一个 LongWritable id,这个 id 也是它自己的值。我的 Giraph 程序在一个小的顶点集(100,000 个顶点)上成功运行,程序完成并输出预期值。但是,当我将卷增加到 3000 万个顶点时,程序会在总内存用完时挂起(每个映射器的堆大小为 1.5 GB)。由于我的顶点类只包含一个 id 和值(8 + 8 = 16 字节)以及发出的边(平均 8*8*2 = 128 字节),我不明白为什么内存消耗如此之高。从下面的日志消息中可以看出,内存在 1363 MB 处最大为 450 万个顶点,因此当 Giraph 运行时每个顶点占用 317 个字节。 Giraph 中的哪些额外数据结构导致字节/顶点如此之高?

readVertexInputSplit: Loaded 4500000 vertices at 90245.3768041096 vertices/sec 0 edges at 0.0 edges/sec Memory (free/total/max) = 187.52M / 1363.00M / 1365.50M

waitFor: Future result not ready yet java.util.concurrent.FutureTask@5f7bd943

【问题讨论】:

    标签: java memory giraph


    【解决方案1】:

    只是为寻找答案的人提供答案。

    尝试改变 Giraph 保存分区的方式。 如果使用默认值,则会有很大的开销。 请改用org.apache.giraph.partition.ByteArrayPartition,它实际上只将您的数据保存为字节数组,而不是包装形式。 Java 有保存对象的开销,这在您的情况下非常明显,因为您有许多小对象 - 因此浪费也很高。

    此外,通常建议运行小型映射器。 最好有几个强大的节点(大约 10 个内核和 30-60GB 内存)而不是几十个小节点。

    可能还有很多其他原因,但我不能说没有细节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多