blob: 5da95e61ec6a5b44b9d6357cd7527eb3f1423731 [file] [log] [blame]
<?xml version="1.0" encoding="UTF-8"?>
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
<document xmlns=""
<title>Introduction to Apache Giraph</title>
<section name="Introduction">
<p><b>Apache Giraph</b> is an iterative graph processing framework, built on top of <b>Apache Hadoop</b>.</p>
<p>The input to a Giraph computation is a graph composed of vertices and directed edges, see Figure <a href="#Figure1">1</a>.
For example vertices can represent people, and edges friend requests. Each vertex stores a <i>value</i>, so does each edge.
The input, thus, not only determines the graph topology, but also the initial values of vertices and edges.</p>
<p>As an example, consider a computation that finds the distance from a predetermined <i>source person <b>s</b></i>
to any person in the social graph. In this computation, the value of an <i>edge</i> <b>E</b> is a floating point number
denoting distance between adjacent people. The value of a <i>vertex</i>
<b>V</b> is also a floating point number, representing an upper bound on the distance
along a shortest path from the predetermined vertex s to v. The initial value of the predetermined
source vertex <i>s</i> is 0, and the initial value for any other vertex is infinity.</p>
<table border="0" class="image" align="center" width="60%">
<tr><td><img src="images/ExampleSSSP.svg" /></td></tr>
<tr><td class="caption" id="Figure1">Figure 1: An illustration of an execution of a single source shortest paths algorithm in Giraph. The input is a chain graph with three vertices (black) and two edges (green). The values of edges are 1 and 3 respectively. The algorithm computes distances from the leftmost vertex. The initial values of vertices are 0, &#8734; and &#8734; (top row). Distance upper bounds are sent as messages (blue), resulting in updates to vertex values (successive rows going down).
The execution lasts three supersteps (separated by red lines).
<p>Computation proceeds as a sequence of iterations, called <i>supersteps</i> in <a href="">BSP</a>.
Initially, every vertex is <i>active</i>. In each superstep each active vertex invokes the <i>Compute method</i> provided by the user.
The method implements the graph algorithm that will be executed on the input graph.
Intuitively, you should think like a vertex when designing a Giraph algorithm, it is vertex oriented.
A graph oriented approach is discussded in <a href="">GIRAPH-818</a>.
<p>The Compute method:</p>
<li>receives messages sent to the vertex in the previous superstep,</li>
<li>computes using the messages, and the vertex and outgoing edge values, which may result in modifications to the values, and</li>
<li>may send messages to other vertices.</li>
<p>The Compute method does not have direct access to the values of other vertices and their outgoing edges. Inter-vertex communication occurs by sending messages.</p>
<p>In our single-source shortest paths example, a Compute method will: (1) find the minimum value arriving on any message, (2) if that value is less than the current value of the vertex, then (3) the minimum will be adopted as the vertex value, and (4) the value plus the edge value will be sent along every outgoing edge. See a simplified code in Figure <a href="#Figure2">2</a> and a complete Java implementation <a href="">here</a>.</p>
<table border="0" class="image" align="center" width="70%">
public void compute(Iterable&lt;DoubleWritable&gt; messages) {
double minDist = Double.MAX_VALUE;
for (DoubleWritable message : messages) {
minDist = Math.min(minDist, message.get());
if (minDist &lt; getValue().get()) {
setValue(new DoubleWritable(minDist));
for (Edge&lt;LongWritable, FloatWritable&gt; edge : getEdges()) {
double distance = minDist + edge.getValue().get();
sendMessage(edge.getTargetVertexId(), new DoubleWritable(distance));
<tr><td class="caption" id="Figure2">Figure 2: The Compute method for a single source shortest paths computation. Each vertex in the graph executes this method at each superstep. The method computes a minimum distance arriving on messages and can send distances along each edge.
<p>There is a <i>barrier</i> between consecutive supersteps. By this we mean that: (1) the messages sent in any current superstep get delivered to the destination vertices only in the next superstep, and (2) vertices start computing the next superstep after every vertex has completed computing the current superstep.</p>
<p>The graph can be mutated during computation by adding or removing vertices or edges. Our example shortest paths algorithm does not mutate the graph.</p>
<p>Values are retained across barriers. That is, the value of any vertex or edge at the beginning of a superstep is equal to the corresponding value at the end of the previous superstep, when graph topology is not mutated. For example, when a vertex has set the distance upper bound to D, then at the beginning of the next superstep the distance upper bound will still be equal D. Of course the vertex can modify the value of the vertex and of the outgoing edges during any superstep.</p>
<p>Any vertex can stop computing after any superstep. The vertex simply declares that it does not want to be active anymore. However, any incoming message will make the vertex active again.</p>
<p>The computation halts after the vertices have voted to halt and there are no messages in flight. Each vertex outputs some local information, which usually amounts to the final vertex value.</p>