Skip to content
This repository was archived by the owner on Oct 30, 2023. It is now read-only.

Commit e2f82b2

Browse files
author
Maja Kabiljo
committed
JIRA-1148
closes #39
1 parent 02e73b9 commit e2f82b2

File tree

2 files changed

+98
-3
lines changed

2 files changed

+98
-3
lines changed

giraph-block-app-8/src/main/java/org/apache/giraph/block_app/library/prepare_graph/UndirectedConnectedComponents.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -352,10 +352,15 @@ Block calculateConnectedComponentSizes(
352352
Pair<LongWritable, LongWritable> componentToReducePair = Pair.of(
353353
new LongWritable(), new LongWritable(1));
354354
LongWritable reusableLong = new LongWritable();
355-
return Pieces.reduceAndBroadcast(
356-
"CalcConnectedComponentSizes",
355+
// This reduce operation is stateless so we can use a single instance
356+
BasicMapReduce<LongWritable, LongWritable, LongWritable> reduceOperation =
357357
new BasicMapReduce<>(
358-
LongTypeOps.INSTANCE, LongTypeOps.INSTANCE, SumReduce.LONG),
358+
LongTypeOps.INSTANCE, LongTypeOps.INSTANCE, SumReduce.LONG);
359+
return Pieces.reduceAndBroadcastWithArrayOfHandles(
360+
"CalcConnectedComponentSizes",
361+
3137, /* Just using some large prime number */
362+
() -> reduceOperation,
363+
vertex -> getComponent.get(vertex).get(),
359364
(Vertex<LongWritable, V, Writable> vertex) -> {
360365
componentToReducePair.getLeft().set(getComponent.get(vertex).get());
361366
return componentToReducePair;

giraph-block-app/src/main/java/org/apache/giraph/block_app/library/Pieces.java

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
*/
1818
package org.apache.giraph.block_app.library;
1919

20+
import java.util.ArrayList;
2021
import java.util.Iterator;
22+
import java.util.List;
2123

2224
import org.apache.giraph.block_app.framework.api.BlockMasterApi;
2325
import org.apache.giraph.block_app.framework.api.BlockWorkerReceiveApi;
@@ -26,13 +28,16 @@
2628
import org.apache.giraph.block_app.framework.piece.Piece;
2729
import org.apache.giraph.block_app.framework.piece.global_comm.ReducerAndBroadcastWrapperHandle;
2830
import org.apache.giraph.block_app.framework.piece.global_comm.ReducerHandle;
31+
import org.apache.giraph.block_app.framework.piece.global_comm.array.BroadcastArrayHandle;
2932
import org.apache.giraph.block_app.framework.piece.interfaces.VertexReceiver;
3033
import org.apache.giraph.block_app.framework.piece.interfaces.VertexSender;
3134
import org.apache.giraph.block_app.library.internal.SendMessagePiece;
3235
import org.apache.giraph.block_app.library.internal.SendMessageWithCombinerPiece;
36+
import org.apache.giraph.block_app.reducers.array.ArrayOfHandles;
3337
import org.apache.giraph.combiner.MessageCombiner;
3438
import org.apache.giraph.function.Consumer;
3539
import org.apache.giraph.function.PairConsumer;
40+
import org.apache.giraph.function.Supplier;
3641
import org.apache.giraph.function.vertex.ConsumerWithVertex;
3742
import org.apache.giraph.function.vertex.SupplierFromVertex;
3843
import org.apache.giraph.graph.Vertex;
@@ -319,6 +324,91 @@ public String toString() {
319324
};
320325
}
321326

327+
/**
328+
* Like reduceAndBroadcast, but uses array of handles for reducers and
329+
* broadcasts, to make it feasible and performant when values are large.
330+
* Each supplied value to reduce will be reduced in the handle defined by
331+
* handleHashSupplier%numHandles
332+
*
333+
* @param <S> Single value type, objects passed on workers
334+
* @param <R> Reduced value type
335+
* @param <I> Vertex id type
336+
* @param <V> Vertex value type
337+
* @param <E> Edge value type
338+
*/
339+
public static
340+
<S, R extends Writable, I extends WritableComparable, V extends Writable,
341+
E extends Writable>
342+
Piece<I, V, E, NoMessage, Object> reduceAndBroadcastWithArrayOfHandles(
343+
final String name,
344+
final int numHandles,
345+
final Supplier<ReduceOperation<S, R>> reduceOp,
346+
final SupplierFromVertex<I, V, E, Long> handleHashSupplier,
347+
final SupplierFromVertex<I, V, E, S> valueSupplier,
348+
final ConsumerWithVertex<I, V, E, R> reducedValueConsumer) {
349+
return new Piece<I, V, E, NoMessage, Object>() {
350+
protected ArrayOfHandles.ArrayOfReducers<S, R> reducers;
351+
protected BroadcastArrayHandle<R> broadcasts;
352+
353+
private int getHandleIndex(Vertex<I, V, E> vertex) {
354+
return (int) Math.abs(handleHashSupplier.get(vertex) % numHandles);
355+
}
356+
357+
@Override
358+
public void registerReducers(
359+
final CreateReducersApi reduceApi, Object executionStage) {
360+
reducers = new ArrayOfHandles.ArrayOfReducers<>(
361+
numHandles,
362+
new Supplier<ReducerHandle<S, R>>() {
363+
@Override
364+
public ReducerHandle<S, R> get() {
365+
return reduceApi.createLocalReducer(reduceOp.get());
366+
}
367+
});
368+
}
369+
370+
@Override
371+
public VertexSender<I, V, E> getVertexSender(
372+
BlockWorkerSendApi<I, V, E, NoMessage> workerApi,
373+
Object executionStage) {
374+
return new InnerVertexSender() {
375+
@Override
376+
public void vertexSend(Vertex<I, V, E> vertex) {
377+
reducers.get(getHandleIndex(vertex)).reduce(
378+
valueSupplier.get(vertex));
379+
}
380+
};
381+
}
382+
383+
@Override
384+
public void masterCompute(BlockMasterApi master, Object executionStage) {
385+
broadcasts = reducers.broadcastValue(master);
386+
}
387+
388+
@Override
389+
public VertexReceiver<I, V, E, NoMessage> getVertexReceiver(
390+
BlockWorkerReceiveApi<I> workerApi, Object executionStage) {
391+
final List<R> values = new ArrayList<>();
392+
for (int i = 0; i < numHandles; i++) {
393+
values.add(broadcasts.get(i).getBroadcast(workerApi));
394+
}
395+
return new InnerVertexReceiver() {
396+
@Override
397+
public void vertexReceive(
398+
Vertex<I, V, E> vertex, Iterable<NoMessage> messages) {
399+
reducedValueConsumer.apply(
400+
vertex, values.get(getHandleIndex(vertex)));
401+
}
402+
};
403+
}
404+
405+
@Override
406+
public String toString() {
407+
return name;
408+
}
409+
};
410+
}
411+
322412
/**
323413
* Creates Piece that for each vertex, sends message provided by
324414
* messageSupplier to all targets provided by targetsSupplier.

0 commit comments

Comments
 (0)