Hi Greg,

Thanks for your attention.

It takes me a little time to read the old PR on FLINK-1885. Though
the VertexCentricIteration, as well as its related classes, has been
refactored, I understand what Markus want to achieve.

I am not sure if using a bulk iteration instead of a delta one could
eliminate the "out of memory" problem.  Except for that, I think the "auto
update" has nothing to do with the bulk mode. Considering the compatible
guarantee, here is my suggestions to improve gelly's iteration API:

1) Add an "autoHalt" flag to the ComputeFunction.

2) If the flag is set true (default), apply the current mechanism .

3) If the flag is set false, call out.collect() to update the vertex value
whether the setNewVertexValue() method is called or not, unless the user
explicitly call a (new added) voteToHalt() method in the ComputeFunction.

By adding these, users can decide when to halt a vertex themselves. What do
you think?

As for the "update edge values during vertex iterations" problem, I think
it needs a redesign for the gelly framework (Maybe merge the vertices and
edges into a single data set? Or just change the iterations'
 implementation? I can't think it clearly now.), so that's it for now.
Besides, I don't think there will be someone who really would love to write
a graph algorithm with Flink native operators and that's why gelly is
designed, isn't it?

Best,
Xingcan

On Fri, Feb 10, 2017 at 10:31 PM, Greg Hogan <c...@greghogan.com> wrote:

> Hi Xingcan,
>
> FLINK-1885 looked into adding a bulk mode to Gelly's iterative models.
>
> As an alternative you could implement your algorithm with Flink operators
> and a bulk iteration. Most of the Gelly library is written with native
> operators.
>
> Greg
>
> On Fri, Feb 10, 2017 at 5:02 AM, Xingcan Cui <xingc...@gmail.com> wrote:
>
>> Hi Vasia,
>>
>> b) As I said, when some vertices finished their work in current phase,
>> they have nothing to do (no value updates, no message received, just like
>> slept) but to wait for other vertices that have not finished (the current
>> phase) yet. After that in the next phase, all the vertices should go back
>> to work again and if there are some vertices become inactive in last phase,
>> it could be hard to reactive them again by message since we even don't know
>> which vertices to send to. The only solution is to keep all vertices
>> active, whether by updating vertices values in each super step or sending
>> heartbeat messages to vertices themselves (which will bring a lot of extra
>> work to the MessageCombiner).
>>
>> c) I know it's not elegant or even an awful idea to store the edge info
>> into vertex values. However, we can not change edge values or maintain
>> states (even a pick or unpick mark) in edges during a vertex-centric
>> iteration. Then what can we do if an algorithm really need that?
>>
>> Thanks for your patience.
>>
>> Best,
>> Xingcan
>>
>> On Fri, Feb 10, 2017 at 4:50 PM, Vasiliki Kalavri <
>> vasilikikala...@gmail.com> wrote:
>>
>>> Hi Xingcan,
>>>
>>> On 9 February 2017 at 18:16, Xingcan Cui <xingc...@gmail.com> wrote:
>>>
>>>> Hi Vasia,
>>>>
>>>> thanks for your reply. It helped a lot and I got some new ideas.
>>>>
>>>> a) As you said, I did use the getPreviousIterationAggregate() method
>>>> in preSuperstep() of the next superstep.
>>>> However, if the (only?) global (aggregate) results can not be guaranteed
>>>> to be consistency,  what should we
>>>> do with the postSuperstep() method?
>>>>
>>>
>>> ​The postSuperstep() method is analogous to the close() method in a
>>> RichFunction, which is typically used for cleanup.​
>>>
>>>
>>>
>>>>
>>>> b) Though we can active vertices by update method or messages, IMO, it
>>>> may be more proper for users
>>>> themselves to decide when to halt a vertex's iteration. Considering a
>>>> complex algorithm that contains different
>>>> phases inside a vertex-centric iteration. Before moving to the next
>>>> phase (that should be synchronized),
>>>> there may be some vertices that already finished their work in current
>>>> phase and they just wait for others.
>>>> Users may choose the finished vertices to idle until the next phase,
>>>> but rather than to halt them.
>>>> Can we consider adding the voteToHalt() method and some internal
>>>> variables to the Vertex/Edge class
>>>> (or just create an "advanced" version of them) to make the halting
>>>> more controllable?
>>>>
>>>
>>>
>>> ​I suppose adding a voteToHalt() method is possible, but I'm not sure I
>>> see how that would make halting more controllable. If a vertex hasn't
>>> changed value or hasn't received a message, it has no work to do in the
>>> next iteration, so why keep it active? If in a later superstep, a
>>> previously inactive vertex receives a message, it will become active again.
>>> ​Is this what you're looking for or am I missing something?
>>>
>>>
>>>
>>>>
>>>> c) Sorry that I didn't make it clear before. Here the initialization
>>>> means a "global" one that executes once
>>>> before the iteration. For example, users may want to initialize the
>>>> vertices' values by their adjacent edges
>>>> before the iteration starts. Maybe we can add an extra coGroupFunction
>>>> to the configuration parameters
>>>> and apply it before the iteration?
>>>>
>>>
>>>
>>> ​You can initialize the graph by using any Gelly transformation methods
>>> before starting the iteration, e.g. mapVertices, mapEdges, reduceOnEdges,
>>> etc.
>>> Btw, a vertex can iterate over its edges inside the ComputeFunction
>>> using the getEdges() method. Initializing the vertex values with
>>> neighboring edges might not be a good idea if you have vertices with high
>>> degrees.​
>>>
>>>
>>> ​Cheers,
>>> -Vasia.​
>>>
>>>
>>>
>>>>
>>>> What do you think?
>>>>
>>>> (BTW, I started a PR on FLINK-1526(MST Lib&Example). Considering the
>>>> complexity, the example is not
>>>> provided.)
>>>>
>>>> Really appreciate for all your help.
>>>>
>>>> Best,
>>>> Xingcan
>>>>
>>>> On Thu, Feb 9, 2017 at 5:36 PM, Vasiliki Kalavri <
>>>> vasilikikala...@gmail.com> wrote:
>>>>
>>>>> Hi Xingcan,
>>>>>
>>>>> On 7 February 2017 at 10:10, Xingcan Cui <xingc...@gmail.com> wrote:
>>>>>
>>>>>> Hi all,
>>>>>>
>>>>>> I got some question about the vertex-centric iteration in Gelly.
>>>>>>
>>>>>> a)  It seems the postSuperstep method is called before the superstep
>>>>>> barrier (I got different aggregate values of the same superstep in this
>>>>>> method). Is this a bug? Or the design is just like that?
>>>>>>
>>>>>
>>>>> ​The postSuperstep() method is called inside the close() method of a
>>>>> RichCoGroupFunction that wraps the ComputeFunction. The close()
>>>>> method It is called after the last call to the coGroup() after each
>>>>> iteration superstep.
>>>>> The aggregate values are not guaranteed to be consistent during the
>>>>> same superstep when they are computed. To retrieve an aggregate value for
>>>>> superstep i, you should use the getPreviousIterationAggregate()
>>>>> method in superstep i+1.
>>>>>
>>>>>
>>>>>>
>>>>>> b) There is not setHalt method for vertices. When no message
>>>>>> received, a vertex just quit the next iteration. Should I manually send
>>>>>> messages (like heartbeat) to keep the vertices active?
>>>>>>
>>>>>
>>>>> ​That's because vertex halting is implicitly controlled by the
>>>>> underlying delta iterations of Flink. ​A vertex will remain active as long
>>>>> as it receives a message or it updates its value, otherwise it will become
>>>>> inactive. The documentation on Gelly iterations [1] and DataSet iterations
>>>>> [2] might be helpful.
>>>>>
>>>>>
>>>>>
>>>>>>
>>>>>> c) I think we may need an initialization method in the
>>>>>> ComputeFunction.
>>>>>>
>>>>>
>>>>>
>>>>> ​There exists a preSuperstep() method for initialization. This one
>>>>> will be executed once per superstep before the compute function is invoked
>>>>> for every vertex. Would this work for you?
>>>>>
>>>>>
>>>>>
>>>>>>
>>>>>> Any opinions? Thanks.
>>>>>>
>>>>>> Best,
>>>>>> Xingcan
>>>>>>
>>>>>>
>>>>>>
>>>>> ​I hope this helps,
>>>>> -Vasia.​
>>>>>
>>>>>
>>>>> ​[1]: https://ci.apache.org/projects/flink/flink-docs-release-1.2/
>>>>> dev/libs/gelly/iterative_graph_processing.html#vertex-centri
>>>>> c-iterations
>>>>> [2]: https://ci.apache.org/projects/flink/flink-docs-release-1.2/
>>>>> dev/batch/iterations.html​
>>>>>
>>>>>
>>>>
>>>
>>
>

Reply via email to