为什么开发DiskBackedPartition?
默认的Partition的实现是SimplePartition,它用一个ConcurrentMap<I, Vertex<I, V, E>> vertexMap;
存储本partition的vertex id和vertex的映射信息,所有的信息都在内存里。当数据量大时,会出现OOM。
DiskBackedPartition
是一种大数据量的实现。主要目的是借助本地文件系统,如果本Partition的数据较多,则序列化到磁盘。序列化之后则释放内存,为接收其他数据做准备。
DiskBackedPartition的数据接收接口
DiskBackedPartition
也用Map<I, Vertex<I, V, E>> vertexMap;
存储数据。
- vertexMap数据合并
有新的数据到达时,会依次判断到达的顶点,判断vertexMap是否已经有此顶点,如果有,则合并value和edges。如果没有则,把此vertex放到vertexMap。 - 按边判断
为了防止超级顶点造成内存溢出问题,不按顶点的数量进行判断是否数据量过多,而是按vertexMap
中所有vertex的边的数量判断。超过设定的阈值时,把 - 按vertex id的顺序序列化
但是当vertexMap
数据量过多时,把整个vertexMap
按vertex id有序的方式,存储到本地的文件中。然后对vertexMap
进行重新初始化,用于接新的数据。 - 每个Vertex存储的信息
vertex id;//顶点的id
value; // 顶点的值
outedges; //边的信息
halt; //是否停止的标志
- 文件合并
数据加载完之后,会存在几个序列化的文件。这几个文件的内部都是按vertex id有序。并且一个顶点的信息可能被序列化到几个文件中。需要对数据进行合并。合并时,需要对vertex id相同的顶点进行合并成一个顶点。并且合并之后的顶点按vertex id有序。
迭代计算的输入数据,输出数据
合并之后,作为superstep0的输入,superstep0的对每个vertex的输出,保存在一个输出文件里。superstep0结束之后,关闭输出文件。superstep1开始计算时,superstep0的输出文件作为superstep1的输入。以此类推。
顶点和边的分离
如果顶点加载之后,顶点的边的信息不变,则可以不用每次都把边的信息重复的存储一遍。增加EDGES_IMMUTABLE变量,当EDGES_IMMUTABLE为true时,则把边信息存储在单独的文件中,则每轮计算都从边文件读取,运算时,不需要保存边的信息。如果边的值每轮计算可能变化,则边信息还是不能作为不变的文件为各超级步使用。但是可以考虑像顶点文件一样,每一轮superstep的运算都有单独的边的输入输出文件。