This makes sense to me, yes!

> On 2. Oct 2019, at 20:35, Zili Chen <wander4...@gmail.com> wrote:
> 
> Hi all,
> 
> Narrow the scope to FLIP-74 we aimed at introduce a useful and extensible
> user-facing public interface JobClient. Let me reemphasize two major works
> under this thread.
> 
> 1. standard interface
> 
> As in FLIP-74 we introduce an interface JobClient with its methods, we'd
> like to
> make it a standard (non-final since we can always extends on demand)
> interface.
> 
> On this branch I'd like to, with respect to Konstantin's suggestion, 1)
> exclude deprecated
> cancelWithSavepoint from the proposal 2) rename stopWithSavepoint to stop
> to keep
> consistency with our CLI command. If there is no more concern on these
> topics I will
> update proposal tomorrow.
> 
> 2. client interfaces are asynchronous
> 
> If the asynchronous JobClient interfaces approved, a necessary proposed
> changed is
> corresponding update ClusterClient interfaces. Still ClusterClient is an
> internal concept
> after this FLIP but it might have some impact so I think it's better to
> reach a community
> consensus as prerequisite. Note that with all client methods are
> asynchronous, no matter
> whether or not we remove client side detach option it is no power.
> 
> Let me know your ideas on these topic and keep moving forward :-)
> 
> Best,
> tison.
> 
> 
> Zili Chen <wander4...@gmail.com> 于2019年10月2日周三 下午4:10写道:
> 
>> Hi Konstantin,
>> 
>> * should we add "cancelWithSavepeoint" to a new public API, when we have
>> deprecated the corresponding REST API/CLI methods? In my understanding
>> there is no reason to use it anymore.
>> 
>> Good point. We can exclude "cancelWithSavepoint" from public API at least
>> for now,
>> since it is deprecated already. Let's see if there is other concerns.
>> 
>> * should we call "stopWithSavepoint" simply "stop" as "stop" always
>> performs a savepoint?
>> 
>> Well for naming issue I'm fine with that if it is a consensus of our
>> community. I can see
>> there is a "stop" CLI command which means "stop with savepoint".
>> 
>> Best,
>> tison.
>> 
>> 
>> Konstantin Knauf <konstan...@ververica.com> 于2019年9月30日周一 下午12:16写道:
>> 
>>> Hi Thomas,
>>> 
>>> maybe there is a misunderstanding. There is no plan to deprecate anything
>>> in the REST API in the process of introducing the JobClient API, and it
>>> shouldn't.
>>> 
>>> Since "cancel with savepoint" was already deprecated in the REST API and
>>> CLI, I am just raising the question whether to add it to the JobClient API
>>> in the first place.
>>> 
>>> Best,
>>> 
>>> Konstantin
>>> 
>>> 
>>> 
>>> On Mon, Sep 30, 2019 at 1:16 AM Thomas Weise <t...@apache.org> wrote:
>>> 
>>>> I did not realize there was a plan to deprecate anything in the REST
>>> API?
>>>> 
>>>> The REST API is super important for tooling written in non JVM
>>> languages,
>>>> that does not include a Flink client (like FlinkK8sOperator). The REST
>>> API
>>>> should continue to support all job management operations, including job
>>>> submission.
>>>> 
>>>> Thomas
>>>> 
>>>> 
>>>> On Sun, Sep 29, 2019 at 1:37 PM Konstantin Knauf <
>>> konstan...@ververica.com
>>>>> 
>>>> wrote:
>>>> 
>>>>> Hi Zili,
>>>>> 
>>>>> thanks for working on this topic. Just read through the FLIP and I
>>> have
>>>> two
>>>>> questions:
>>>>> 
>>>>> * should we add "cancelWithSavepeoint" to a new public API, when we
>>> have
>>>>> deprecated the corresponding REST API/CLI methods? In my understanding
>>>>> there is no reason to use it anymore.
>>>>> * should we call "stopWithSavepoint" simply "stop" as "stop" always
>>>>> performs a savepoint?
>>>>> 
>>>>> Best,
>>>>> 
>>>>> Konstantin
>>>>> 
>>>>> 
>>>>> 
>>>>> On Fri, Sep 27, 2019 at 10:48 AM Aljoscha Krettek <
>>> aljos...@apache.org>
>>>>> wrote:
>>>>> 
>>>>>> Hi Flavio,
>>>>>> 
>>>>>> I agree that this would be good to have. But I also think that this
>>> is
>>>>>> outside the scope of FLIP-74, I think it is an orthogonal feature.
>>>>>> 
>>>>>> Best,
>>>>>> Aljoscha
>>>>>> 
>>>>>>> On 27. Sep 2019, at 10:31, Flavio Pompermaier <
>>> pomperma...@okkam.it>
>>>>>> wrote:
>>>>>>> 
>>>>>>> Hi all,
>>>>>>> just a remark about the Flink REST APIs (and its client as well):
>>>>> almost
>>>>>>> all the times we need a way to dynamically know which jobs are
>>>>> contained
>>>>>> in
>>>>>>> a jar file, and this could be exposed by the REST endpoint under
>>>>>>> /jars/:jarid/entry-points (a simple way to implement this would
>>> be to
>>>>>> check
>>>>>>> the value of Main-class or Main-classes inside the Manifest of the
>>>> jar
>>>>> if
>>>>>>> they exists [1]).
>>>>>>> 
>>>>>>> I understand that this is something that is not strictly required
>>> to
>>>>>>> execute Flink jobs but IMHO it would ease A LOT the work of UI
>>>>> developers
>>>>>>> that could have a way to show the users all available jobs inside
>>> a
>>>>> jar +
>>>>>>> their configurable parameters.
>>>>>>> For example, right now in the WebUI, you can upload a jar and then
>>>> you
>>>>>> have
>>>>>>> to set (without any autocomplete or UI support) the main class and
>>>>> their
>>>>>>> params (for example using a string like --param1 xx --param2 yy).
>>>>>>> Adding this functionality to the REST API and the respective
>>> client
>>>>> would
>>>>>>> enable the WebUI (and all UIs interacting with a Flink cluster) to
>>>>>> prefill
>>>>>>> a dropdown list containing the list of entry-point classes (i.e.
>>>> Flink
>>>>>>> jobs) and, once selected, their required (typed) parameters.
>>>>>>> 
>>>>>>> Best,
>>>>>>> Flavio
>>>>>>> 
>>>>>>> [1] https://issues.apache.org/jira/browse/FLINK-10864
>>>>>>> 
>>>>>>> On Fri, Sep 27, 2019 at 9:16 AM Zili Chen <wander4...@gmail.com>
>>>>> wrote:
>>>>>>> 
>>>>>>>> modify
>>>>>>>> 
>>>>>>>> /we just shutdown the cluster on the exit of client that running
>>>>> inside
>>>>>>>> cluster/
>>>>>>>> 
>>>>>>>> to
>>>>>>>> 
>>>>>>>> we just shutdown the cluster on both the exit of client that
>>> running
>>>>>> inside
>>>>>>>> cluster and the finish of job.
>>>>>>>> Since client is running inside cluster we can easily wait for the
>>>> end
>>>>> of
>>>>>>>> two both in ClusterEntrypoint.
>>>>>>>> 
>>>>>>>> 
>>>>>>>> Zili Chen <wander4...@gmail.com> 于2019年9月27日周五 下午3:13写道:
>>>>>>>> 
>>>>>>>>> About JobCluster
>>>>>>>>> 
>>>>>>>>> Actually I am not quite sure what we gains from DETACHED
>>>>> configuration
>>>>>> on
>>>>>>>>> cluster side.
>>>>>>>>> We don't have a NON-DETACHED JobCluster in fact in our codebase,
>>>>> right?
>>>>>>>>> 
>>>>>>>>> It comes to me one major questions we have to answer first.
>>>>>>>>> 
>>>>>>>>> *What JobCluster conceptually is exactly*
>>>>>>>>> 
>>>>>>>>> Related discussion can be found in JIRA[1] and mailing list[2].
>>>>> Stephan
>>>>>>>>> gives a nice
>>>>>>>>> description of JobCluster:
>>>>>>>>> 
>>>>>>>>> Two things to add: - The job mode is very nice in the way that
>>> it
>>>>> runs
>>>>>>>> the
>>>>>>>>> client inside the cluster (in the same image/process that is the
>>>> JM)
>>>>>> and
>>>>>>>>> thus unifies both applications and what the Spark world calls
>>> the
>>>>>> "driver
>>>>>>>>> mode". - Another thing I would add is that during the FLIP-6
>>>> design,
>>>>> we
>>>>>>>>> were thinking about setups where Dispatcher and JobManager are
>>>>> separate
>>>>>>>>> processes. A Yarn or Mesos Dispatcher of a session could run
>>>>>>>> independently
>>>>>>>>> (even as privileged processes executing no code). Then you the
>>>>>> "per-job"
>>>>>>>>> mode could still be helpful: when a job is submitted to the
>>>>> dispatcher,
>>>>>>>> it
>>>>>>>>> launches the JM again in a per-job mode, so that JM and TM
>>>> processes
>>>>>> are
>>>>>>>>> bound to teh job only. For higher security setups, it is
>>> important
>>>>> that
>>>>>>>>> processes are not reused across jobs.
>>>>>>>>> 
>>>>>>>>> However, currently in "per-job" mode we generate JobGraph in
>>> client
>>>>>> side,
>>>>>>>>> launching
>>>>>>>>> the JobCluster and retrieve the JobGraph for execution. So
>>>> actually,
>>>>> we
>>>>>>>>> don't "run the
>>>>>>>>> client inside the cluster".
>>>>>>>>> 
>>>>>>>>> Besides, refer to the discussion with Till[1], it would be
>>> helpful
>>>> we
>>>>>>>>> follow the same process
>>>>>>>>> of session mode for that of "per-job" mode in user perspective,
>>>> that
>>>>> we
>>>>>>>>> don't use
>>>>>>>>> OptimizedPlanEnvironment to create JobGraph, but directly deploy
>>>>> Flink
>>>>>>>>> cluster in env.execute.
>>>>>>>>> 
>>>>>>>>> Generally 2 points
>>>>>>>>> 
>>>>>>>>> 1. Running Flink job by invoke user main method and execute
>>>>> throughout,
>>>>>>>>> instead of create
>>>>>>>>> JobGraph from main-class.
>>>>>>>>> 2. Run the client inside the cluster.
>>>>>>>>> 
>>>>>>>>> If 1 and 2 are implemented. There is obvious no need for
>>> DETACHED
>>>>> mode
>>>>>> in
>>>>>>>>> cluster side
>>>>>>>>> because we just shutdown the cluster on the exit of client that
>>>>> running
>>>>>>>>> inside cluster. Whether
>>>>>>>>> or not delivered the result is up to user code.
>>>>>>>>> 
>>>>>>>>> [1]
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>>> 
>>>> 
>>> https://issues.apache.org/jira/browse/FLINK-14051?focusedCommentId=16931388&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-16931388
>>>>>>>>> [2]
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>>> 
>>>> 
>>> https://lists.apache.org/x/thread.html/e8f14a381be6c027e8945f884c3cfcb309ce49c1ba557d3749fca495@%3Cdev.flink.apache.org%3E
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> Zili Chen <wander4...@gmail.com> 于2019年9月27日周五 下午2:13写道:
>>>>>>>>> 
>>>>>>>>>> Thanks for your replies Kostas & Aljoscha!
>>>>>>>>>> 
>>>>>>>>>> Below are replies point by point.
>>>>>>>>>> 
>>>>>>>>>> 1. For DETACHED mode, what I said there is about the DETACHED
>>> mode
>>>>> in
>>>>>>>>>> client side.
>>>>>>>>>> There are two configurations overload the item DETACHED[1].
>>>>>>>>>> 
>>>>>>>>>> In client side, it means whether or not client.submitJob is
>>>> blocking
>>>>>> to
>>>>>>>>>> job execution result.
>>>>>>>>>> Due to client.submitJob returns CompletableFuture<JobClient>
>>>>>>>> NON-DETACHED
>>>>>>>>>> is no
>>>>>>>>>> power at all. Caller of submitJob makes the decision whether or
>>>> not
>>>>>>>>>> blocking to get the
>>>>>>>>>> JobClient and request for the job execution result. If client
>>>>> crashes,
>>>>>>>> it
>>>>>>>>>> is a user scope
>>>>>>>>>> exception that should be handled in user code; if client lost
>>>>>> connection
>>>>>>>>>> to cluster, we have
>>>>>>>>>> a retry times and interval configuration that automatically
>>> retry
>>>>> and
>>>>>>>>>> throws an user scope
>>>>>>>>>> exception if exceed.
>>>>>>>>>> 
>>>>>>>>>> Your comment about poll for result or job result sounds like a
>>>>> concern
>>>>>>>> on
>>>>>>>>>> cluster side.
>>>>>>>>>> 
>>>>>>>>>> In cluster side, DETACHED mode is alive only in JobCluster. If
>>>>>> DETACHED
>>>>>>>>>> configured,
>>>>>>>>>> JobCluster exits on job finished; if NON-DETACHED configured,
>>>>>> JobCluster
>>>>>>>>>> exits on job
>>>>>>>>>> execution result delivered. FLIP-74 doesn't stick to changes on
>>>> this
>>>>>>>>>> scope, it is just remained.
>>>>>>>>>> 
>>>>>>>>>> However, it is an interesting part we can revisit this
>>>>> implementation
>>>>>> a
>>>>>>>>>> bit.
>>>>>>>>>> 
>>>>>>>>>> <see the next email for compact reply in this one>
>>>>>>>>>> 
>>>>>>>>>> 2. The retrieval of JobClient is so important that if we don't
>>>> have
>>>>> a
>>>>>>>> way
>>>>>>>>>> to retrieve JobClient it is
>>>>>>>>>> a dumb public user-facing interface(what a strange state :P).
>>>>>>>>>> 
>>>>>>>>>> About the retrieval of JobClient, as mentioned in the document,
>>>> two
>>>>>> ways
>>>>>>>>>> should be supported.
>>>>>>>>>> 
>>>>>>>>>> (1). Retrieved as return type of job submission.
>>>>>>>>>> (2). Retrieve a JobClient of existing job.(with job id)
>>>>>>>>>> 
>>>>>>>>>> I highly respect your thoughts about how Executors should be
>>> and
>>>>>>>> thoughts
>>>>>>>>>> on multi-layered clients.
>>>>>>>>>> Although, (2) is not supported by public interfaces as summary
>>> of
>>>>>>>>>> discussion above, we can discuss
>>>>>>>>>> a bit on the place of Executors on multi-layered clients and
>>> find
>>>> a
>>>>>> way
>>>>>>>>>> to retrieve JobClient of
>>>>>>>>>> existing job with public client API. I will comment in FLIP-73
>>>>>> thread[2]
>>>>>>>>>> since it is almost about Executors.
>>>>>>>>>> 
>>>>>>>>>> Best,
>>>>>>>>>> tison.
>>>>>>>>>> 
>>>>>>>>>> [1]
>>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>>> 
>>>> 
>>> https://docs.google.com/document/d/1E-8UjOLz4QPUTxetGWbU23OlsIH9VIdodpTsxwoQTs0/edit?disco=AAAADnLLvM8
>>>>>>>>>> [2]
>>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>>> 
>>>> 
>>> https://lists.apache.org/x/thread.html/dc3a541709f96906b43df4155373af1cd09e08c3f105b0bd0ba3fca2@%3Cdev.flink.apache.org%3E
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> Kostas Kloudas <kklou...@gmail.com> 于2019年9月25日周三 下午9:29写道:
>>>>>>>>>> 
>>>>>>>>>>> Hi Tison,
>>>>>>>>>>> 
>>>>>>>>>>> Thanks for the FLIP and launching the discussion!
>>>>>>>>>>> 
>>>>>>>>>>> As a first note, big +1 on providing/exposing a JobClient to
>>> the
>>>>>> users!
>>>>>>>>>>> 
>>>>>>>>>>> Some points that would be nice to be clarified:
>>>>>>>>>>> 1) You mention that we can get rid of the DETACHED mode: I
>>> agree
>>>>> that
>>>>>>>>>>> at a high level, given that everything will now be
>>> asynchronous,
>>>>>> there
>>>>>>>>>>> is no need to keep the DETACHED mode but I think we should
>>>> specify
>>>>>>>>>>> some aspects. For example, without the explicit separation of
>>> the
>>>>>>>>>>> modes, what happens when the job finishes. Does the client
>>>>>>>>>>> periodically poll for the result always or the result is
>>> pushed
>>>>> when
>>>>>>>>>>> in NON-DETACHED mode? What happens if the client disconnects
>>> and
>>>>>>>>>>> reconnects?
>>>>>>>>>>> 
>>>>>>>>>>> 2) On the "how to retrieve a JobClient for a running Job", I
>>>> think
>>>>>>>>>>> this is related to the other discussion you opened in the ML
>>>> about
>>>>>>>>>>> multi-layered clients. First of all, I agree that exposing
>>>>> different
>>>>>>>>>>> "levels" of clients would be a nice addition, and actually
>>> there
>>>>> have
>>>>>>>>>>> been some discussions about doing so in the future. Now for
>>> this
>>>>>>>>>>> specific discussion:
>>>>>>>>>>>     i) I do not think that we should expose the
>>>>>>>>>>> ClusterDescriptor/ClusterSpecification to the user, as this
>>> ties
>>>> us
>>>>>> to
>>>>>>>>>>> a specific architecture which may change in the future.
>>>>>>>>>>>    ii) I do not think it should be the Executor that will
>>>> provide
>>>>> a
>>>>>>>>>>> JobClient for an already running job (only for the Jobs that
>>> it
>>>>>>>>>>> submits). The job of the executor should just be to execute()
>>> a
>>>>>>>>>>> pipeline.
>>>>>>>>>>>    iii) I think a solution that respects the separation of
>>>>> concerns
>>>>>>>>>>> could be the addition of another component (in the future),
>>>>> something
>>>>>>>>>>> like a ClientFactory, or ClusterFactory that will have methods
>>>>> like:
>>>>>>>>>>> ClusterClient createCluster(Configuration), JobClient
>>>>>>>>>>> retrieveJobClient(Configuration , JobId), maybe even (although
>>>> not
>>>>>>>>>>> sure) Executor getExecutor(Configuration ) and maybe more.
>>> This
>>>>>>>>>>> component would be responsible to interact with a cluster
>>> manager
>>>>>> like
>>>>>>>>>>> Yarn and do what is now being done by the ClusterDescriptor
>>> plus
>>>>> some
>>>>>>>>>>> more stuff.
>>>>>>>>>>> 
>>>>>>>>>>> Although under the hood all these abstractions (Environments,
>>>>>>>>>>> Executors, ...) underneath use the same clients, I believe
>>> their
>>>>>>>>>>> job/existence is not contradicting but they simply hide some
>>> of
>>>> the
>>>>>>>>>>> complexity from the user, and give us, as developers some
>>> freedom
>>>>> to
>>>>>>>>>>> change in the future some of the parts. For example, the
>>> executor
>>>>>> will
>>>>>>>>>>> take a Pipeline, create a JobGraph and submit it, instead of
>>>>>> requiring
>>>>>>>>>>> the user to do each step separately. This allows us to, for
>>>>> example,
>>>>>>>>>>> get rid of the Plan if in the future everything is DataStream.
>>>>>>>>>>> Essentially, I think of these as layers of an onion with the
>>>>> clients
>>>>>>>>>>> being close to the core. The higher you go, the more
>>>> functionality
>>>>> is
>>>>>>>>>>> included and hidden from the public eye.
>>>>>>>>>>> 
>>>>>>>>>>> Point iii) by the way is just a thought and by no means
>>> final. I
>>>>> also
>>>>>>>>>>> like the idea of multi-layered clients so this may spark up
>>> the
>>>>>>>>>>> discussion.
>>>>>>>>>>> 
>>>>>>>>>>> Cheers,
>>>>>>>>>>> Kostas
>>>>>>>>>>> 
>>>>>>>>>>> On Wed, Sep 25, 2019 at 2:21 PM Aljoscha Krettek <
>>>>>> aljos...@apache.org>
>>>>>>>>>>> wrote:
>>>>>>>>>>>> 
>>>>>>>>>>>> Hi Tison,
>>>>>>>>>>>> 
>>>>>>>>>>>> Thanks for proposing the document! I had some comments on the
>>>>>>>> document.
>>>>>>>>>>>> 
>>>>>>>>>>>> I think the only complex thing that we still need to figure
>>> out
>>>> is
>>>>>>>> how
>>>>>>>>>>> to get a JobClient for a job that is already running. As you
>>>>>> mentioned
>>>>>>>> in
>>>>>>>>>>> the document. Currently I’m thinking that its ok to add a
>>> method
>>>> to
>>>>>>>>>>> Executor for retrieving a JobClient for a running job by
>>>> providing
>>>>> an
>>>>>>>> ID.
>>>>>>>>>>> Let’s see what Kostas has to say on the topic.
>>>>>>>>>>>> 
>>>>>>>>>>>> Best,
>>>>>>>>>>>> Aljoscha
>>>>>>>>>>>> 
>>>>>>>>>>>>> On 25. Sep 2019, at 12:31, Zili Chen <wander4...@gmail.com>
>>>>> wrote:
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Hi all,
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Summary from the discussion about introducing Flink
>>> JobClient
>>>>>>>> API[1]
>>>>>>>>>>> we
>>>>>>>>>>>>> draft FLIP-74[2] to
>>>>>>>>>>>>> gather thoughts and towards a standard public user-facing
>>>>>>>> interfaces.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> This discussion thread aims at standardizing job level
>>> client
>>>>> API.
>>>>>>>>>>> But I'd
>>>>>>>>>>>>> like to emphasize that
>>>>>>>>>>>>> how to retrieve JobClient possibly causes further
>>> discussion on
>>>>>>>>>>> different
>>>>>>>>>>>>> level clients exposed from
>>>>>>>>>>>>> Flink so that a following thread will be started later to
>>>>>>>> coordinate
>>>>>>>>>>>>> FLIP-73 and FLIP-74 on
>>>>>>>>>>>>> expose issue.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Looking forward to your opinions.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Best,
>>>>>>>>>>>>> tison.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> [1]
>>>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>>> 
>>>> 
>>> https://lists.apache.org/thread.html/ce99cba4a10b9dc40eb729d39910f315ae41d80ec74f09a356c73938@%3Cdev.flink.apache.org%3E
>>>>>>>>>>>>> [2]
>>>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>>> 
>>>> 
>>> https://cwiki.apache.org/confluence/display/FLINK/FLIP-74%3A+Flink+JobClient+API
>>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>> 
>>>>>> 
>>>>>> 
>>>>> 
>>>>> --
>>>>> 
>>>>> Konstantin Knauf | Solutions Architect
>>>>> 
>>>>> +49 160 91394525
>>>>> 
>>>>> 
>>>>> Follow us @VervericaData Ververica <https://www.ververica.com/>
>>>>> 
>>>>> 
>>>>> --
>>>>> 
>>>>> Join Flink Forward <https://flink-forward.org/> - The Apache Flink
>>>>> Conference
>>>>> 
>>>>> Stream Processing | Event Driven | Real Time
>>>>> 
>>>>> --
>>>>> 
>>>>> Ververica GmbH | Invalidenstrasse 115, 10115 Berlin, Germany
>>>>> 
>>>>> --
>>>>> Ververica GmbH
>>>>> Registered at Amtsgericht Charlottenburg: HRB 158244 B
>>>>> Managing Directors: Timothy Alexander Steinert, Yip Park Tung Jason,
>>> Ji
>>>>> (Tony) Cheng
>>>>> 
>>>> 
>>> 
>>> 
>>> --
>>> 
>>> Konstantin Knauf | Solutions Architect
>>> 
>>> +49 160 91394525
>>> 
>>> 
>>> Follow us @VervericaData Ververica <https://www.ververica.com/>
>>> 
>>> 
>>> --
>>> 
>>> Join Flink Forward <https://flink-forward.org/> - The Apache Flink
>>> Conference
>>> 
>>> Stream Processing | Event Driven | Real Time
>>> 
>>> --
>>> 
>>> Ververica GmbH | Invalidenstrasse 115, 10115 Berlin, Germany
>>> 
>>> --
>>> Ververica GmbH
>>> Registered at Amtsgericht Charlottenburg: HRB 158244 B
>>> Managing Directors: Timothy Alexander Steinert, Yip Park Tung Jason, Ji
>>> (Tony) Cheng
>>> 
>> 

Reply via email to