Hey Reza,
Indeed, the batch and streaming behaviors differ slightly, though they are both
compliant with the Beam model.
Glad you could correct the timer. Let us know how it goes with the Flink Runner.
Thanks,
Max
On 16.12.18 02:52, Reza Ardeshir Rokni wrote:
Hya Max,
Thank you for the reply and I realized I had not given enough background context
on where the timers are set. So a little more color...
1- Apply Fixed Window of X to stream
2- Combiner generates aggregators per key.
3- Apply Global Window to aggregators. ( It is understood , that order of
aggregators is not guaranteed in the Global Window)
4- A 'looping timer' is created when a key is first seen. If keyed-state is null
a timer is set to the next aggregators lower window boundary.
...
There is actually a lot more to the pipeline than just those steps as it deals
with the out of order problem and other subtle fun bits...
However your answer did give me the logic mistake I had made.. In step 4 I need
to actually set the timer to the upper boundary as I want it to only fire after
watermark has moved to the end of my fixed window. In batch mode testing this
was not an issue as I understand it the timers all fire after the @Process has
been completed. But in stream mode my mistake showed up. Fun stuff..
I do need to run all the tests with the Flink runner as well, will report back
on how it goes.. :-)
Cheers
Reza
On Fri, 14 Dec 2018 at 21:15, Maximilian Michels <[email protected]
<mailto:[email protected]>> wrote:
Hi Reza,
You are asking about the order in which @OnTimer and @ProcessElement are
called.
I'm not sure about the Dataflow Runner, but in the Flink Runner there is no
strict order between the two, other than the guarantees that apply to window
processing and readiness of timers.
To be able to set the timer in "lower bound" of the window (the minimum
timestamp), you will have to process an element which registers the timer.
So
you can't guarantee the timer fires beforehand. If you meant the "upper
bound"
(the maximum timestamp), then it can be guaranteed that the timer fires last
because the timer will fire when the watermark is moved to or past the
maximum
timestamp.
Generally, elements will be processed as they arrive in the window. Timers
are
fired when they are ready. It is best not to make assumptions based on when
elements arrive which belong to the same window. However, you can be sure
that
timers fire after they become eligible.
Thanks,
Max
On 14.12.18 10:43, Reza Ardeshir Rokni wrote:
> Hi,
>
> I believe a bug in my timeseries code is because of something I missed in
the
> sequence of OnTimer / ProcessElement when in stream mode.
>
> If a timer has been set at the lower boundary of a window and elements
arrive in
> that windows keyed state, which will fire first? The @OnTimer or
@ProcessElement ?
>
> Cheers
> Reza