最近,我成功地创建了一个自定义顶点类,其中每个顶点都有一个LongWritable id,这个id也是它自己的值。我的Giraph程序在一个小的顶点集(100,000个顶点)上成功运行,程序完成并输出期望值。但是,当我将卷增加到3000万个顶点时,当总内存达到最大值(堆大小为每个映射器1.5 GB )时,程序挂起。由于我的顶点类只包含一个id和值(8 +8= 16字节)以及发射边(平均8*8*2 = 128字节),我不明白为什么内存消耗如此之高。从下面的日志消息中,内存在1363MB时最大为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
发布于 2019-10-24 02:10:07
只是为了给任何寻找答案的人提供一个答案。
尝试改变Giraph持有分区的方式。如果使用默认的,则会有很大的开销。取而代之的是org.apache.giraph.partition.ByteArrayPartition,它实际上只将数据保存为字节数组,而不是包装形式。Java用来存放对象的开销非常明显,因为你有很多小对象--因此浪费也很高。
此外,通常不建议运行小型映射器。最好有几个功能强大的节点(大约10个核心和30-60 30),而不是几十个小节点。
可能还有许多其他原因,但如果没有细节,我不能说。
https://stackoverflow.com/questions/25902761
复制相似问题