Hey,

Wow, Vasia, a GC limit error in the Optimizer (pre-flight), not the runtime.
>
> That is cannot have been easy to produce ;-) The program does not really
> look that tricky, I need to take some closer look at this...
>

​It was pretty easy actually :P
The program is really simple: in each iteration, compute the vertex
degrees, filter out the ones that have degree less than K and emit the
resulting graph.


>
> BTW: Before this algorithm runs well, we really need pinning intermediate
> results in memory. Otherwise each step of the loop will execute its entire
> history every time again.


​Can you elaborate a bit on this? Is there some ongoing work on pinning
intermediate results in memory?
And can I maybe help somehow? :-)​


> A way to mitigate this for now is to manually
> break persist and re-read the intermediate graph.


​I wouldn't want to mitigate this issue in a hacky way, but rather have a
nice and clean solution to allow writing such iterative programs, where a
graph is transformed inside an iteration using Gelly methods and then fed
as input to the​ next iteration.


> The ML library does that
> in some points to break programs into shorter, more feasible portions.
>

​Could you point me to an example where this is ​happening?


>
> Also: Do you cache the vertex count in the graph? May be worth doing,
> otherwise all counts are computed twice (for current graph and for the
> previous graph)
>
>
​That's a valid point, I can cache the previous count. But even without
computing the degrees and just running the loop for a f​ixed number of
iterations results in the same error :/



> Stephan
>
>
​Thanks a lot!

-V.​



>
> On Mon, Mar 30, 2015 at 10:33 PM, Vasiliki Kalavri <
> vasilikikala...@gmail.com> wrote:
>
> > 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