Hi,

I'm back looking into this and I tried out the for-loop approach that was
suggested above.

I implemented a simple algorithm, k-core, which computes the k-core of a
graph by iteratively filtering out vertices with degree less than k.
You can find the code in [1].

Unfortunately, this is giving me the following error, with an example graph
of 10 vertices:

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit
exceeded
at
org.apache.flink.optimizer.plan.PlanNode.mergeBranchPlanMaps(PlanNode.java:106)
at
org.apache.flink.optimizer.plan.PlanNode.mergeBranchPlanMaps(PlanNode.java:99)
at
org.apache.flink.optimizer.plan.DualInputPlanNode.<init>(DualInputPlanNode.java:90)
at
org.apache.flink.optimizer.plan.DualInputPlanNode.<init>(DualInputPlanNode.java:69)
at
org.apache.flink.optimizer.operators.HashJoinBuildSecondProperties.instantiate(HashJoinBuildSecondProperties.java:81)
at
org.apache.flink.optimizer.dag.TwoInputNode.instantiate(TwoInputNode.java:607)
at
org.apache.flink.optimizer.dag.TwoInputNode.addLocalCandidates(TwoInputNode.java:557)
at
org.apache.flink.optimizer.dag.TwoInputNode.getAlternativePlans(TwoInputNode.java:478)
at
org.apache.flink.optimizer.dag.TwoInputNode.getAlternativePlans(TwoInputNode.java:309)
at
org.apache.flink.optimizer.dag.TwoInputNode.getAlternativePlans(TwoInputNode.java:309)
at
org.apache.flink.optimizer.dag.SingleInputNode.getAlternativePlans(SingleInputNode.java:249)
at
org.apache.flink.optimizer.dag.SingleInputNode.getAlternativePlans(SingleInputNode.java:249)
at
org.apache.flink.optimizer.dag.DataSinkNode.getAlternativePlans(DataSinkNode.java:204)
at org.apache.flink.optimizer.Optimizer.compile(Optimizer.java:501)
at org.apache.flink.optimizer.Optimizer.compile(Optimizer.java:403)
at org.apache.flink.client.LocalExecutor.executePlan(LocalExecutor.java:162)
at
org.apache.flink.api.java.LocalEnvironment.execute(LocalEnvironment.java:51)
at
org.apache.flink.api.java.ExecutionEnvironment.execute(ExecutionEnvironment.java:797)
at org.apache.flink.api.java.DataSet.count(DataSet.java:397)
at org.apache.flink.graph.Graph.numberOfVertices(Graph.java:913)
at org.apache.flink.graph.example.KCoreExample.main(KCoreExample.java:91)

Basically, the first 3 iterations are executed normally, then the 4th gets
stuck and eventually the program fails with the above error message.
Any help / suggestion would be greatly appreciated ^^

Cheers,
-Vasia.

[1]:
https://github.com/vasia/flink/commit/62b065b69746e25b74bee84d210d5c5b4ee761bd

On 23 February 2015 at 18:05, Vasiliki Kalavri <vasilikikala...@gmail.com>
wrote:

> I see, thanks a lot for the answers!
> To rephrase my original question, would it make sense to define a
> closed-loop iteration where the state is the whole graph?
>
> If you want to take a look at the current implementation of DMST using
> delta iteration, Andra has made a PR [1].
> On a high-level, this algorithm does (more or less) the following:
>
> while there are more than one vertices in the graph
>    for every vertex
>       select the min-weight edge
>       add all selected edges to the MST
>    collapse vertices with the same root into one vertex (iterative
> connected components-like step)
>
> What we are thinking is that we could express this with -maybe- a
> bulk-like iteration on the Graph, inside which we can use Gelly methods.
> Would it make sense or shall we go for a for-loop implementation instead?
>
> Thanks!
> -V.
>
> [1]: http://github.com/apache/flink/pull/434
>
> On 23 February 2015 at 16:18, Stephan Ewen <se...@apache.org> wrote:
>
>> Closed-loop iterations are much more efficient right now. Long for loops
>> suffer from memory fragmentation (an issue that is in the list to fix).
>>
>> Also, closed loops can be stateful (delta iterations) and do not require
>> task re-deployment.
>>
>> On Mon, Feb 23, 2015 at 4:15 PM, Vasiliki Kalavri <
>> vasilikikala...@gmail.com
>> > wrote:
>>
>> > I see that's cool :-)
>> > So, what is the advantage of closed-loop versus for-loop iterations?
>> > Custom convergence criteria / aggregators and more efficient execution
>> > plans?
>> >
>> > On 23 February 2015 at 15:01, Stephan Ewen <se...@apache.org> wrote:
>> >
>> > > For loops are basically rolled out - they yield long execution plans.
>> > >
>> > > On Mon, Feb 23, 2015 at 2:44 PM, Vasiliki Kalavri <
>> > > vasilikikala...@gmail.com
>> > > > wrote:
>> > >
>> > > > for-loop iterations could cover some cases, I guess, when the
>> number of
>> > > > iterations is known beforehand.
>> > > > Are there currently any restrictions on what can be used inside a
>> > > for-loop?
>> > > > How are they translated into execution plans?
>> > > >
>> > > > On 23 February 2015 at 13:08, Stephan Ewen <se...@apache.org>
>> wrote:
>> > > >
>> > > > > Some things may not work well as "closed-loop" iterations.
>> > > > >
>> > > > > Is it possible to express those as for-loop iterations?
>> > > > >
>> > > > > On Mon, Feb 23, 2015 at 1:03 PM, Vasiliki Kalavri <
>> > > > > vasilikikala...@gmail.com
>> > > > > > wrote:
>> > > > >
>> > > > > > Hi Stephan,
>> > > > > >
>> > > > > > yes, this would work for the cases where an algorithm only
>> updates
>> > > the
>> > > > > > vertex values or only updates the edge values.
>> > > > > >
>> > > > > > What we would like to also support is
>> > > > > > (a) algorithms where both vertices and edges are updated in one
>> > > > iteration
>> > > > > > (b) algorithms where the graph structure changes from one
>> iteration
>> > > to
>> > > > > the
>> > > > > > next and
>> > > > > > (c) branching inside an iteration, i.e. executing a different
>> > > > "iteration
>> > > > > > body" based on some condition.
>> > > > > >
>> > > > > > We can still currently implement those with regular Flink
>> iteration
>> > > > > > operators, but the resulting code is not that nice or efficient.
>> > > > > > For example, if we want to update both edges and vertex values,
>> we
>> > > can
>> > > > > > still create a solution set where the vertex values are
>> attached to
>> > > > each
>> > > > > > edge.
>> > > > > > Regarding branching inside an iteration, we can use an
>> aggregator
>> > > that
>> > > > > > tracks the iteration phase, but then we need to somehow make the
>> > > > > different
>> > > > > > phases to consist of the same operators and also check the
>> > branching
>> > > > > > condition inside each UDF.
>> > > > > >
>> > > > > > Cheers,
>> > > > > > V.
>> > > > > >
>> > > > > >
>> > > > > > On 23 February 2015 at 11:05, Stephan Ewen <se...@apache.org>
>> > wrote:
>> > > > > >
>> > > > > > > As a workaround, it should always work to get the Edge and
>> Vertex
>> > > > data
>> > > > > > set
>> > > > > > > from the graph and use the regular Fink iteration operators?
>> > > > > > >
>> > > > > > >
>> > > > > > > On Sun, Feb 22, 2015 at 4:53 PM, Vasiliki Kalavri <
>> > > > > > > vasilikikala...@gmail.com
>> > > > > > > > wrote:
>> > > > > > >
>> > > > > > > > Hi,
>> > > > > > > >
>> > > > > > > > yes, I was referring to the parallel Boruvka algorithm.
>> There
>> > are
>> > > > > > several
>> > > > > > > > ways to implement this one in Flink and I believe that the
>> one
>> > > > > > described
>> > > > > > > in
>> > > > > > > > the paper (vertex-centric) is not the most elegant one :)
>> > > > > > > >
>> > > > > > > > Andra is now working on an idea that uses the delta
>> iteration
>> > > > > > abstraction
>> > > > > > > > and we believe that it will be both more efficient and
>> easier
>> > to
>> > > > > > > > understand. It has the edges in the solution set and the
>> > vertices
>> > > > in
>> > > > > > the
>> > > > > > > > workset, so it follows the pattern I describe in (2) in my
>> > > previous
>> > > > > > > e-mail.
>> > > > > > > > As a next step, we would like to see how having an iteration
>> > > > operator
>> > > > > > > that
>> > > > > > > > could update the whole graph -what I describe as (3)- would
>> > make
>> > > > this
>> > > > > > > even
>> > > > > > > > nicer.
>> > > > > > > >
>> > > > > > > > Any ideas are highly welcome!
>> > > > > > > >
>> > > > > > > > Cheers,
>> > > > > > > > V.
>> > > > > > > >
>> > > > > > > > On 22 February 2015 at 16:32, Andra Lungu <
>> > lungu.an...@gmail.com
>> > > >
>> > > > > > wrote:
>> > > > > > > >
>> > > > > > > > > Hi Alex,
>> > > > > > > > >
>> > > > > > > > > Vasia is talking about the second version(presented
>> Friday)
>> > of
>> > > > > > Parallel
>> > > > > > > > > Boruvka, which can be found here:
>> > > > > > > > > https://github.com/TU-Berlin-DIMA/IMPRO-3.WS14/pull/59
>> > > > > > > > >
>> > > > > > > > > I will propose the third, non-Pregel like approach
>> directly
>> > to
>> > > > > Gelly
>> > > > > > > > soon.
>> > > > > > > > >
>> > > > > > > > > If you have additional questions, I will be happy to
>> answer
>> > > them.
>> > > > > > > > >
>> > > > > > > > > Andra
>> > > > > > > > >
>> > > > > > > > > On Sun, Feb 22, 2015 at 4:23 PM, Alexander Alexandrov <
>> > > > > > > > > alexander.s.alexand...@gmail.com> wrote:
>> > > > > > > > >
>> > > > > > > > > > Hi Vasia,
>> > > > > > > > > >
>> > > > > > > > > > I am trying to look at the problem in more detail. Which
>> > > > version
>> > > > > of
>> > > > > > > the
>> > > > > > > > > MST
>> > > > > > > > > > are you talking about?
>> > > > > > > > > >
>> > > > > > > > > > Right now in the Gelly repository I can only find the
>> SSSP
>> > > > > example
>> > > > > > > > > > (parallel Bellman-Ford) from Section 4.2 in [1].
>> > > > > > > > > >
>> > > > > > > > > > However, it seems that the issues encountered by Andra
>> are
>> > > > > related
>> > > > > > to
>> > > > > > > > the
>> > > > > > > > > > implementation of Parallel Boruvka (Section 3.2 in
>> [2]). Is
>> > > > that
>> > > > > > > > correct?
>> > > > > > > > > >
>> > > > > > > > > > Regards,
>> > > > > > > > > > A.
>> > > > > > > > > >
>> > > > > > > > > > [1] http://www.vldb.org/pvldb/vol7/p1047-han.pdf
>> > > > > > > > > > [2] http://www.vldb.org/pvldb/vol7/p577-salihoglu.pdf
>> > > > > > > > > >
>> > > > > > > > > > 2015-02-19 21:03 GMT+01:00 Vasiliki Kalavri <
>> > > > > > > vasilikikala...@gmail.com
>> > > > > > > > >:
>> > > > > > > > > >
>> > > > > > > > > > > Hello beautiful Flink people,
>> > > > > > > > > > >
>> > > > > > > > > > > during the past few days, Andra and I have been
>> > discussing
>> > > > > about
>> > > > > > > how
>> > > > > > > > to
>> > > > > > > > > > > extend Gelly's iteration methods.
>> > > > > > > > > > >
>> > > > > > > > > > > Alexander's course (and his awesome students) has
>> made it
>> > > > > obvious
>> > > > > > > > that
>> > > > > > > > > > > vertex-centric iterations are not the best fit for
>> > > algorithms
>> > > > > > which
>> > > > > > > > > don't
>> > > > > > > > > > > follow the common "propagate-update" pattern. For
>> > example,
>> > > > > Andra
>> > > > > > is
>> > > > > > > > > > working
>> > > > > > > > > > > on an implementation of Minimum Spanning Tree, which
>> > > requires
>> > > > > > > > branching
>> > > > > > > > > > > inside an iteration and also requires a convergence
>> check
>> > > of
>> > > > an
>> > > > > > > > > internal
>> > > > > > > > > > > iteration. Others also reported similar issues [1, 2].
>> > > Trying
>> > > > > to
>> > > > > > > fit
>> > > > > > > > > such
>> > > > > > > > > > > algorithms to the vertex-centric model leads to long
>> and
>> > > ugly
>> > > > > > code,
>> > > > > > > > > e.g.
>> > > > > > > > > > > aggregators to keep track of algorithm phases,
>> > duplicating
>> > > > > data,
>> > > > > > > etc.
>> > > > > > > > > > >
>> > > > > > > > > > > One limitation of the vertex-centric and the upcoming
>> GAS
>> > > > model
>> > > > > > is
>> > > > > > > > that
>> > > > > > > > > > > they both only allow the vertex values to be updated
>> in
>> > > each
>> > > > > > > > iteration.
>> > > > > > > > > > > However, for some algorithms we need to update the
>> edge
>> > > > values
>> > > > > > and
>> > > > > > > in
>> > > > > > > > > > > others we need to update both. In even more complex
>> > > > situations
>> > > > > > > (like
>> > > > > > > > > > > Andra's MST) in some iterations we need to update the
>> > > vertex
>> > > > > > values
>> > > > > > > > and
>> > > > > > > > > > in
>> > > > > > > > > > > some iterations we need to update the edge values.
>> > > > > > > > > > > Another problem is that we currently don't have a way
>> to
>> > > > allow
>> > > > > > > > > different
>> > > > > > > > > > > computational phases inside an iteration. This is
>> > something
>> > > > > that
>> > > > > > > > Giraph
>> > > > > > > > > > > solves with master compute, a function that is
>> executed
>> > > once
>> > > > > > before
>> > > > > > > > > each
>> > > > > > > > > > > superstep and sets the computation function.
>> > > > > > > > > > >
>> > > > > > > > > > > All that said, I believe that we can solve most of
>> these
>> > > > issues
>> > > > > > if
>> > > > > > > we
>> > > > > > > > > > > nicely expose Flink's iteration operators in Gelly. I
>> can
>> > > see
>> > > > > the
>> > > > > > > > > > following
>> > > > > > > > > > > cases:
>> > > > > > > > > > >
>> > > > > > > > > > > 1. Bulk & delta iterations where the solution set is
>> the
>> > > > vertex
>> > > > > > > > > dataset:
>> > > > > > > > > > > this will be similar to vertex-centric and GAS, but
>> will
>> > > > allow
>> > > > > > more
>> > > > > > > > > > > flexible dataflows inside the iteration.
>> > > > > > > > > > > 2. Bulk & delta iterations where the solution set is
>> the
>> > > edge
>> > > > > > > > dataset:
>> > > > > > > > > > for
>> > > > > > > > > > > the cases where we need to update edge values.
>> > > > > > > > > > > 3. Bulk & delta iterations where the solution set is
>> the
>> > > > Graph:
>> > > > > > > this
>> > > > > > > > > will
>> > > > > > > > > > > cover more complex cases, where the algorithm updates
>> > both
>> > > > > > vertices
>> > > > > > > > and
>> > > > > > > > > > > edges or even adds/removes vertices/edges, i.e.
>> updates
>> > the
>> > > > > whole
>> > > > > > > > > Graph.
>> > > > > > > > > > >
>> > > > > > > > > > > What do you think? I can see 1 & 2 being very easy to
>> > > > > implement,
>> > > > > > > but
>> > > > > > > > I
>> > > > > > > > > > > suspect 3 won't be that easy (but so awesome to have
>> ^^).
>> > > > > > > > > > > Would it work the way a Graph is represented now, i.e.
>> > > with 2
>> > > > > > > > DataSets?
>> > > > > > > > > > >
>> > > > > > > > > > > Any comment, idea, pointer would be much appreciated!
>> > Thank
>> > > > you
>> > > > > > ^^
>> > > > > > > > > > >
>> > > > > > > > > > > Cheers,
>> > > > > > > > > > > -V.
>> > > > > > > > > > >
>> > > > > > > > > > > [1]:
>> > > > > > > > > > >
>> > > > > > > > > > >
>> > > > > > > > > >
>> > > > > > > > >
>> > > > > > > >
>> > > > > > >
>> > > > > >
>> > > > >
>> > > >
>> > >
>> >
>> http://apache-flink-incubator-user-mailing-list-archive.2336050.n4.nabble.com/Can-a-master-class-control-the-superstep-in-Flink-Spargel-td733.html
>> > > > > > > > > > > [2]:
>> > > > > > > > > > >
>> > > > > > > > > > >
>> > > > > > > > > >
>> > > > > > > > >
>> > > > > > > >
>> > > > > > >
>> > > > > >
>> > > > >
>> > > >
>> > >
>> >
>> http://issues.apache.org/jira/browse/FLINK-1552?focusedCommentId=14325769&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-14325769
>> > > > > > > > > > >
>> > > > > > > > > >
>> > > > > > > > >
>> > > > > > > >
>> > > > > > >
>> > > > > >
>> > > > >
>> > > >
>> > >
>> >
>>
>
>

Reply via email to