Great idea Tison! I will create the umbrella issue and post it here so that we are all on the same page!
Cheers, Kostas On Wed, Sep 4, 2019 at 11:36 AM Zili Chen <wander4...@gmail.com> wrote: > > Hi Kostas & Aljoscha, > > I notice that there is a JIRA(FLINK-13946) which could be included > in this refactor thread. Since we agree on most of directions in > big picture, is it reasonable that we create an umbrella issue for > refactor client APIs and also linked subtasks? It would be a better > way that we join forces of our community. > > Best, > tison. > > > Zili Chen <wander4...@gmail.com> 于2019年8月31日周六 下午12:52写道: >> >> Great Kostas! Looking forward to your POC! >> >> Best, >> tison. >> >> >> Jeff Zhang <zjf...@gmail.com> 于2019年8月30日周五 下午11:07写道: >>> >>> Awesome, @Kostas Looking forward your POC. >>> >>> Kostas Kloudas <kklou...@gmail.com> 于2019年8月30日周五 下午8:33写道: >>> >>> > Hi all, >>> > >>> > I am just writing here to let you know that I am working on a POC that >>> > tries to refactor the current state of job submission in Flink. >>> > I want to stress out that it introduces NO CHANGES to the current >>> > behaviour of Flink. It just re-arranges things and introduces the >>> > notion of an Executor, which is the entity responsible for taking the >>> > user-code and submitting it for execution. >>> > >>> > Given this, the discussion about the functionality that the JobClient >>> > will expose to the user can go on independently and the same >>> > holds for all the open questions so far. >>> > >>> > I hope I will have some more new to share soon. >>> > >>> > Thanks, >>> > Kostas >>> > >>> > On Mon, Aug 26, 2019 at 4:20 AM Yang Wang <danrtsey...@gmail.com> wrote: >>> > > >>> > > Hi Zili, >>> > > >>> > > It make sense to me that a dedicated cluster is started for a per-job >>> > > cluster and will not accept more jobs. >>> > > Just have a question about the command line. >>> > > >>> > > Currently we could use the following commands to start different >>> > clusters. >>> > > *per-job cluster* >>> > > ./bin/flink run -d -p 5 -ynm perjob-cluster1 -m yarn-cluster >>> > > examples/streaming/WindowJoin.jar >>> > > *session cluster* >>> > > ./bin/flink run -p 5 -ynm session-cluster1 -m yarn-cluster >>> > > examples/streaming/WindowJoin.jar >>> > > >>> > > What will it look like after client enhancement? >>> > > >>> > > >>> > > Best, >>> > > Yang >>> > > >>> > > Zili Chen <wander4...@gmail.com> 于2019年8月23日周五 下午10:46写道: >>> > > >>> > > > Hi Till, >>> > > > >>> > > > Thanks for your update. Nice to hear :-) >>> > > > >>> > > > Best, >>> > > > tison. >>> > > > >>> > > > >>> > > > Till Rohrmann <trohrm...@apache.org> 于2019年8月23日周五 下午10:39写道: >>> > > > >>> > > > > Hi Tison, >>> > > > > >>> > > > > just a quick comment concerning the class loading issues when using >>> > the >>> > > > per >>> > > > > job mode. The community wants to change it so that the >>> > > > > StandaloneJobClusterEntryPoint actually uses the user code class >>> > loader >>> > > > > with child first class loading [1]. Hence, I hope that this problem >>> > will >>> > > > be >>> > > > > resolved soon. >>> > > > > >>> > > > > [1] https://issues.apache.org/jira/browse/FLINK-13840 >>> > > > > >>> > > > > Cheers, >>> > > > > Till >>> > > > > >>> > > > > On Fri, Aug 23, 2019 at 2:47 PM Kostas Kloudas <kklou...@gmail.com> >>> > > > wrote: >>> > > > > >>> > > > > > Hi all, >>> > > > > > >>> > > > > > On the topic of web submission, I agree with Till that it only >>> > seems >>> > > > > > to complicate things. >>> > > > > > It is bad for security, job isolation (anybody can submit/cancel >>> > jobs), >>> > > > > > and its >>> > > > > > implementation complicates some parts of the code. So, if it were >>> > to >>> > > > > > redesign the >>> > > > > > WebUI, maybe this part could be left out. In addition, I would say >>> > > > > > that the ability to cancel >>> > > > > > jobs could also be left out. >>> > > > > > >>> > > > > > Also I would also be in favour of removing the "detached" mode, >>> > > > > > for >>> > > > > > the reasons mentioned >>> > > > > > above (i.e. because now we will have a future representing the >>> > result >>> > > > > > on which the user >>> > > > > > can choose to wait or not). >>> > > > > > >>> > > > > > Now for the separating job submission and cluster creation, I am >>> > > > > > in >>> > > > > > favour of keeping both. >>> > > > > > Once again, the reasons are mentioned above by Stephan, Till, >>> > Aljoscha >>> > > > > > and also Zili seems >>> > > > > > to agree. They mainly have to do with security, isolation and ease >>> > of >>> > > > > > resource management >>> > > > > > for the user as he knows that "when my job is done, everything >>> > will be >>> > > > > > cleared up". This is >>> > > > > > also the experience you get when launching a process on your local >>> > OS. >>> > > > > > >>> > > > > > On excluding the per-job mode from returning a JobClient or not, I >>> > > > > > believe that eventually >>> > > > > > it would be nice to allow users to get back a jobClient. The >>> > reason is >>> > > > > > that 1) I cannot >>> > > > > > find any objective reason why the user-experience should diverge, >>> > and >>> > > > > > 2) this will be the >>> > > > > > way that the user will be able to interact with his running job. >>> > > > > > Assuming that the necessary >>> > > > > > ports are open for the REST API to work, then I think that the >>> > > > > > JobClient can run against the >>> > > > > > REST API without problems. If the needed ports are not open, then >>> > we >>> > > > > > are safe to not return >>> > > > > > a JobClient, as the user explicitly chose to close all points of >>> > > > > > communication to his running job. >>> > > > > > >>> > > > > > On the topic of not hijacking the "env.execute()" in order to get >>> > the >>> > > > > > Plan, I definitely agree but >>> > > > > > for the proposal of having a "compile()" method in the env, I >>> > > > > > would >>> > > > > > like to have a better look at >>> > > > > > the existing code. >>> > > > > > >>> > > > > > Cheers, >>> > > > > > Kostas >>> > > > > > >>> > > > > > On Fri, Aug 23, 2019 at 5:52 AM Zili Chen <wander4...@gmail.com> >>> > > > wrote: >>> > > > > > > >>> > > > > > > Hi Yang, >>> > > > > > > >>> > > > > > > It would be helpful if you check Stephan's last comment, >>> > > > > > > which states that isolation is important. >>> > > > > > > >>> > > > > > > For per-job mode, we run a dedicated cluster(maybe it >>> > > > > > > should have been a couple of JM and TMs during FLIP-6 >>> > > > > > > design) for a specific job. Thus the process is prevented >>> > > > > > > from other jobs. >>> > > > > > > >>> > > > > > > In our cases there was a time we suffered from multi >>> > > > > > > jobs submitted by different users and they affected >>> > > > > > > each other so that all ran into an error state. Also, >>> > > > > > > run the client inside the cluster could save client >>> > > > > > > resource at some points. >>> > > > > > > >>> > > > > > > However, we also face several issues as you mentioned, >>> > > > > > > that in per-job mode it always uses parent classloader >>> > > > > > > thus classloading issues occur. >>> > > > > > > >>> > > > > > > BTW, one can makes an analogy between session/per-job mode >>> > > > > > > in Flink, and client/cluster mode in Spark. >>> > > > > > > >>> > > > > > > Best, >>> > > > > > > tison. >>> > > > > > > >>> > > > > > > >>> > > > > > > Yang Wang <danrtsey...@gmail.com> 于2019年8月22日周四 上午11:25写道: >>> > > > > > > >>> > > > > > > > From the user's perspective, it is really confused about the >>> > scope >>> > > > of >>> > > > > > > > per-job cluster. >>> > > > > > > > >>> > > > > > > > >>> > > > > > > > If it means a flink cluster with single job, so that we could >>> > get >>> > > > > > better >>> > > > > > > > isolation. >>> > > > > > > > >>> > > > > > > > Now it does not matter how we deploy the cluster, directly >>> > > > > > deploy(mode1) >>> > > > > > > > >>> > > > > > > > or start a flink cluster and then submit job through cluster >>> > > > > > client(mode2). >>> > > > > > > > >>> > > > > > > > >>> > > > > > > > Otherwise, if it just means directly deploy, how should we >>> > name the >>> > > > > > mode2, >>> > > > > > > > >>> > > > > > > > session with job or something else? >>> > > > > > > > >>> > > > > > > > We could also benefit from the mode2. Users could get the same >>> > > > > > isolation >>> > > > > > > > with mode1. >>> > > > > > > > >>> > > > > > > > The user code and dependencies will be loaded by user class >>> > loader >>> > > > > > > > >>> > > > > > > > to avoid class conflict with framework. >>> > > > > > > > >>> > > > > > > > >>> > > > > > > > >>> > > > > > > > Anyway, both of the two submission modes are useful. >>> > > > > > > > >>> > > > > > > > We just need to clarify the concepts. >>> > > > > > > > >>> > > > > > > > >>> > > > > > > > >>> > > > > > > > >>> > > > > > > > Best, >>> > > > > > > > >>> > > > > > > > Yang >>> > > > > > > > >>> > > > > > > > Zili Chen <wander4...@gmail.com> 于2019年8月20日周二 下午5:58写道: >>> > > > > > > > >>> > > > > > > > > Thanks for the clarification. >>> > > > > > > > > >>> > > > > > > > > The idea JobDeployer ever came into my mind when I was >>> > muddled >>> > > > with >>> > > > > > > > > how to execute per-job mode and session mode with the same >>> > user >>> > > > > code >>> > > > > > > > > and framework codepath. >>> > > > > > > > > >>> > > > > > > > > With the concept JobDeployer we back to the statement that >>> > > > > > environment >>> > > > > > > > > knows every configs of cluster deployment and job >>> > submission. We >>> > > > > > > > > configure or generate from configuration a specific >>> > JobDeployer >>> > > > in >>> > > > > > > > > environment and then code align on >>> > > > > > > > > >>> > > > > > > > > *JobClient client = env.execute().get();* >>> > > > > > > > > >>> > > > > > > > > which in session mode returned by clusterClient.submitJob >>> > and in >>> > > > > > per-job >>> > > > > > > > > mode returned by clusterDescriptor.deployJobCluster. >>> > > > > > > > > >>> > > > > > > > > Here comes a problem that currently we directly run >>> > > > > ClusterEntrypoint >>> > > > > > > > > with extracted job graph. Follow the JobDeployer way we'd >>> > better >>> > > > > > > > > align entry point of per-job deployment at JobDeployer. >>> > Users run >>> > > > > > > > > their main method or by a Cli(finally call main method) to >>> > deploy >>> > > > > the >>> > > > > > > > > job cluster. >>> > > > > > > > > >>> > > > > > > > > Best, >>> > > > > > > > > tison. >>> > > > > > > > > >>> > > > > > > > > >>> > > > > > > > > Stephan Ewen <se...@apache.org> 于2019年8月20日周二 下午4:40写道: >>> > > > > > > > > >>> > > > > > > > > > Till has made some good comments here. >>> > > > > > > > > > >>> > > > > > > > > > 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. >>> > > > > > > > > > >>> > > > > > > > > > On Tue, Aug 20, 2019 at 10:27 AM Till Rohrmann < >>> > > > > > trohrm...@apache.org> >>> > > > > > > > > > wrote: >>> > > > > > > > > > >>> > > > > > > > > > > I would not be in favour of getting rid of the per-job >>> > mode >>> > > > > > since it >>> > > > > > > > > > > simplifies the process of running Flink jobs >>> > considerably. >>> > > > > > Moreover, >>> > > > > > > > it >>> > > > > > > > > > is >>> > > > > > > > > > > not only well suited for container deployments but also >>> > for >>> > > > > > > > deployments >>> > > > > > > > > > > where you want to guarantee job isolation. For example, >>> > > > > > > > > > > a >>> > > > user >>> > > > > > could >>> > > > > > > > > use >>> > > > > > > > > > > the per-job mode on Yarn to execute his job on a >>> > > > > > > > > > > separate >>> > > > > > cluster. >>> > > > > > > > > > > >>> > > > > > > > > > > I think that having two notions of cluster deployments >>> > > > (session >>> > > > > > vs. >>> > > > > > > > > > per-job >>> > > > > > > > > > > mode) does not necessarily contradict your ideas for the >>> > > > client >>> > > > > > api >>> > > > > > > > > > > refactoring. For example one could have the following >>> > > > > interfaces: >>> > > > > > > > > > > >>> > > > > > > > > > > - ClusterDeploymentDescriptor: encapsulates the logic >>> > how to >>> > > > > > deploy a >>> > > > > > > > > > > cluster. >>> > > > > > > > > > > - ClusterClient: allows to interact with a cluster >>> > > > > > > > > > > - JobClient: allows to interact with a running job >>> > > > > > > > > > > >>> > > > > > > > > > > Now the ClusterDeploymentDescriptor could have two >>> > methods: >>> > > > > > > > > > > >>> > > > > > > > > > > - ClusterClient deploySessionCluster() >>> > > > > > > > > > > - JobClusterClient/JobClient >>> > deployPerJobCluster(JobGraph) >>> > > > > > > > > > > >>> > > > > > > > > > > where JobClusterClient is either a supertype of >>> > ClusterClient >>> > > > > > which >>> > > > > > > > > does >>> > > > > > > > > > > not give you the functionality to submit jobs or >>> > > > > > deployPerJobCluster >>> > > > > > > > > > > returns directly a JobClient. >>> > > > > > > > > > > >>> > > > > > > > > > > When setting up the ExecutionEnvironment, one would then >>> > not >>> > > > > > provide >>> > > > > > > > a >>> > > > > > > > > > > ClusterClient to submit jobs but a JobDeployer which, >>> > > > depending >>> > > > > > on >>> > > > > > > > the >>> > > > > > > > > > > selected mode, either uses a ClusterClient (session >>> > mode) to >>> > > > > > submit >>> > > > > > > > > jobs >>> > > > > > > > > > or >>> > > > > > > > > > > a ClusterDeploymentDescriptor to deploy per a job mode >>> > > > cluster >>> > > > > > with >>> > > > > > > > the >>> > > > > > > > > > job >>> > > > > > > > > > > to execute. >>> > > > > > > > > > > >>> > > > > > > > > > > These are just some thoughts how one could make it >>> > working >>> > > > > > because I >>> > > > > > > > > > > believe there is some value in using the per job mode >>> > from >>> > > > the >>> > > > > > > > > > > ExecutionEnvironment. >>> > > > > > > > > > > >>> > > > > > > > > > > Concerning the web submission, this is indeed a bit >>> > tricky. >>> > > > > From >>> > > > > > a >>> > > > > > > > > > cluster >>> > > > > > > > > > > management stand point, I would in favour of not >>> > executing >>> > > > user >>> > > > > > code >>> > > > > > > > on >>> > > > > > > > > > the >>> > > > > > > > > > > REST endpoint. Especially when considering security, it >>> > would >>> > > > > be >>> > > > > > good >>> > > > > > > > > to >>> > > > > > > > > > > have a well defined cluster behaviour where it is >>> > explicitly >>> > > > > > stated >>> > > > > > > > > where >>> > > > > > > > > > > user code and, thus, potentially risky code is executed. >>> > > > > Ideally >>> > > > > > we >>> > > > > > > > > limit >>> > > > > > > > > > > it to the TaskExecutor and JobMaster. >>> > > > > > > > > > > >>> > > > > > > > > > > Cheers, >>> > > > > > > > > > > Till >>> > > > > > > > > > > >>> > > > > > > > > > > On Tue, Aug 20, 2019 at 9:40 AM Flavio Pompermaier < >>> > > > > > > > > pomperma...@okkam.it >>> > > > > > > > > > > >>> > > > > > > > > > > wrote: >>> > > > > > > > > > > >>> > > > > > > > > > > > In my opinion the client should not use any >>> > environment to >>> > > > > get >>> > > > > > the >>> > > > > > > > > Job >>> > > > > > > > > > > > graph because the jar should reside ONLY on the >>> > > > > > > > > > > > cluster >>> > > > (and >>> > > > > > not in >>> > > > > > > > > the >>> > > > > > > > > > > > client classpath otherwise there are always >>> > inconsistencies >>> > > > > > between >>> > > > > > > > > > > client >>> > > > > > > > > > > > and Flink Job manager's classpath). >>> > > > > > > > > > > > In the YARN, Mesos and Kubernetes scenarios you have >>> > the >>> > > > jar >>> > > > > > but >>> > > > > > > > you >>> > > > > > > > > > > could >>> > > > > > > > > > > > start a cluster that has the jar on the Job Manager as >>> > well >>> > > > > > (but >>> > > > > > > > this >>> > > > > > > > > > is >>> > > > > > > > > > > > the only case where I think you can assume that the >>> > client >>> > > > > has >>> > > > > > the >>> > > > > > > > > jar >>> > > > > > > > > > on >>> > > > > > > > > > > > the classpath..in the REST job submission you don't >>> > have >>> > > > any >>> > > > > > > > > > classpath). >>> > > > > > > > > > > > >>> > > > > > > > > > > > Thus, always in my opinion, the JobGraph should be >>> > > > generated >>> > > > > > by the >>> > > > > > > > > Job >>> > > > > > > > > > > > Manager REST API. >>> > > > > > > > > > > > >>> > > > > > > > > > > > >>> > > > > > > > > > > > On Tue, Aug 20, 2019 at 9:00 AM Zili Chen < >>> > > > > > wander4...@gmail.com> >>> > > > > > > > > > wrote: >>> > > > > > > > > > > > >>> > > > > > > > > > > >> I would like to involve Till & Stephan here to >>> > > > > > > > > > > >> clarify >>> > > > some >>> > > > > > > > concept >>> > > > > > > > > of >>> > > > > > > > > > > >> per-job mode. >>> > > > > > > > > > > >> >>> > > > > > > > > > > >> The term per-job is one of modes a cluster could run >>> > on. >>> > > > It >>> > > > > is >>> > > > > > > > > mainly >>> > > > > > > > > > > >> aimed >>> > > > > > > > > > > >> at spawn >>> > > > > > > > > > > >> a dedicated cluster for a specific job while the job >>> > could >>> > > > > be >>> > > > > > > > > packaged >>> > > > > > > > > > > >> with >>> > > > > > > > > > > >> Flink >>> > > > > > > > > > > >> itself and thus the cluster initialized with job so >>> > that >>> > > > get >>> > > > > > rid >>> > > > > > > > of >>> > > > > > > > > a >>> > > > > > > > > > > >> separated >>> > > > > > > > > > > >> submission step. >>> > > > > > > > > > > >> >>> > > > > > > > > > > >> This is useful for container deployments where one >>> > create >>> > > > > his >>> > > > > > > > image >>> > > > > > > > > > with >>> > > > > > > > > > > >> the job >>> > > > > > > > > > > >> and then simply deploy the container. >>> > > > > > > > > > > >> >>> > > > > > > > > > > >> However, it is out of client scope since a >>> > > > > > client(ClusterClient >>> > > > > > > > for >>> > > > > > > > > > > >> example) is for >>> > > > > > > > > > > >> communicate with an existing cluster and performance >>> > > > > actions. >>> > > > > > > > > > Currently, >>> > > > > > > > > > > >> in >>> > > > > > > > > > > >> per-job >>> > > > > > > > > > > >> mode, we extract the job graph and bundle it into >>> > cluster >>> > > > > > > > deployment >>> > > > > > > > > > and >>> > > > > > > > > > > >> thus no >>> > > > > > > > > > > >> concept of client get involved. It looks like >>> > reasonable >>> > > > to >>> > > > > > > > exclude >>> > > > > > > > > > the >>> > > > > > > > > > > >> deployment >>> > > > > > > > > > > >> of per-job cluster from client api and use dedicated >>> > > > utility >>> > > > > > > > > > > >> classes(deployers) for >>> > > > > > > > > > > >> deployment. >>> > > > > > > > > > > >> >>> > > > > > > > > > > >> Zili Chen <wander4...@gmail.com> 于2019年8月20日周二 >>> > 下午12:37写道: >>> > > > > > > > > > > >> >>> > > > > > > > > > > >> > Hi Aljoscha, >>> > > > > > > > > > > >> > >>> > > > > > > > > > > >> > Thanks for your reply and participance. The Google >>> > Doc >>> > > > you >>> > > > > > > > linked >>> > > > > > > > > to >>> > > > > > > > > > > >> > requires >>> > > > > > > > > > > >> > permission and I think you could use a share link >>> > > > instead. >>> > > > > > > > > > > >> > >>> > > > > > > > > > > >> > I agree with that we almost reach a consensus that >>> > > > > > JobClient is >>> > > > > > > > > > > >> necessary >>> > > > > > > > > > > >> > to >>> > > > > > > > > > > >> > interacte with a running Job. >>> > > > > > > > > > > >> > >>> > > > > > > > > > > >> > Let me check your open questions one by one. >>> > > > > > > > > > > >> > >>> > > > > > > > > > > >> > 1. Separate cluster creation and job submission for >>> > > > > per-job >>> > > > > > > > mode. >>> > > > > > > > > > > >> > >>> > > > > > > > > > > >> > As you mentioned here is where the opinions >>> > diverge. In >>> > > > my >>> > > > > > > > > document >>> > > > > > > > > > > >> there >>> > > > > > > > > > > >> > is >>> > > > > > > > > > > >> > an alternative[2] that proposes excluding per-job >>> > > > > deployment >>> > > > > > > > from >>> > > > > > > > > > > client >>> > > > > > > > > > > >> > api >>> > > > > > > > > > > >> > scope and now I find it is more reasonable we do >>> > > > > > > > > > > >> > the >>> > > > > > exclusion. >>> > > > > > > > > > > >> > >>> > > > > > > > > > > >> > When in per-job mode, a dedicated JobCluster is >>> > launched >>> > > > > to >>> > > > > > > > > execute >>> > > > > > > > > > > the >>> > > > > > > > > > > >> > specific job. It is like a Flink Application more >>> > than a >>> > > > > > > > > submission >>> > > > > > > > > > > >> > of Flink Job. Client only takes care of job >>> > submission >>> > > > and >>> > > > > > > > assume >>> > > > > > > > > > > there >>> > > > > > > > > > > >> is >>> > > > > > > > > > > >> > an existing cluster. In this way we are able to >>> > consider >>> > > > > > per-job >>> > > > > > > > > > > issues >>> > > > > > > > > > > >> > individually and JobClusterEntrypoint would be the >>> > > > utility >>> > > > > > class >>> > > > > > > > > for >>> > > > > > > > > > > >> > per-job >>> > > > > > > > > > > >> > deployment. >>> > > > > > > > > > > >> > >>> > > > > > > > > > > >> > Nevertheless, user program works in both session >>> > mode >>> > > > and >>> > > > > > > > per-job >>> > > > > > > > > > mode >>> > > > > > > > > > > >> > without >>> > > > > > > > > > > >> > necessary to change code. JobClient in per-job mode >>> > is >>> > > > > > returned >>> > > > > > > > > from >>> > > > > > > > > > > >> > env.execute as normal. However, it would be no >>> > longer a >>> > > > > > wrapper >>> > > > > > > > of >>> > > > > > > > > > > >> > RestClusterClient but a wrapper of >>> > PerJobClusterClient >>> > > > > which >>> > > > > > > > > > > >> communicates >>> > > > > > > > > > > >> > to Dispatcher locally. >>> > > > > > > > > > > >> > >>> > > > > > > > > > > >> > 2. How to deal with plan preview. >>> > > > > > > > > > > >> > >>> > > > > > > > > > > >> > With env.compile functions users can get JobGraph >>> > > > > > > > > > > >> > or >>> > > > > > FlinkPlan >>> > > > > > > > and >>> > > > > > > > > > > thus >>> > > > > > > > > > > >> > they can preview the plan with programming. >>> > Typically it >>> > > > > > looks >>> > > > > > > > > like >>> > > > > > > > > > > >> > >>> > > > > > > > > > > >> > if (preview configured) { >>> > > > > > > > > > > >> > FlinkPlan plan = env.compile(); >>> > > > > > > > > > > >> > new JSONDumpGenerator(...).dump(plan); >>> > > > > > > > > > > >> > } else { >>> > > > > > > > > > > >> > env.execute(); >>> > > > > > > > > > > >> > } >>> > > > > > > > > > > >> > >>> > > > > > > > > > > >> > And `flink info` would be invalid any more. >>> > > > > > > > > > > >> > >>> > > > > > > > > > > >> > 3. How to deal with Jar Submission at the Web >>> > Frontend. >>> > > > > > > > > > > >> > >>> > > > > > > > > > > >> > There is one more thread talked on this topic[1]. >>> > Apart >>> > > > > from >>> > > > > > > > > > removing >>> > > > > > > > > > > >> > the functions there are two alternatives. >>> > > > > > > > > > > >> > >>> > > > > > > > > > > >> > One is to introduce an interface has a method >>> > returns >>> > > > > > > > > > > JobGraph/FilnkPlan >>> > > > > > > > > > > >> > and Jar Submission only support main-class >>> > implements >>> > > > this >>> > > > > > > > > > interface. >>> > > > > > > > > > > >> > And then extract the JobGraph/FlinkPlan just by >>> > calling >>> > > > > the >>> > > > > > > > > method. >>> > > > > > > > > > > >> > In this way, it is even possible to consider a >>> > > > separation >>> > > > > > of job >>> > > > > > > > > > > >> creation >>> > > > > > > > > > > >> > and job submission. >>> > > > > > > > > > > >> > >>> > > > > > > > > > > >> > The other is, as you mentioned, let execute() do >>> > > > > > > > > > > >> > the >>> > > > > actual >>> > > > > > > > > > execution. >>> > > > > > > > > > > >> > We won't execute the main method in the WebFrontend >>> > but >>> > > > > > spawn a >>> > > > > > > > > > > process >>> > > > > > > > > > > >> > at WebMonitor side to execute. For return part we >>> > could >>> > > > > > generate >>> > > > > > > > > the >>> > > > > > > > > > > >> > JobID from WebMonitor and pass it to the execution >>> > > > > > environemnt. >>> > > > > > > > > > > >> > >>> > > > > > > > > > > >> > 4. How to deal with detached mode. >>> > > > > > > > > > > >> > >>> > > > > > > > > > > >> > I think detached mode is a temporary solution for >>> > > > > > non-blocking >>> > > > > > > > > > > >> submission. >>> > > > > > > > > > > >> > In my document both submission and execution return >>> > a >>> > > > > > > > > > > CompletableFuture >>> > > > > > > > > > > >> and >>> > > > > > > > > > > >> > users control whether or not wait for the result. >>> > > > > > > > > > > >> > In >>> > > > this >>> > > > > > point >>> > > > > > > > we >>> > > > > > > > > > > don't >>> > > > > > > > > > > >> > need a detached option but the functionality is >>> > covered. >>> > > > > > > > > > > >> > >>> > > > > > > > > > > >> > 5. How does per-job mode interact with interactive >>> > > > > > programming. >>> > > > > > > > > > > >> > >>> > > > > > > > > > > >> > All of YARN, Mesos and Kubernetes scenarios follow >>> > the >>> > > > > > pattern >>> > > > > > > > > > launch >>> > > > > > > > > > > a >>> > > > > > > > > > > >> > JobCluster now. And I don't think there would be >>> > > > > > inconsistency >>> > > > > > > > > > between >>> > > > > > > > > > > >> > different resource management. >>> > > > > > > > > > > >> > >>> > > > > > > > > > > >> > Best, >>> > > > > > > > > > > >> > tison. >>> > > > > > > > > > > >> > >>> > > > > > > > > > > >> > [1] >>> > > > > > > > > > > >> > >>> > > > > > > > > > > >> >>> > > > > > > > > > > >>> > > > > > > > > > >>> > > > > > > > > >>> > > > > > > > >>> > > > > > >>> > > > > >>> > > > >>> > https://lists.apache.org/x/thread.html/6db869c53816f4e2917949a7c6992c2b90856d7d639d7f2e1cd13768@%3Cdev.flink.apache.org%3E >>> > > > > > > > > > > >> > [2] >>> > > > > > > > > > > >> > >>> > > > > > > > > > > >> >>> > > > > > > > > > > >>> > > > > > > > > > >>> > > > > > > > > >>> > > > > > > > >>> > > > > > >>> > > > > >>> > > > >>> > https://docs.google.com/document/d/1UWJE7eYWiMuZewBKS0YmdVO2LUTqXPd6-pbOCof9ddY/edit?disco=AAAADZaGGfs >>> > > > > > > > > > > >> > >>> > > > > > > > > > > >> > Aljoscha Krettek <aljos...@apache.org> >>> > 于2019年8月16日周五 >>> > > > > > 下午9:20写道: >>> > > > > > > > > > > >> > >>> > > > > > > > > > > >> >> Hi, >>> > > > > > > > > > > >> >> >>> > > > > > > > > > > >> >> I read both Jeffs initial design document and the >>> > newer >>> > > > > > > > document >>> > > > > > > > > by >>> > > > > > > > > > > >> >> Tison. I also finally found the time to collect >>> > > > > > > > > > > >> >> our >>> > > > > > thoughts on >>> > > > > > > > > the >>> > > > > > > > > > > >> issue, >>> > > > > > > > > > > >> >> I had quite some discussions with Kostas and this >>> > is >>> > > > the >>> > > > > > > > result: >>> > > > > > > > > > [1]. >>> > > > > > > > > > > >> >> >>> > > > > > > > > > > >> >> I think overall we agree that this part of the >>> > code is >>> > > > in >>> > > > > > dire >>> > > > > > > > > need >>> > > > > > > > > > > of >>> > > > > > > > > > > >> >> some refactoring/improvements but I think there >>> > > > > > > > > > > >> >> are >>> > > > still >>> > > > > > some >>> > > > > > > > > open >>> > > > > > > > > > > >> >> questions and some differences in opinion what >>> > those >>> > > > > > > > refactorings >>> > > > > > > > > > > >> should >>> > > > > > > > > > > >> >> look like. >>> > > > > > > > > > > >> >> >>> > > > > > > > > > > >> >> I think the API-side is quite clear, i.e. we need >>> > some >>> > > > > > > > JobClient >>> > > > > > > > > > API >>> > > > > > > > > > > >> that >>> > > > > > > > > > > >> >> allows interacting with a running Job. It could be >>> > > > > > worthwhile >>> > > > > > > > to >>> > > > > > > > > > spin >>> > > > > > > > > > > >> that >>> > > > > > > > > > > >> >> off into a separate FLIP because we can probably >>> > find >>> > > > > > consensus >>> > > > > > > > > on >>> > > > > > > > > > > that >>> > > > > > > > > > > >> >> part more easily. >>> > > > > > > > > > > >> >> >>> > > > > > > > > > > >> >> For the rest, the main open questions from our doc >>> > are >>> > > > > > these: >>> > > > > > > > > > > >> >> >>> > > > > > > > > > > >> >> - Do we want to separate cluster creation and >>> > > > > > > > > > > >> >> job >>> > > > > > submission >>> > > > > > > > > for >>> > > > > > > > > > > >> >> per-job mode? In the past, there were conscious >>> > efforts >>> > > > > to >>> > > > > > > > *not* >>> > > > > > > > > > > >> separate >>> > > > > > > > > > > >> >> job submission from cluster creation for per-job >>> > > > clusters >>> > > > > > for >>> > > > > > > > > > Mesos, >>> > > > > > > > > > > >> YARN, >>> > > > > > > > > > > >> >> Kubernets (see StandaloneJobClusterEntryPoint). >>> > Tison >>> > > > > > suggests >>> > > > > > > > in >>> > > > > > > > > > his >>> > > > > > > > > > > >> >> design document to decouple this in order to unify >>> > job >>> > > > > > > > > submission. >>> > > > > > > > > > > >> >> >>> > > > > > > > > > > >> >> - How to deal with plan preview, which needs to >>> > > > hijack >>> > > > > > > > > execute() >>> > > > > > > > > > > and >>> > > > > > > > > > > >> >> let the outside code catch an exception? >>> > > > > > > > > > > >> >> >>> > > > > > > > > > > >> >> - How to deal with Jar Submission at the Web >>> > > > Frontend, >>> > > > > > which >>> > > > > > > > > > needs >>> > > > > > > > > > > to >>> > > > > > > > > > > >> >> hijack execute() and let the outside code catch an >>> > > > > > exception? >>> > > > > > > > > > > >> >> CliFrontend.run() “hijacks” >>> > > > > ExecutionEnvironment.execute() >>> > > > > > to >>> > > > > > > > > get a >>> > > > > > > > > > > >> >> JobGraph and then execute that JobGraph manually. >>> > We >>> > > > > could >>> > > > > > get >>> > > > > > > > > > around >>> > > > > > > > > > > >> that >>> > > > > > > > > > > >> >> by letting execute() do the actual execution. One >>> > > > caveat >>> > > > > > for >>> > > > > > > > this >>> > > > > > > > > > is >>> > > > > > > > > > > >> that >>> > > > > > > > > > > >> >> now the main() method doesn’t return (or is forced >>> > to >>> > > > > > return by >>> > > > > > > > > > > >> throwing an >>> > > > > > > > > > > >> >> exception from execute()) which means that for Jar >>> > > > > > Submission >>> > > > > > > > > from >>> > > > > > > > > > > the >>> > > > > > > > > > > >> >> WebFrontend we have a long-running main() method >>> > > > running >>> > > > > > in the >>> > > > > > > > > > > >> >> WebFrontend. This doesn’t sound very good. We >>> > could get >>> > > > > > around >>> > > > > > > > > this >>> > > > > > > > > > > by >>> > > > > > > > > > > >> >> removing the plan preview feature and by removing >>> > Jar >>> > > > > > > > > > > >> Submission/Running. >>> > > > > > > > > > > >> >> >>> > > > > > > > > > > >> >> - How to deal with detached mode? Right now, >>> > > > > > > > > DetachedEnvironment >>> > > > > > > > > > > will >>> > > > > > > > > > > >> >> execute the job and return immediately. If users >>> > > > control >>> > > > > > when >>> > > > > > > > > they >>> > > > > > > > > > > >> want to >>> > > > > > > > > > > >> >> return, by waiting on the job completion future, >>> > how do >>> > > > > we >>> > > > > > deal >>> > > > > > > > > > with >>> > > > > > > > > > > >> this? >>> > > > > > > > > > > >> >> Do we simply remove the distinction between >>> > > > > > > > > detached/non-detached? >>> > > > > > > > > > > >> >> >>> > > > > > > > > > > >> >> - How does per-job mode interact with >>> > “interactive >>> > > > > > > > programming” >>> > > > > > > > > > > >> >> (FLIP-36). For YARN, each execute() call could >>> > spawn a >>> > > > > new >>> > > > > > > > Flink >>> > > > > > > > > > YARN >>> > > > > > > > > > > >> >> cluster. What about Mesos and Kubernetes? >>> > > > > > > > > > > >> >> >>> > > > > > > > > > > >> >> The first open question is where the opinions >>> > diverge, >>> > > > I >>> > > > > > think. >>> > > > > > > > > The >>> > > > > > > > > > > >> rest >>> > > > > > > > > > > >> >> are just open questions and interesting things >>> > that we >>> > > > > > need to >>> > > > > > > > > > > >> consider. >>> > > > > > > > > > > >> >> >>> > > > > > > > > > > >> >> Best, >>> > > > > > > > > > > >> >> Aljoscha >>> > > > > > > > > > > >> >> >>> > > > > > > > > > > >> >> [1] >>> > > > > > > > > > > >> >> >>> > > > > > > > > > > >> >>> > > > > > > > > > > >>> > > > > > > > > > >>> > > > > > > > > >>> > > > > > > > >>> > > > > > >>> > > > > >>> > > > >>> > https://docs.google.com/document/d/1E-8UjOLz4QPUTxetGWbU23OlsIH9VIdodpTsxwoQTs0/edit#heading=h.na7k0ad88tix >>> > > > > > > > > > > >> >> < >>> > > > > > > > > > > >> >> >>> > > > > > > > > > > >> >>> > > > > > > > > > > >>> > > > > > > > > > >>> > > > > > > > > >>> > > > > > > > >>> > > > > > >>> > > > > >>> > > > >>> > https://docs.google.com/document/d/1E-8UjOLz4QPUTxetGWbU23OlsIH9VIdodpTsxwoQTs0/edit#heading=h.na7k0ad88tix >>> > > > > > > > > > > >> >> > >>> > > > > > > > > > > >> >> >>> > > > > > > > > > > >> >> > On 31. Jul 2019, at 15:23, Jeff Zhang < >>> > > > > zjf...@gmail.com> >>> > > > > > > > > wrote: >>> > > > > > > > > > > >> >> > >>> > > > > > > > > > > >> >> > Thanks tison for the effort. I left a few >>> > comments. >>> > > > > > > > > > > >> >> > >>> > > > > > > > > > > >> >> > >>> > > > > > > > > > > >> >> > Zili Chen <wander4...@gmail.com> 于2019年7月31日周三 >>> > > > > 下午8:24写道: >>> > > > > > > > > > > >> >> > >>> > > > > > > > > > > >> >> >> Hi Flavio, >>> > > > > > > > > > > >> >> >> >>> > > > > > > > > > > >> >> >> Thanks for your reply. >>> > > > > > > > > > > >> >> >> >>> > > > > > > > > > > >> >> >> Either current impl and in the design, >>> > ClusterClient >>> > > > > > > > > > > >> >> >> never takes responsibility for generating >>> > JobGraph. >>> > > > > > > > > > > >> >> >> (what you see in current codebase is several >>> > class >>> > > > > > methods) >>> > > > > > > > > > > >> >> >> >>> > > > > > > > > > > >> >> >> Instead, user describes his program in the main >>> > > > method >>> > > > > > > > > > > >> >> >> with ExecutionEnvironment apis and calls >>> > > > env.compile() >>> > > > > > > > > > > >> >> >> or env.optimize() to get FlinkPlan and JobGraph >>> > > > > > > > respectively. >>> > > > > > > > > > > >> >> >> >>> > > > > > > > > > > >> >> >> For listing main classes in a jar and choose >>> > one for >>> > > > > > > > > > > >> >> >> submission, you're now able to customize a CLI >>> > to do >>> > > > > it. >>> > > > > > > > > > > >> >> >> Specifically, the path of jar is passed as >>> > arguments >>> > > > > and >>> > > > > > > > > > > >> >> >> in the customized CLI you list main classes, >>> > choose >>> > > > > one >>> > > > > > > > > > > >> >> >> to submit to the cluster. >>> > > > > > > > > > > >> >> >> >>> > > > > > > > > > > >> >> >> Best, >>> > > > > > > > > > > >> >> >> tison. >>> > > > > > > > > > > >> >> >> >>> > > > > > > > > > > >> >> >> >>> > > > > > > > > > > >> >> >> Flavio Pompermaier <pomperma...@okkam.it> >>> > > > > 于2019年7月31日周三 >>> > > > > > > > > > 下午8:12写道: >>> > > > > > > > > > > >> >> >> >>> > > > > > > > > > > >> >> >>> Just one note on my side: it is not clear to >>> > > > > > > > > > > >> >> >>> me >>> > > > > > whether the >>> > > > > > > > > > > client >>> > > > > > > > > > > >> >> needs >>> > > > > > > > > > > >> >> >> to >>> > > > > > > > > > > >> >> >>> be able to generate a job graph or not. >>> > > > > > > > > > > >> >> >>> In my opinion, the job jar must resides only >>> > on the >>> > > > > > > > > > > >> server/jobManager >>> > > > > > > > > > > >> >> >> side >>> > > > > > > > > > > >> >> >>> and the client requires a way to get the job >>> > graph. >>> > > > > > > > > > > >> >> >>> If you really want to access to the job graph, >>> > I'd >>> > > > > add >>> > > > > > a >>> > > > > > > > > > > dedicated >>> > > > > > > > > > > >> >> method >>> > > > > > > > > > > >> >> >>> on the ClusterClient. like: >>> > > > > > > > > > > >> >> >>> >>> > > > > > > > > > > >> >> >>> - getJobGraph(jarId, mainClass): JobGraph >>> > > > > > > > > > > >> >> >>> - listMainClasses(jarId): List<String> >>> > > > > > > > > > > >> >> >>> >>> > > > > > > > > > > >> >> >>> These would require some addition also on the >>> > job >>> > > > > > manager >>> > > > > > > > > > > endpoint >>> > > > > > > > > > > >> as >>> > > > > > > > > > > >> >> >>> well..what do you think? >>> > > > > > > > > > > >> >> >>> >>> > > > > > > > > > > >> >> >>> On Wed, Jul 31, 2019 at 12:42 PM Zili Chen < >>> > > > > > > > > > wander4...@gmail.com >>> > > > > > > > > > > > >>> > > > > > > > > > > >> >> wrote: >>> > > > > > > > > > > >> >> >>> >>> > > > > > > > > > > >> >> >>>> Hi all, >>> > > > > > > > > > > >> >> >>>> >>> > > > > > > > > > > >> >> >>>> Here is a document[1] on client api >>> > enhancement >>> > > > from >>> > > > > > our >>> > > > > > > > > > > >> perspective. >>> > > > > > > > > > > >> >> >>>> We have investigated current implementations. >>> > And >>> > > > we >>> > > > > > > > propose >>> > > > > > > > > > > >> >> >>>> >>> > > > > > > > > > > >> >> >>>> 1. Unify the implementation of cluster >>> > deployment >>> > > > > and >>> > > > > > job >>> > > > > > > > > > > >> submission >>> > > > > > > > > > > >> >> in >>> > > > > > > > > > > >> >> >>>> Flink. >>> > > > > > > > > > > >> >> >>>> 2. Provide programmatic interfaces to allow >>> > > > flexible >>> > > > > > job >>> > > > > > > > and >>> > > > > > > > > > > >> cluster >>> > > > > > > > > > > >> >> >>>> management. >>> > > > > > > > > > > >> >> >>>> >>> > > > > > > > > > > >> >> >>>> The first proposal is aimed at reducing code >>> > paths >>> > > > > of >>> > > > > > > > > cluster >>> > > > > > > > > > > >> >> >> deployment >>> > > > > > > > > > > >> >> >>>> and >>> > > > > > > > > > > >> >> >>>> job submission so that one can adopt Flink in >>> > his >>> > > > > > usage >>> > > > > > > > > > easily. >>> > > > > > > > > > > >> The >>> > > > > > > > > > > >> >> >>> second >>> > > > > > > > > > > >> >> >>>> proposal is aimed at providing rich >>> > interfaces for >>> > > > > > > > advanced >>> > > > > > > > > > > users >>> > > > > > > > > > > >> >> >>>> who want to make accurate control of these >>> > stages. >>> > > > > > > > > > > >> >> >>>> >>> > > > > > > > > > > >> >> >>>> Quick reference on open questions: >>> > > > > > > > > > > >> >> >>>> >>> > > > > > > > > > > >> >> >>>> 1. Exclude job cluster deployment from client >>> > side >>> > > > > or >>> > > > > > > > > redefine >>> > > > > > > > > > > the >>> > > > > > > > > > > >> >> >>> semantic >>> > > > > > > > > > > >> >> >>>> of job cluster? Since it fits in a process >>> > quite >>> > > > > > different >>> > > > > > > > > > from >>> > > > > > > > > > > >> >> session >>> > > > > > > > > > > >> >> >>>> cluster deployment and job submission. >>> > > > > > > > > > > >> >> >>>> >>> > > > > > > > > > > >> >> >>>> 2. Maintain the codepaths handling class >>> > > > > > > > > > > o.a.f.api.common.Program >>> > > > > > > > > > > >> or >>> > > > > > > > > > > >> >> >>>> implement customized program handling logic >>> > > > > > > > > > > >> >> >>>> by >>> > > > > > customized >>> > > > > > > > > > > >> >> CliFrontend? >>> > > > > > > > > > > >> >> >>>> See also this thread[2] and the document[1]. >>> > > > > > > > > > > >> >> >>>> >>> > > > > > > > > > > >> >> >>>> 3. Expose ClusterClient as public api or just >>> > > > expose >>> > > > > > api >>> > > > > > > > in >>> > > > > > > > > > > >> >> >>>> ExecutionEnvironment >>> > > > > > > > > > > >> >> >>>> and delegate them to ClusterClient? Further, >>> > in >>> > > > > > either way >>> > > > > > > > > is >>> > > > > > > > > > it >>> > > > > > > > > > > >> >> worth >>> > > > > > > > > > > >> >> >> to >>> > > > > > > > > > > >> >> >>>> introduce a JobClient which is an >>> > encapsulation of >>> > > > > > > > > > ClusterClient >>> > > > > > > > > > > >> that >>> > > > > > > > > > > >> >> >>>> associated to specific job? >>> > > > > > > > > > > >> >> >>>> >>> > > > > > > > > > > >> >> >>>> Best, >>> > > > > > > > > > > >> >> >>>> tison. >>> > > > > > > > > > > >> >> >>>> >>> > > > > > > > > > > >> >> >>>> [1] >>> > > > > > > > > > > >> >> >>>> >>> > > > > > > > > > > >> >> >>>> >>> > > > > > > > > > > >> >> >>> >>> > > > > > > > > > > >> >> >> >>> > > > > > > > > > > >> >> >>> > > > > > > > > > > >> >>> > > > > > > > > > > >>> > > > > > > > > > >>> > > > > > > > > >>> > > > > > > > >>> > > > > > >>> > > > > >>> > > > >>> > https://docs.google.com/document/d/1UWJE7eYWiMuZewBKS0YmdVO2LUTqXPd6-pbOCof9ddY/edit?usp=sharing >>> > > > > > > > > > > >> >> >>>> [2] >>> > > > > > > > > > > >> >> >>>> >>> > > > > > > > > > > >> >> >>>> >>> > > > > > > > > > > >> >> >>> >>> > > > > > > > > > > >> >> >> >>> > > > > > > > > > > >> >> >>> > > > > > > > > > > >> >>> > > > > > > > > > > >>> > > > > > > > > > >>> > > > > > > > > >>> > > > > > > > >>> > > > > > >>> > > > > >>> > > > >>> > https://lists.apache.org/thread.html/7ffc9936a384b891dbcf0a481d26c6d13b2125607c200577780d1e18@%3Cdev.flink.apache.org%3E >>> > > > > > > > > > > >> >> >>>> >>> > > > > > > > > > > >> >> >>>> Jeff Zhang <zjf...@gmail.com> 于2019年7月24日周三 >>> > > > > 上午9:19写道: >>> > > > > > > > > > > >> >> >>>> >>> > > > > > > > > > > >> >> >>>>> Thanks Stephan, I will follow up this issue >>> > in >>> > > > next >>> > > > > > few >>> > > > > > > > > > weeks, >>> > > > > > > > > > > >> and >>> > > > > > > > > > > >> >> >> will >>> > > > > > > > > > > >> >> >>>>> refine the design doc. We could discuss more >>> > > > > details >>> > > > > > > > after >>> > > > > > > > > > 1.9 >>> > > > > > > > > > > >> >> >> release. >>> > > > > > > > > > > >> >> >>>>> >>> > > > > > > > > > > >> >> >>>>> Stephan Ewen <se...@apache.org> >>> > 于2019年7月24日周三 >>> > > > > > 上午12:58写道: >>> > > > > > > > > > > >> >> >>>>> >>> > > > > > > > > > > >> >> >>>>>> Hi all! >>> > > > > > > > > > > >> >> >>>>>> >>> > > > > > > > > > > >> >> >>>>>> This thread has stalled for a bit, which I >>> > > > assume >>> > > > > > ist >>> > > > > > > > > mostly >>> > > > > > > > > > > >> due to >>> > > > > > > > > > > >> >> >>> the >>> > > > > > > > > > > >> >> >>>>>> Flink 1.9 feature freeze and release >>> > > > > > > > > > > >> >> >>>>>> testing >>> > > > > effort. >>> > > > > > > > > > > >> >> >>>>>> >>> > > > > > > > > > > >> >> >>>>>> I personally still recognize this issue as >>> > one >>> > > > > > important >>> > > > > > > > > to >>> > > > > > > > > > be >>> > > > > > > > > > > >> >> >>> solved. >>> > > > > > > > > > > >> >> >>>>> I'd >>> > > > > > > > > > > >> >> >>>>>> be happy to help resume this discussion >>> > > > > > > > > > > >> >> >>>>>> soon >>> > > > > (after >>> > > > > > the >>> > > > > > > > > 1.9 >>> > > > > > > > > > > >> >> >> release) >>> > > > > > > > > > > >> >> >>>> and >>> > > > > > > > > > > >> >> >>>>>> see if we can do some step towards this in >>> > Flink >>> > > > > > 1.10. >>> > > > > > > > > > > >> >> >>>>>> >>> > > > > > > > > > > >> >> >>>>>> Best, >>> > > > > > > > > > > >> >> >>>>>> Stephan >>> > > > > > > > > > > >> >> >>>>>> >>> > > > > > > > > > > >> >> >>>>>> >>> > > > > > > > > > > >> >> >>>>>> >>> > > > > > > > > > > >> >> >>>>>> On Mon, Jun 24, 2019 at 10:41 AM Flavio >>> > > > > Pompermaier >>> > > > > > < >>> > > > > > > > > > > >> >> >>>>> pomperma...@okkam.it> >>> > > > > > > > > > > >> >> >>>>>> wrote: >>> > > > > > > > > > > >> >> >>>>>> >>> > > > > > > > > > > >> >> >>>>>>> That's exactly what I suggested a long >>> > > > > > > > > > > >> >> >>>>>>> time >>> > > > ago: >>> > > > > > the >>> > > > > > > > > Flink >>> > > > > > > > > > > REST >>> > > > > > > > > > > >> >> >>>> client >>> > > > > > > > > > > >> >> >>>>>>> should not require any Flink dependency, >>> > only >>> > > > > http >>> > > > > > > > > library >>> > > > > > > > > > to >>> > > > > > > > > > > >> >> >> call >>> > > > > > > > > > > >> >> >>>> the >>> > > > > > > > > > > >> >> >>>>>> REST >>> > > > > > > > > > > >> >> >>>>>>> services to submit and monitor a job. >>> > > > > > > > > > > >> >> >>>>>>> What I suggested also in [1] was to have a >>> > way >>> > > > to >>> > > > > > > > > > > automatically >>> > > > > > > > > > > >> >> >>>> suggest >>> > > > > > > > > > > >> >> >>>>>> the >>> > > > > > > > > > > >> >> >>>>>>> user (via a UI) the available main classes >>> > and >>> > > > > > their >>> > > > > > > > > > required >>> > > > > > > > > > > >> >> >>>>>>> parameters[2]. >>> > > > > > > > > > > >> >> >>>>>>> Another problem we have with Flink is that >>> > the >>> > > > > Rest >>> > > > > > > > > client >>> > > > > > > > > > > and >>> > > > > > > > > > > >> >> >> the >>> > > > > > > > > > > >> >> >>>> CLI >>> > > > > > > > > > > >> >> >>>>>> one >>> > > > > > > > > > > >> >> >>>>>>> behaves differently and we use the CLI >>> > client >>> > > > > (via >>> > > > > > ssh) >>> > > > > > > > > > > because >>> > > > > > > > > > > >> >> >> it >>> > > > > > > > > > > >> >> >>>>> allows >>> > > > > > > > > > > >> >> >>>>>>> to call some other method after >>> > env.execute() >>> > > > [3] >>> > > > > > (we >>> > > > > > > > > have >>> > > > > > > > > > to >>> > > > > > > > > > > >> >> >> call >>> > > > > > > > > > > >> >> >>>>>> another >>> > > > > > > > > > > >> >> >>>>>>> REST service to signal the end of the >>> > > > > > > > > > > >> >> >>>>>>> job). >>> > > > > > > > > > > >> >> >>>>>>> Int his regard, a dedicated interface, >>> > like the >>> > > > > > > > > JobListener >>> > > > > > > > > > > >> >> >>> suggested >>> > > > > > > > > > > >> >> >>>>> in >>> > > > > > > > > > > >> >> >>>>>>> the previous emails, would be very helpful >>> > > > > (IMHO). >>> > > > > > > > > > > >> >> >>>>>>> >>> > > > > > > > > > > >> >> >>>>>>> [1] >>> > > > > > https://issues.apache.org/jira/browse/FLINK-10864 >>> > > > > > > > > > > >> >> >>>>>>> [2] >>> > > > > > https://issues.apache.org/jira/browse/FLINK-10862 >>> > > > > > > > > > > >> >> >>>>>>> [3] >>> > > > > > https://issues.apache.org/jira/browse/FLINK-10879 >>> > > > > > > > > > > >> >> >>>>>>> >>> > > > > > > > > > > >> >> >>>>>>> Best, >>> > > > > > > > > > > >> >> >>>>>>> Flavio >>> > > > > > > > > > > >> >> >>>>>>> >>> > > > > > > > > > > >> >> >>>>>>> On Mon, Jun 24, 2019 at 9:54 AM Jeff Zhang >>> > < >>> > > > > > > > > > zjf...@gmail.com >>> > > > > > > > > > > > >>> > > > > > > > > > > >> >> >>> wrote: >>> > > > > > > > > > > >> >> >>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>> Hi, Tison, >>> > > > > > > > > > > >> >> >>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>> Thanks for your comments. Overall I agree >>> > with >>> > > > > you >>> > > > > > > > that >>> > > > > > > > > it >>> > > > > > > > > > > is >>> > > > > > > > > > > >> >> >>>>> difficult >>> > > > > > > > > > > >> >> >>>>>>> for >>> > > > > > > > > > > >> >> >>>>>>>> down stream project to integrate with >>> > flink >>> > > > and >>> > > > > we >>> > > > > > > > need >>> > > > > > > > > to >>> > > > > > > > > > > >> >> >>> refactor >>> > > > > > > > > > > >> >> >>>>> the >>> > > > > > > > > > > >> >> >>>>>>>> current flink client api. >>> > > > > > > > > > > >> >> >>>>>>>> And I agree that CliFrontend should only >>> > > > parsing >>> > > > > > > > command >>> > > > > > > > > > > line >>> > > > > > > > > > > >> >> >>>>> arguments >>> > > > > > > > > > > >> >> >>>>>>> and >>> > > > > > > > > > > >> >> >>>>>>>> then pass them to ExecutionEnvironment. >>> > It is >>> > > > > > > > > > > >> >> >>>> ExecutionEnvironment's >>> > > > > > > > > > > >> >> >>>>>>>> responsibility to compile job, create >>> > cluster, >>> > > > > and >>> > > > > > > > > submit >>> > > > > > > > > > > job. >>> > > > > > > > > > > >> >> >>>>> Besides >>> > > > > > > > > > > >> >> >>>>>>>> that, Currently flink has many >>> > > > > > ExecutionEnvironment >>> > > > > > > > > > > >> >> >>>> implementations, >>> > > > > > > > > > > >> >> >>>>>> and >>> > > > > > > > > > > >> >> >>>>>>>> flink will use the specific one based on >>> > the >>> > > > > > context. >>> > > > > > > > > > IMHO, >>> > > > > > > > > > > it >>> > > > > > > > > > > >> >> >> is >>> > > > > > > > > > > >> >> >>>> not >>> > > > > > > > > > > >> >> >>>>>>>> necessary, ExecutionEnvironment should be >>> > able >>> > > > > to >>> > > > > > do >>> > > > > > > > the >>> > > > > > > > > > > right >>> > > > > > > > > > > >> >> >>>> thing >>> > > > > > > > > > > >> >> >>>>>>> based >>> > > > > > > > > > > >> >> >>>>>>>> on the FlinkConf it is received. Too many >>> > > > > > > > > > > ExecutionEnvironment >>> > > > > > > > > > > >> >> >>>>>>>> implementation is another burden for >>> > > > downstream >>> > > > > > > > project >>> > > > > > > > > > > >> >> >>>> integration. >>> > > > > > > > > > > >> >> >>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>> One thing I'd like to mention is flink's >>> > scala >>> > > > > > shell >>> > > > > > > > and >>> > > > > > > > > > sql >>> > > > > > > > > > > >> >> >>>> client, >>> > > > > > > > > > > >> >> >>>>>>>> although they are sub-modules of flink, >>> > they >>> > > > > > could be >>> > > > > > > > > > > treated >>> > > > > > > > > > > >> >> >> as >>> > > > > > > > > > > >> >> >>>>>>> downstream >>> > > > > > > > > > > >> >> >>>>>>>> project which use flink's client api. >>> > > > Currently >>> > > > > > you >>> > > > > > > > will >>> > > > > > > > > > > find >>> > > > > > > > > > > >> >> >> it >>> > > > > > > > > > > >> >> >>> is >>> > > > > > > > > > > >> >> >>>>> not >>> > > > > > > > > > > >> >> >>>>>>>> easy for them to integrate with flink, >>> > they >>> > > > > share >>> > > > > > many >>> > > > > > > > > > > >> >> >> duplicated >>> > > > > > > > > > > >> >> >>>>> code. >>> > > > > > > > > > > >> >> >>>>>>> It >>> > > > > > > > > > > >> >> >>>>>>>> is another sign that we should refactor >>> > flink >>> > > > > > client >>> > > > > > > > > api. >>> > > > > > > > > > > >> >> >>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>> I believe it is a large and hard change, >>> > and I >>> > > > > am >>> > > > > > > > afraid >>> > > > > > > > > > we >>> > > > > > > > > > > >> can >>> > > > > > > > > > > >> >> >>> not >>> > > > > > > > > > > >> >> >>>>>> keep >>> > > > > > > > > > > >> >> >>>>>>>> compatibility since many of changes are >>> > user >>> > > > > > facing. >>> > > > > > > > > > > >> >> >>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>> Zili Chen <wander4...@gmail.com> >>> > > > 于2019年6月24日周一 >>> > > > > > > > > 下午2:53写道: >>> > > > > > > > > > > >> >> >>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>> Hi all, >>> > > > > > > > > > > >> >> >>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>> After a closer look on our client apis, >>> > I can >>> > > > > see >>> > > > > > > > there >>> > > > > > > > > > are >>> > > > > > > > > > > >> >> >> two >>> > > > > > > > > > > >> >> >>>>> major >>> > > > > > > > > > > >> >> >>>>>>>>> issues to consistency and integration, >>> > namely >>> > > > > > > > different >>> > > > > > > > > > > >> >> >>>> deployment >>> > > > > > > > > > > >> >> >>>>> of >>> > > > > > > > > > > >> >> >>>>>>>>> job cluster which couples job graph >>> > creation >>> > > > > and >>> > > > > > > > > cluster >>> > > > > > > > > > > >> >> >>>>> deployment, >>> > > > > > > > > > > >> >> >>>>>>>>> and submission via CliFrontend confusing >>> > > > > control >>> > > > > > flow >>> > > > > > > > > of >>> > > > > > > > > > > job >>> > > > > > > > > > > >> >> >>>> graph >>> > > > > > > > > > > >> >> >>>>>>>>> compilation and job submission. I'd like >>> > to >>> > > > > > follow >>> > > > > > > > the >>> > > > > > > > > > > >> >> >> discuss >>> > > > > > > > > > > >> >> >>>>> above, >>> > > > > > > > > > > >> >> >>>>>>>>> mainly the process described by Jeff and >>> > > > > > Stephan, and >>> > > > > > > > > > share >>> > > > > > > > > > > >> >> >> my >>> > > > > > > > > > > >> >> >>>>>>>>> ideas on these issues. >>> > > > > > > > > > > >> >> >>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>> 1) CliFrontend confuses the control flow >>> > of >>> > > > job >>> > > > > > > > > > compilation >>> > > > > > > > > > > >> >> >> and >>> > > > > > > > > > > >> >> >>>>>>>> submission. >>> > > > > > > > > > > >> >> >>>>>>>>> Following the process of job submission >>> > > > Stephan >>> > > > > > and >>> > > > > > > > > Jeff >>> > > > > > > > > > > >> >> >>>> described, >>> > > > > > > > > > > >> >> >>>>>>>>> execution environment knows all configs >>> > of >>> > > > the >>> > > > > > > > cluster >>> > > > > > > > > > and >>> > > > > > > > > > > >> >> >>>>>>> topos/settings >>> > > > > > > > > > > >> >> >>>>>>>>> of the job. Ideally, in the main method >>> > of >>> > > > user >>> > > > > > > > > program, >>> > > > > > > > > > it >>> > > > > > > > > > > >> >> >>> calls >>> > > > > > > > > > > >> >> >>>>>>>> #execute >>> > > > > > > > > > > >> >> >>>>>>>>> (or named #submit) and Flink deploys the >>> > > > > cluster, >>> > > > > > > > > compile >>> > > > > > > > > > > the >>> > > > > > > > > > > >> >> >>> job >>> > > > > > > > > > > >> >> >>>>>> graph >>> > > > > > > > > > > >> >> >>>>>>>>> and submit it to the cluster. However, >>> > > > current >>> > > > > > > > > > CliFrontend >>> > > > > > > > > > > >> >> >> does >>> > > > > > > > > > > >> >> >>>> all >>> > > > > > > > > > > >> >> >>>>>>> these >>> > > > > > > > > > > >> >> >>>>>>>>> things inside its #runProgram method, >>> > which >>> > > > > > > > introduces >>> > > > > > > > > a >>> > > > > > > > > > > lot >>> > > > > > > > > > > >> >> >> of >>> > > > > > > > > > > >> >> >>>>>>>> subclasses >>> > > > > > > > > > > >> >> >>>>>>>>> of (stream) execution environment. >>> > > > > > > > > > > >> >> >>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>> Actually, it sets up an exec env that >>> > hijacks >>> > > > > the >>> > > > > > > > > > > >> >> >>>>>> #execute/executePlan >>> > > > > > > > > > > >> >> >>>>>>>>> method, initializes the job graph and >>> > abort >>> > > > > > > > execution. >>> > > > > > > > > > And >>> > > > > > > > > > > >> >> >> then >>> > > > > > > > > > > >> >> >>>>>>>>> control flow back to CliFrontend, it >>> > deploys >>> > > > > the >>> > > > > > > > > > cluster(or >>> > > > > > > > > > > >> >> >>>>> retrieve >>> > > > > > > > > > > >> >> >>>>>>>>> the client) and submits the job graph. >>> > This >>> > > > is >>> > > > > > quite >>> > > > > > > > a >>> > > > > > > > > > > >> >> >> specific >>> > > > > > > > > > > >> >> >>>>>>> internal >>> > > > > > > > > > > >> >> >>>>>>>>> process inside Flink and none of >>> > consistency >>> > > > to >>> > > > > > > > > anything. >>> > > > > > > > > > > >> >> >>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>> 2) Deployment of job cluster couples job >>> > > > graph >>> > > > > > > > creation >>> > > > > > > > > > and >>> > > > > > > > > > > >> >> >>>> cluster >>> > > > > > > > > > > >> >> >>>>>>>>> deployment. Abstractly, from user job to >>> > a >>> > > > > > concrete >>> > > > > > > > > > > >> >> >> submission, >>> > > > > > > > > > > >> >> >>>> it >>> > > > > > > > > > > >> >> >>>>>>>> requires >>> > > > > > > > > > > >> >> >>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>> create JobGraph --\ >>> > > > > > > > > > > >> >> >>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>> create ClusterClient --> submit >>> > > > > > > > > > > >> >> >>>>>>>>> JobGraph >>> > > > > > > > > > > >> >> >>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>> such a dependency. ClusterClient was >>> > created >>> > > > by >>> > > > > > > > > deploying >>> > > > > > > > > > > or >>> > > > > > > > > > > >> >> >>>>>>> retrieving. >>> > > > > > > > > > > >> >> >>>>>>>>> JobGraph submission requires a compiled >>> > > > > JobGraph >>> > > > > > and >>> > > > > > > > > > valid >>> > > > > > > > > > > >> >> >>>>>>> ClusterClient, >>> > > > > > > > > > > >> >> >>>>>>>>> but the creation of ClusterClient is >>> > > > abstractly >>> > > > > > > > > > independent >>> > > > > > > > > > > >> >> >> of >>> > > > > > > > > > > >> >> >>>> that >>> > > > > > > > > > > >> >> >>>>>> of >>> > > > > > > > > > > >> >> >>>>>>>>> JobGraph. However, in job cluster mode, >>> > we >>> > > > > > deploy job >>> > > > > > > > > > > cluster >>> > > > > > > > > > > >> >> >>>> with >>> > > > > > > > > > > >> >> >>>>> a >>> > > > > > > > > > > >> >> >>>>>>> job >>> > > > > > > > > > > >> >> >>>>>>>>> graph, which means we use another >>> > process: >>> > > > > > > > > > > >> >> >>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>> create JobGraph --> deploy cluster with >>> > the >>> > > > > > JobGraph >>> > > > > > > > > > > >> >> >>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>> Here is another inconsistency and >>> > downstream >>> > > > > > > > > > > projects/client >>> > > > > > > > > > > >> >> >>> apis >>> > > > > > > > > > > >> >> >>>>> are >>> > > > > > > > > > > >> >> >>>>>>>>> forced to handle different cases with >>> > rare >>> > > > > > supports >>> > > > > > > > > from >>> > > > > > > > > > > >> >> >> Flink. >>> > > > > > > > > > > >> >> >>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>> Since we likely reached a consensus on >>> > > > > > > > > > > >> >> >>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>> 1. all configs gathered by Flink >>> > > > configuration >>> > > > > > and >>> > > > > > > > > passed >>> > > > > > > > > > > >> >> >>>>>>>>> 2. execution environment knows all >>> > configs >>> > > > and >>> > > > > > > > handles >>> > > > > > > > > > > >> >> >>>>> execution(both >>> > > > > > > > > > > >> >> >>>>>>>>> deployment and submission) >>> > > > > > > > > > > >> >> >>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>> to the issues above I propose >>> > > > > > > > > > > >> >> >>>>>>>>> eliminating >>> > > > > > > > > inconsistencies >>> > > > > > > > > > > by >>> > > > > > > > > > > >> >> >>>>>> following >>> > > > > > > > > > > >> >> >>>>>>>>> approach: >>> > > > > > > > > > > >> >> >>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>> 1) CliFrontend should exactly be a front >>> > end, >>> > > > > at >>> > > > > > > > least >>> > > > > > > > > > for >>> > > > > > > > > > > >> >> >>> "run" >>> > > > > > > > > > > >> >> >>>>>>> command. >>> > > > > > > > > > > >> >> >>>>>>>>> That means it just gathered and passed >>> > all >>> > > > > config >>> > > > > > > > from >>> > > > > > > > > > > >> >> >> command >>> > > > > > > > > > > >> >> >>>> line >>> > > > > > > > > > > >> >> >>>>>> to >>> > > > > > > > > > > >> >> >>>>>>>>> the main method of user program. >>> > Execution >>> > > > > > > > environment >>> > > > > > > > > > > knows >>> > > > > > > > > > > >> >> >>> all >>> > > > > > > > > > > >> >> >>>>> the >>> > > > > > > > > > > >> >> >>>>>>> info >>> > > > > > > > > > > >> >> >>>>>>>>> and with an addition to utils for >>> > > > > ClusterClient, >>> > > > > > we >>> > > > > > > > > > > >> >> >> gracefully >>> > > > > > > > > > > >> >> >>>> get >>> > > > > > > > > > > >> >> >>>>> a >>> > > > > > > > > > > >> >> >>>>>>>>> ClusterClient by deploying or >>> > retrieving. In >>> > > > > this >>> > > > > > > > way, >>> > > > > > > > > we >>> > > > > > > > > > > >> >> >> don't >>> > > > > > > > > > > >> >> >>>>> need >>> > > > > > > > > > > >> >> >>>>>> to >>> > > > > > > > > > > >> >> >>>>>>>>> hijack #execute/executePlan methods and >>> > can >>> > > > > > remove >>> > > > > > > > > > various >>> > > > > > > > > > > >> >> >>>> hacking >>> > > > > > > > > > > >> >> >>>>>>>>> subclasses of exec env, as well as #run >>> > > > methods >>> > > > > > in >>> > > > > > > > > > > >> >> >>>>> ClusterClient(for >>> > > > > > > > > > > >> >> >>>>>> an >>> > > > > > > > > > > >> >> >>>>>>>>> interface-ized ClusterClient). Now the >>> > > > control >>> > > > > > flow >>> > > > > > > > > flows >>> > > > > > > > > > > >> >> >> from >>> > > > > > > > > > > >> >> >>>>>>>> CliFrontend >>> > > > > > > > > > > >> >> >>>>>>>>> to the main method and never returns. >>> > > > > > > > > > > >> >> >>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>> 2) Job cluster means a cluster for the >>> > > > specific >>> > > > > > job. >>> > > > > > > > > From >>> > > > > > > > > > > >> >> >>> another >>> > > > > > > > > > > >> >> >>>>>>>>> perspective, it is an ephemeral session. >>> > We >>> > > > may >>> > > > > > > > > decouple >>> > > > > > > > > > > the >>> > > > > > > > > > > >> >> >>>>>> deployment >>> > > > > > > > > > > >> >> >>>>>>>>> with a compiled job graph, but start a >>> > > > session >>> > > > > > with >>> > > > > > > > > idle >>> > > > > > > > > > > >> >> >>> timeout >>> > > > > > > > > > > >> >> >>>>>>>>> and submit the job following. >>> > > > > > > > > > > >> >> >>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>> These topics, before we go into more >>> > details >>> > > > on >>> > > > > > > > design >>> > > > > > > > > or >>> > > > > > > > > > > >> >> >>>>>>> implementation, >>> > > > > > > > > > > >> >> >>>>>>>>> are better to be aware and discussed for >>> > a >>> > > > > > consensus. >>> > > > > > > > > > > >> >> >>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>> Best, >>> > > > > > > > > > > >> >> >>>>>>>>> tison. >>> > > > > > > > > > > >> >> >>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>> Zili Chen <wander4...@gmail.com> >>> > > > 于2019年6月20日周四 >>> > > > > > > > > 上午3:21写道: >>> > > > > > > > > > > >> >> >>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>> Hi Jeff, >>> > > > > > > > > > > >> >> >>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>> Thanks for raising this thread and the >>> > > > design >>> > > > > > > > > document! >>> > > > > > > > > > > >> >> >>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>> As @Thomas Weise mentioned above, >>> > extending >>> > > > > > config >>> > > > > > > > to >>> > > > > > > > > > > flink >>> > > > > > > > > > > >> >> >>>>>>>>>> requires far more effort than it should >>> > be. >>> > > > > > Another >>> > > > > > > > > > > example >>> > > > > > > > > > > >> >> >>>>>>>>>> is we achieve detach mode by introduce >>> > > > another >>> > > > > > > > > execution >>> > > > > > > > > > > >> >> >>>>>>>>>> environment which also hijack #execute >>> > > > method. >>> > > > > > > > > > > >> >> >>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>> I agree with your idea that user would >>> > > > > > configure all >>> > > > > > > > > > > things >>> > > > > > > > > > > >> >> >>>>>>>>>> and flink "just" respect it. On this >>> > topic I >>> > > > > > think >>> > > > > > > > the >>> > > > > > > > > > > >> >> >> unusual >>> > > > > > > > > > > >> >> >>>>>>>>>> control flow when CliFrontend handle >>> > "run" >>> > > > > > command >>> > > > > > > > is >>> > > > > > > > > > the >>> > > > > > > > > > > >> >> >>>> problem. >>> > > > > > > > > > > >> >> >>>>>>>>>> It handles several configs, mainly >>> > > > > > > > > > > >> >> >>>>>>>>>> about >>> > > > > cluster >>> > > > > > > > > > settings, >>> > > > > > > > > > > >> >> >> and >>> > > > > > > > > > > >> >> >>>>>>>>>> thus main method of user program is >>> > unaware >>> > > > of >>> > > > > > them. >>> > > > > > > > > > Also >>> > > > > > > > > > > it >>> > > > > > > > > > > >> >> >>>>>> compiles >>> > > > > > > > > > > >> >> >>>>>>>>>> app to job graph by run the main method >>> > > > with a >>> > > > > > > > > hijacked >>> > > > > > > > > > > exec >>> > > > > > > > > > > >> >> >>>> env, >>> > > > > > > > > > > >> >> >>>>>>>>>> which constrain the main method >>> > > > > > > > > > > >> >> >>>>>>>>>> further. >>> > > > > > > > > > > >> >> >>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>> I'd like to write down a few of notes >>> > > > > > > > > > > >> >> >>>>>>>>>> on >>> > > > > > > > configs/args >>> > > > > > > > > > pass >>> > > > > > > > > > > >> >> >> and >>> > > > > > > > > > > >> >> >>>>>>> respect, >>> > > > > > > > > > > >> >> >>>>>>>>>> as well as decoupling job compilation >>> > and >>> > > > > > > > submission. >>> > > > > > > > > > > Share >>> > > > > > > > > > > >> >> >> on >>> > > > > > > > > > > >> >> >>>>> this >>> > > > > > > > > > > >> >> >>>>>>>>>> thread later. >>> > > > > > > > > > > >> >> >>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>> Best, >>> > > > > > > > > > > >> >> >>>>>>>>>> tison. >>> > > > > > > > > > > >> >> >>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>> SHI Xiaogang <shixiaoga...@gmail.com> >>> > > > > > 于2019年6月17日周一 >>> > > > > > > > > > > >> >> >> 下午7:29写道: >>> > > > > > > > > > > >> >> >>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>> Hi Jeff and Flavio, >>> > > > > > > > > > > >> >> >>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>> Thanks Jeff a lot for proposing the >>> > design >>> > > > > > > > document. >>> > > > > > > > > > > >> >> >>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>> We are also working on refactoring >>> > > > > > ClusterClient to >>> > > > > > > > > > allow >>> > > > > > > > > > > >> >> >>>>> flexible >>> > > > > > > > > > > >> >> >>>>>>> and >>> > > > > > > > > > > >> >> >>>>>>>>>>> efficient job management in our >>> > real-time >>> > > > > > platform. >>> > > > > > > > > > > >> >> >>>>>>>>>>> We would like to draft a document to >>> > share >>> > > > > our >>> > > > > > > > ideas >>> > > > > > > > > > with >>> > > > > > > > > > > >> >> >>> you. >>> > > > > > > > > > > >> >> >>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>> I think it's a good idea to have >>> > something >>> > > > > like >>> > > > > > > > > Apache >>> > > > > > > > > > > Livy >>> > > > > > > > > > > >> >> >>> for >>> > > > > > > > > > > >> >> >>>>>>> Flink, >>> > > > > > > > > > > >> >> >>>>>>>>>>> and >>> > > > > > > > > > > >> >> >>>>>>>>>>> the efforts discussed here will take a >>> > > > great >>> > > > > > step >>> > > > > > > > > > forward >>> > > > > > > > > > > >> >> >> to >>> > > > > > > > > > > >> >> >>>> it. >>> > > > > > > > > > > >> >> >>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>> Regards, >>> > > > > > > > > > > >> >> >>>>>>>>>>> Xiaogang >>> > > > > > > > > > > >> >> >>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>> Flavio Pompermaier < >>> > pomperma...@okkam.it> >>> > > > > > > > > > 于2019年6月17日周一 >>> > > > > > > > > > > >> >> >>>>> 下午7:13写道: >>> > > > > > > > > > > >> >> >>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>> Is there any possibility to have >>> > something >>> > > > > > like >>> > > > > > > > > Apache >>> > > > > > > > > > > >> >> >> Livy >>> > > > > > > > > > > >> >> >>>> [1] >>> > > > > > > > > > > >> >> >>>>>>> also >>> > > > > > > > > > > >> >> >>>>>>>>>>> for >>> > > > > > > > > > > >> >> >>>>>>>>>>>> Flink in the future? >>> > > > > > > > > > > >> >> >>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>> [1] https://livy.apache.org/ >>> > > > > > > > > > > >> >> >>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>> On Tue, Jun 11, 2019 at 5:23 PM Jeff >>> > > > Zhang < >>> > > > > > > > > > > >> >> >>> zjf...@gmail.com >>> > > > > > > > > > > >> >> >>>>> >>> > > > > > > > > > > >> >> >>>>>>> wrote: >>> > > > > > > > > > > >> >> >>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> Any API we expose should not have >>> > > > > > dependencies >>> > > > > > > > > on >>> > > > > > > > > > > >> >> >>> the >>> > > > > > > > > > > >> >> >>>>>>> runtime >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> (flink-runtime) package or other >>> > > > > > implementation >>> > > > > > > > > > > >> >> >> details. >>> > > > > > > > > > > >> >> >>> To >>> > > > > > > > > > > >> >> >>>>> me, >>> > > > > > > > > > > >> >> >>>>>>>> this >>> > > > > > > > > > > >> >> >>>>>>>>>>>> means >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> that the current ClusterClient >>> > cannot be >>> > > > > > exposed >>> > > > > > > > to >>> > > > > > > > > > > >> >> >> users >>> > > > > > > > > > > >> >> >>>>>> because >>> > > > > > > > > > > >> >> >>>>>>>> it >>> > > > > > > > > > > >> >> >>>>>>>>>>>> uses >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> quite some classes from the >>> > optimiser and >>> > > > > > runtime >>> > > > > > > > > > > >> >> >>> packages. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> We should change ClusterClient from >>> > class >>> > > > > to >>> > > > > > > > > > interface. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> ExecutionEnvironment only use the >>> > > > interface >>> > > > > > > > > > > >> >> >> ClusterClient >>> > > > > > > > > > > >> >> >>>>> which >>> > > > > > > > > > > >> >> >>>>>>>>>>> should be >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> in flink-clients while the concrete >>> > > > > > > > implementation >>> > > > > > > > > > > >> >> >> class >>> > > > > > > > > > > >> >> >>>>> could >>> > > > > > > > > > > >> >> >>>>>> be >>> > > > > > > > > > > >> >> >>>>>>>> in >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> flink-runtime. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> What happens when a >>> > failure/restart in >>> > > > > the >>> > > > > > > > > client >>> > > > > > > > > > > >> >> >>>>> happens? >>> > > > > > > > > > > >> >> >>>>>>>> There >>> > > > > > > > > > > >> >> >>>>>>>>>>> need >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> to be a way of re-establishing the >>> > > > > > connection to >>> > > > > > > > > the >>> > > > > > > > > > > >> >> >> job, >>> > > > > > > > > > > >> >> >>>> set >>> > > > > > > > > > > >> >> >>>>>> up >>> > > > > > > > > > > >> >> >>>>>>>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> listeners again, etc. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> Good point. First we need to define >>> > what >>> > > > > > does >>> > > > > > > > > > > >> >> >>>>> failure/restart >>> > > > > > > > > > > >> >> >>>>>> in >>> > > > > > > > > > > >> >> >>>>>>>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> client mean. IIUC, that usually mean >>> > > > > network >>> > > > > > > > > failure >>> > > > > > > > > > > >> >> >>> which >>> > > > > > > > > > > >> >> >>>>> will >>> > > > > > > > > > > >> >> >>>>>>>>>>> happen in >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> class RestClient. If my >>> > understanding is >>> > > > > > correct, >>> > > > > > > > > > > >> >> >>>>> restart/retry >>> > > > > > > > > > > >> >> >>>>>>>>>>> mechanism >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> should be done in RestClient. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> Aljoscha Krettek < >>> > aljos...@apache.org> >>> > > > > > > > > 于2019年6月11日周二 >>> > > > > > > > > > > >> >> >>>>>> 下午11:10写道: >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>> Some points to consider: >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>> * Any API we expose should not have >>> > > > > > dependencies >>> > > > > > > > > on >>> > > > > > > > > > > >> >> >> the >>> > > > > > > > > > > >> >> >>>>>> runtime >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>> (flink-runtime) package or other >>> > > > > > implementation >>> > > > > > > > > > > >> >> >>> details. >>> > > > > > > > > > > >> >> >>>> To >>> > > > > > > > > > > >> >> >>>>>> me, >>> > > > > > > > > > > >> >> >>>>>>>>>>> this >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> means >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>> that the current ClusterClient >>> > cannot be >>> > > > > > exposed >>> > > > > > > > > to >>> > > > > > > > > > > >> >> >>> users >>> > > > > > > > > > > >> >> >>>>>>> because >>> > > > > > > > > > > >> >> >>>>>>>>>>> it >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> uses >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>> quite some classes from the >>> > optimiser >>> > > > and >>> > > > > > > > runtime >>> > > > > > > > > > > >> >> >>>> packages. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>> * What happens when a >>> > failure/restart in >>> > > > > the >>> > > > > > > > > client >>> > > > > > > > > > > >> >> >>>>> happens? >>> > > > > > > > > > > >> >> >>>>>>>> There >>> > > > > > > > > > > >> >> >>>>>>>>>>> need >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> to >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>> be a way of re-establishing the >>> > > > connection >>> > > > > > to >>> > > > > > > > the >>> > > > > > > > > > > >> >> >> job, >>> > > > > > > > > > > >> >> >>>> set >>> > > > > > > > > > > >> >> >>>>> up >>> > > > > > > > > > > >> >> >>>>>>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> listeners >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>> again, etc. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>> Aljoscha >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>> On 29. May 2019, at 10:17, Jeff >>> > Zhang < >>> > > > > > > > > > > >> >> >>>> zjf...@gmail.com> >>> > > > > > > > > > > >> >> >>>>>>>> wrote: >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>> Sorry folks, the design doc is >>> > late as >>> > > > > you >>> > > > > > > > > > > >> >> >> expected. >>> > > > > > > > > > > >> >> >>>>> Here's >>> > > > > > > > > > > >> >> >>>>>>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>>> design >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>> doc >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>> I drafted, welcome any comments >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>> and >>> > > > > > feedback. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>> >>> > > > > > > > > > > >> >> >>>>>> >>> > > > > > > > > > > >> >> >>>>> >>> > > > > > > > > > > >> >> >>>> >>> > > > > > > > > > > >> >> >>> >>> > > > > > > > > > > >> >> >> >>> > > > > > > > > > > >> >> >>> > > > > > > > > > > >> >>> > > > > > > > > > > >>> > > > > > > > > > >>> > > > > > > > > >>> > > > > > > > >>> > > > > > >>> > > > > >>> > > > >>> > https://docs.google.com/document/d/1VavBrYn8vJeZs-Mhu5VzKO6xrWCF40aY0nlQ_UVVTRg/edit?usp=sharing >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>> Stephan Ewen <se...@apache.org> >>> > > > > > 于2019年2月14日周四 >>> > > > > > > > > > > >> >> >>>> 下午8:43写道: >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> Nice that this discussion is >>> > > > happening. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> In the FLIP, we could also >>> > revisit the >>> > > > > > entire >>> > > > > > > > > role >>> > > > > > > > > > > >> >> >>> of >>> > > > > > > > > > > >> >> >>>>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>>> environments >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> again. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> Initially, the idea was: >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> - the environments take care of >>> > the >>> > > > > > specific >>> > > > > > > > > > > >> >> >> setup >>> > > > > > > > > > > >> >> >>>> for >>> > > > > > > > > > > >> >> >>>>>>>>>>> standalone >>> > > > > > > > > > > >> >> >>>>>>>>>>>> (no >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> setup needed), yarn, mesos, etc. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> - the session ones have control >>> > over >>> > > > the >>> > > > > > > > > session. >>> > > > > > > > > > > >> >> >>> The >>> > > > > > > > > > > >> >> >>>>>>>>>>> environment >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> holds >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> the session client. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> - running a job gives a "control" >>> > > > object >>> > > > > > for >>> > > > > > > > > that >>> > > > > > > > > > > >> >> >>>> job. >>> > > > > > > > > > > >> >> >>>>>> That >>> > > > > > > > > > > >> >> >>>>>>>>>>>> behavior >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> is >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> the same in all environments. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> The actual implementation >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> diverged >>> > > > quite >>> > > > > > a bit >>> > > > > > > > > > > >> >> >> from >>> > > > > > > > > > > >> >> >>>>> that. >>> > > > > > > > > > > >> >> >>>>>>>> Happy >>> > > > > > > > > > > >> >> >>>>>>>>>>> to >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> see a >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> discussion about straitening this >>> > out >>> > > > a >>> > > > > > bit >>> > > > > > > > > more. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> On Tue, Feb 12, 2019 at 4:58 AM >>> > Jeff >>> > > > > > Zhang < >>> > > > > > > > > > > >> >> >>>>>>> zjf...@gmail.com> >>> > > > > > > > > > > >> >> >>>>>>>>>>>> wrote: >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> Hi folks, >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> Sorry for late response, It >>> > seems we >>> > > > > > reach >>> > > > > > > > > > > >> >> >>> consensus >>> > > > > > > > > > > >> >> >>>> on >>> > > > > > > > > > > >> >> >>>>>>>> this, I >>> > > > > > > > > > > >> >> >>>>>>>>>>>> will >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> create >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> FLIP for this with more detailed >>> > > > design >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> Thomas Weise <t...@apache.org> >>> > > > > > 于2018年12月21日周五 >>> > > > > > > > > > > >> >> >>>>> 上午11:43写道: >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> Great to see this discussion >>> > seeded! >>> > > > > The >>> > > > > > > > > > > >> >> >> problems >>> > > > > > > > > > > >> >> >>>> you >>> > > > > > > > > > > >> >> >>>>>> face >>> > > > > > > > > > > >> >> >>>>>>>>>>> with >>> > > > > > > > > > > >> >> >>>>>>>>>>>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> Zeppelin integration are also >>> > > > > affecting >>> > > > > > > > other >>> > > > > > > > > > > >> >> >>>>> downstream >>> > > > > > > > > > > >> >> >>>>>>>>>>> projects, >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>> like >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> Beam. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> We just enabled the savepoint >>> > > > restore >>> > > > > > option >>> > > > > > > > > in >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>> RemoteStreamEnvironment >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> [1] >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> and that was more difficult >>> > than it >>> > > > > > should >>> > > > > > > > be. >>> > > > > > > > > > > >> >> >> The >>> > > > > > > > > > > >> >> >>>>> main >>> > > > > > > > > > > >> >> >>>>>>>> issue >>> > > > > > > > > > > >> >> >>>>>>>>>>> is >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> that >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> environment and cluster client >>> > > > aren't >>> > > > > > > > > decoupled. >>> > > > > > > > > > > >> >> >>>>> Ideally >>> > > > > > > > > > > >> >> >>>>>>> it >>> > > > > > > > > > > >> >> >>>>>>>>>>> should >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> be >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> possible to just get the >>> > matching >>> > > > > > cluster >>> > > > > > > > > client >>> > > > > > > > > > > >> >> >>>> from >>> > > > > > > > > > > >> >> >>>>>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> environment >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> and >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> then control the job through it >>> > > > > > (environment >>> > > > > > > > > as >>> > > > > > > > > > > >> >> >>>>> factory >>> > > > > > > > > > > >> >> >>>>>>> for >>> > > > > > > > > > > >> >> >>>>>>>>>>>> cluster >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> client). But note that the >>> > > > environment >>> > > > > > > > classes >>> > > > > > > > > > > >> >> >> are >>> > > > > > > > > > > >> >> >>>>> part >>> > > > > > > > > > > >> >> >>>>>> of >>> > > > > > > > > > > >> >> >>>>>>>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> public >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> API, >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> and it is not straightforward >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> to >>> > > > make >>> > > > > > larger >>> > > > > > > > > > > >> >> >>> changes >>> > > > > > > > > > > >> >> >>>>>>> without >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> breaking >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> backward compatibility. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> ClusterClient currently exposes >>> > > > > internal >>> > > > > > > > > classes >>> > > > > > > > > > > >> >> >>>> like >>> > > > > > > > > > > >> >> >>>>>>>>>>> JobGraph and >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> StreamGraph. But it should be >>> > > > possible >>> > > > > > to >>> > > > > > > > wrap >>> > > > > > > > > > > >> >> >>> this >>> > > > > > > > > > > >> >> >>>>>> with a >>> > > > > > > > > > > >> >> >>>>>>>> new >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> public >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> API >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> that brings the required job >>> > control >>> > > > > > > > > > > >> >> >> capabilities >>> > > > > > > > > > > >> >> >>>> for >>> > > > > > > > > > > >> >> >>>>>>>>>>> downstream >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> projects. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> Perhaps it is helpful to look >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> at >>> > > > some >>> > > > > > of the >>> > > > > > > > > > > >> >> >>>>> interfaces >>> > > > > > > > > > > >> >> >>>>>> in >>> > > > > > > > > > > >> >> >>>>>>>>>>> Beam >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> while >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> thinking about this: [2] for >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> the >>> > > > > > portable >>> > > > > > > > job >>> > > > > > > > > > > >> >> >> API >>> > > > > > > > > > > >> >> >>>> and >>> > > > > > > > > > > >> >> >>>>>> [3] >>> > > > > > > > > > > >> >> >>>>>>>> for >>> > > > > > > > > > > >> >> >>>>>>>>>>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> old >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> asynchronous job control from >>> > the >>> > > > Beam >>> > > > > > Java >>> > > > > > > > > SDK. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> The backward compatibility >>> > > > discussion >>> > > > > > [4] is >>> > > > > > > > > > > >> >> >> also >>> > > > > > > > > > > >> >> >>>>>> relevant >>> > > > > > > > > > > >> >> >>>>>>>>>>> here. A >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> new >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> API >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> should shield downstream >>> > projects >>> > > > from >>> > > > > > > > > internals >>> > > > > > > > > > > >> >> >>> and >>> > > > > > > > > > > >> >> >>>>>> allow >>> > > > > > > > > > > >> >> >>>>>>>>>>> them to >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> interoperate with multiple >>> > future >>> > > > > Flink >>> > > > > > > > > versions >>> > > > > > > > > > > >> >> >>> in >>> > > > > > > > > > > >> >> >>>>> the >>> > > > > > > > > > > >> >> >>>>>>> same >>> > > > > > > > > > > >> >> >>>>>>>>>>>> release >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> line >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> without forced upgrades. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> Thanks, >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> Thomas >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> [1] >>> > > > > > > > https://github.com/apache/flink/pull/7249 >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> [2] >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>> >>> > > > > > > > > > > >> >> >>>>>> >>> > > > > > > > > > > >> >> >>>>> >>> > > > > > > > > > > >> >> >>>> >>> > > > > > > > > > > >> >> >>> >>> > > > > > > > > > > >> >> >> >>> > > > > > > > > > > >> >> >>> > > > > > > > > > > >> >>> > > > > > > > > > > >>> > > > > > > > > > >>> > > > > > > > > >>> > > > > > > > >>> > > > > > >>> > > > > >>> > > > >>> > https://github.com/apache/beam/blob/master/model/job-management/src/main/proto/beam_job_api.proto >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> [3] >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>> >>> > > > > > > > > > > >> >> >>>>>> >>> > > > > > > > > > > >> >> >>>>> >>> > > > > > > > > > > >> >> >>>> >>> > > > > > > > > > > >> >> >>> >>> > > > > > > > > > > >> >> >> >>> > > > > > > > > > > >> >> >>> > > > > > > > > > > >> >>> > > > > > > > > > > >>> > > > > > > > > > >>> > > > > > > > > >>> > > > > > > > >>> > > > > > >>> > > > > >>> > > > >>> > https://github.com/apache/beam/blob/master/sdks/java/core/src/main/java/org/apache/beam/sdk/PipelineResult.java >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> [4] >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>> >>> > > > > > > > > > > >> >> >>>>>> >>> > > > > > > > > > > >> >> >>>>> >>> > > > > > > > > > > >> >> >>>> >>> > > > > > > > > > > >> >> >>> >>> > > > > > > > > > > >> >> >> >>> > > > > > > > > > > >> >> >>> > > > > > > > > > > >> >>> > > > > > > > > > > >>> > > > > > > > > > >>> > > > > > > > > >>> > > > > > > > >>> > > > > > >>> > > > > >>> > > > >>> > https://lists.apache.org/thread.html/064c75c5d10f0806095b14f6d76942598917a14429c1acbddd151fe2@%3Cdev.flink.apache.org%3E >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> On Thu, Dec 20, 2018 at 6:15 PM >>> > Jeff >>> > > > > > Zhang < >>> > > > > > > > > > > >> >> >>>>>>>> zjf...@gmail.com> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> wrote: >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> I'm not so sure whether the >>> > user >>> > > > > > should >>> > > > > > > > be >>> > > > > > > > > > > >> >> >>> able >>> > > > > > > > > > > >> >> >>>> to >>> > > > > > > > > > > >> >> >>>>>>>> define >>> > > > > > > > > > > >> >> >>>>>>>>>>>> where >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> job >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> runs (in your example Yarn). >>> > This >>> > > > is >>> > > > > > > > actually >>> > > > > > > > > > > >> >> >>>>>> independent >>> > > > > > > > > > > >> >> >>>>>>>> of >>> > > > > > > > > > > >> >> >>>>>>>>>>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> job >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> development and is something >>> > which >>> > > > is >>> > > > > > > > decided >>> > > > > > > > > > > >> >> >> at >>> > > > > > > > > > > >> >> >>>>>>> deployment >>> > > > > > > > > > > >> >> >>>>>>>>>>> time. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> User don't need to specify >>> > > > execution >>> > > > > > mode >>> > > > > > > > > > > >> >> >>>>>>> programmatically. >>> > > > > > > > > > > >> >> >>>>>>>>>>> They >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> can >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> also >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> pass the execution mode from >>> > the >>> > > > > > arguments >>> > > > > > > > in >>> > > > > > > > > > > >> >> >>> flink >>> > > > > > > > > > > >> >> >>>>> run >>> > > > > > > > > > > >> >> >>>>>>>>>>> command. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> e.g. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> bin/flink run -m yarn-cluster >>> > .... >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> bin/flink run -m local ... >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> bin/flink run -m host:port ... >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> Does this make sense to you ? >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> To me it makes sense that >>> > the >>> > > > > > > > > > > >> >> >>>> ExecutionEnvironment >>> > > > > > > > > > > >> >> >>>>>> is >>> > > > > > > > > > > >> >> >>>>>>>> not >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> directly >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> initialized by the user and >>> > instead >>> > > > > > context >>> > > > > > > > > > > >> >> >>>> sensitive >>> > > > > > > > > > > >> >> >>>>>> how >>> > > > > > > > > > > >> >> >>>>>>>> you >>> > > > > > > > > > > >> >> >>>>>>>>>>>> want >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> to >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> execute your job (Flink CLI >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> vs. >>> > > > IDE, >>> > > > > > for >>> > > > > > > > > > > >> >> >>> example). >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> Right, currently I notice >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> Flink >>> > > > would >>> > > > > > > > create >>> > > > > > > > > > > >> >> >>>>> different >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> ContextExecutionEnvironment >>> > based >>> > > > on >>> > > > > > > > > different >>> > > > > > > > > > > >> >> >>>>>> submission >>> > > > > > > > > > > >> >> >>>>>>>>>>>> scenarios >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> (Flink >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> Cli vs IDE). To me this is >>> > kind of >>> > > > > hack >>> > > > > > > > > > > >> >> >> approach, >>> > > > > > > > > > > >> >> >>>> not >>> > > > > > > > > > > >> >> >>>>>> so >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> straightforward. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> What I suggested above is that >>> > is >>> > > > > that >>> > > > > > > > flink >>> > > > > > > > > > > >> >> >>> should >>> > > > > > > > > > > >> >> >>>>>>> always >>> > > > > > > > > > > >> >> >>>>>>>>>>> create >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> same >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> ExecutionEnvironment but with >>> > > > > different >>> > > > > > > > > > > >> >> >>>>> configuration, >>> > > > > > > > > > > >> >> >>>>>>> and >>> > > > > > > > > > > >> >> >>>>>>>>>>> based >>> > > > > > > > > > > >> >> >>>>>>>>>>>> on >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> configuration it would create >>> > the >>> > > > > > proper >>> > > > > > > > > > > >> >> >>>>> ClusterClient >>> > > > > > > > > > > >> >> >>>>>>> for >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> different >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> behaviors. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> Till Rohrmann < >>> > > > trohrm...@apache.org> >>> > > > > > > > > > > >> >> >>>> 于2018年12月20日周四 >>> > > > > > > > > > > >> >> >>>>>>>>>>> 下午11:18写道: >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> You are probably right that >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> we >>> > > > have >>> > > > > > code >>> > > > > > > > > > > >> >> >>>> duplication >>> > > > > > > > > > > >> >> >>>>>>> when >>> > > > > > > > > > > >> >> >>>>>>>> it >>> > > > > > > > > > > >> >> >>>>>>>>>>>> comes >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> to >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> creation of the >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> ClusterClient. >>> > > > This >>> > > > > > should >>> > > > > > > > > be >>> > > > > > > > > > > >> >> >>>>> reduced >>> > > > > > > > > > > >> >> >>>>>> in >>> > > > > > > > > > > >> >> >>>>>>>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> future. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> I'm not so sure whether the >>> > user >>> > > > > > should be >>> > > > > > > > > > > >> >> >> able >>> > > > > > > > > > > >> >> >>> to >>> > > > > > > > > > > >> >> >>>>>>> define >>> > > > > > > > > > > >> >> >>>>>>>>>>> where >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> job >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> runs (in your example Yarn). >>> > This >>> > > > is >>> > > > > > > > > actually >>> > > > > > > > > > > >> >> >>>>>>> independent >>> > > > > > > > > > > >> >> >>>>>>>>>>> of the >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> job >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> development and is something >>> > which >>> > > > > is >>> > > > > > > > > decided >>> > > > > > > > > > > >> >> >> at >>> > > > > > > > > > > >> >> >>>>>>>> deployment >>> > > > > > > > > > > >> >> >>>>>>>>>>>> time. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> To >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> me >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> it >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> makes sense that the >>> > > > > > ExecutionEnvironment >>> > > > > > > > is >>> > > > > > > > > > > >> >> >> not >>> > > > > > > > > > > >> >> >>>>>>> directly >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> initialized >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> by >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> the user and instead context >>> > > > > > sensitive how >>> > > > > > > > > you >>> > > > > > > > > > > >> >> >>>> want >>> > > > > > > > > > > >> >> >>>>> to >>> > > > > > > > > > > >> >> >>>>>>>>>>> execute >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> your >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> job >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> (Flink CLI vs. IDE, for >>> > example). >>> > > > > > > > However, I >>> > > > > > > > > > > >> >> >>> agree >>> > > > > > > > > > > >> >> >>>>>> that >>> > > > > > > > > > > >> >> >>>>>>>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> ExecutionEnvironment should >>> > give >>> > > > you >>> > > > > > > > access >>> > > > > > > > > to >>> > > > > > > > > > > >> >> >>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>> ClusterClient >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> and >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> to >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> job (maybe in the form of the >>> > > > > > JobGraph or >>> > > > > > > > a >>> > > > > > > > > > > >> >> >> job >>> > > > > > > > > > > >> >> >>>>> plan). >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> Cheers, >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> Till >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> On Thu, Dec 13, 2018 at 4:36 >>> > AM >>> > > > Jeff >>> > > > > > > > Zhang < >>> > > > > > > > > > > >> >> >>>>>>>>>>> zjf...@gmail.com> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> wrote: >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> Hi Till, >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> Thanks for the feedback. You >>> > are >>> > > > > > right >>> > > > > > > > > that I >>> > > > > > > > > > > >> >> >>>>> expect >>> > > > > > > > > > > >> >> >>>>>>>> better >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> programmatic >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> job submission/control api >>> > which >>> > > > > > could be >>> > > > > > > > > > > >> >> >> used >>> > > > > > > > > > > >> >> >>> by >>> > > > > > > > > > > >> >> >>>>>>>>>>> downstream >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> project. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> And >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> it would benefit for the >>> > flink >>> > > > > > ecosystem. >>> > > > > > > > > > > >> >> >> When >>> > > > > > > > > > > >> >> >>> I >>> > > > > > > > > > > >> >> >>>>> look >>> > > > > > > > > > > >> >> >>>>>>> at >>> > > > > > > > > > > >> >> >>>>>>>>>>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>>> code >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> of >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> flink >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> scala-shell and sql-client >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> (I >>> > > > > believe >>> > > > > > > > they >>> > > > > > > > > > > >> >> >> are >>> > > > > > > > > > > >> >> >>>> not >>> > > > > > > > > > > >> >> >>>>>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>> core of >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> flink, >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> but >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> belong to the ecosystem of >>> > > > flink), >>> > > > > I >>> > > > > > find >>> > > > > > > > > > > >> >> >> many >>> > > > > > > > > > > >> >> >>>>>>> duplicated >>> > > > > > > > > > > >> >> >>>>>>>>>>> code >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> for >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> creating >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> ClusterClient from user >>> > provided >>> > > > > > > > > > > >> >> >> configuration >>> > > > > > > > > > > >> >> >>>>>>>>>>> (configuration >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> format >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> may >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> be >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> different from scala-shell >>> > and >>> > > > > > > > sql-client) >>> > > > > > > > > > > >> >> >> and >>> > > > > > > > > > > >> >> >>>> then >>> > > > > > > > > > > >> >> >>>>>> use >>> > > > > > > > > > > >> >> >>>>>>>>>>> that >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> ClusterClient >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> to manipulate jobs. I don't >>> > think >>> > > > > > this is >>> > > > > > > > > > > >> >> >>>>> convenient >>> > > > > > > > > > > >> >> >>>>>>> for >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> downstream >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> projects. What I expect is >>> > that >>> > > > > > > > downstream >>> > > > > > > > > > > >> >> >>>> project >>> > > > > > > > > > > >> >> >>>>>> only >>> > > > > > > > > > > >> >> >>>>>>>>>>> needs >>> > > > > > > > > > > >> >> >>>>>>>>>>>> to >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> provide >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> necessary configuration info >>> > > > (maybe >>> > > > > > > > > > > >> >> >> introducing >>> > > > > > > > > > > >> >> >>>>> class >>> > > > > > > > > > > >> >> >>>>>>>>>>>> FlinkConf), >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> and >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> then >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> build ExecutionEnvironment >>> > based >>> > > > on >>> > > > > > this >>> > > > > > > > > > > >> >> >>>> FlinkConf, >>> > > > > > > > > > > >> >> >>>>>> and >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> ExecutionEnvironment will >>> > create >>> > > > > the >>> > > > > > > > proper >>> > > > > > > > > > > >> >> >>>>>>>> ClusterClient. >>> > > > > > > > > > > >> >> >>>>>>>>>>> It >>> > > > > > > > > > > >> >> >>>>>>>>>>>> not >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> only >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> benefit for the downstream >>> > > > project >>> > > > > > > > > > > >> >> >> development >>> > > > > > > > > > > >> >> >>>> but >>> > > > > > > > > > > >> >> >>>>>> also >>> > > > > > > > > > > >> >> >>>>>>>> be >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> helpful >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> for >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> their integration test with >>> > > > flink. >>> > > > > > Here's >>> > > > > > > > > one >>> > > > > > > > > > > >> >> >>>>> sample >>> > > > > > > > > > > >> >> >>>>>>> code >>> > > > > > > > > > > >> >> >>>>>>>>>>>> snippet >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> that >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> I >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> expect. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> val conf = new >>> > > > > > FlinkConf().mode("yarn") >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> val env = new >>> > > > > > ExecutionEnvironment(conf) >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> val jobId = env.submit(...) >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> val jobStatus = >>> > > > > > > > > > > >> >> >>>>>>>>>>> >>> > > > env.getClusterClient().queryJobStatus(jobId) >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> >>> > > > > > env.getClusterClient().cancelJob(jobId) >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> What do you think ? >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> Till Rohrmann < >>> > > > > trohrm...@apache.org> >>> > > > > > > > > > > >> >> >>>>> 于2018年12月11日周二 >>> > > > > > > > > > > >> >> >>>>>>>>>>> 下午6:28写道: >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> Hi Jeff, >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> what you are proposing is >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> to >>> > > > > > provide the >>> > > > > > > > > > > >> >> >> user >>> > > > > > > > > > > >> >> >>>> with >>> > > > > > > > > > > >> >> >>>>>>>> better >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> programmatic >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> job >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> control. There was actually >>> > an >>> > > > > > effort to >>> > > > > > > > > > > >> >> >>> achieve >>> > > > > > > > > > > >> >> >>>>>> this >>> > > > > > > > > > > >> >> >>>>>>>> but >>> > > > > > > > > > > >> >> >>>>>>>>>>> it >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> has >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> never >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> been >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> completed [1]. However, >>> > there >>> > > > are >>> > > > > > some >>> > > > > > > > > > > >> >> >>>> improvement >>> > > > > > > > > > > >> >> >>>>>> in >>> > > > > > > > > > > >> >> >>>>>>>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>> code >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> base >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> now. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> Look for example at the >>> > > > > > NewClusterClient >>> > > > > > > > > > > >> >> >>>> interface >>> > > > > > > > > > > >> >> >>>>>>> which >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> offers a >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> non-blocking job >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> submission. >>> > > > But I >>> > > > > > agree >>> > > > > > > > > > > >> >> >> that >>> > > > > > > > > > > >> >> >>> we >>> > > > > > > > > > > >> >> >>>>>> need >>> > > > > > > > > > > >> >> >>>>>>> to >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> improve >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> Flink >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> in >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> this regard. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> I would not be in favour if >>> > > > > > exposing all >>> > > > > > > > > > > >> >> >>>>>> ClusterClient >>> > > > > > > > > > > >> >> >>>>>>>>>>> calls >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> via >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> ExecutionEnvironment >>> > because it >>> > > > > > would >>> > > > > > > > > > > >> >> >> clutter >>> > > > > > > > > > > >> >> >>>> the >>> > > > > > > > > > > >> >> >>>>>>> class >>> > > > > > > > > > > >> >> >>>>>>>>>>> and >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> would >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> not >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> be >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> a >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> good separation of >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> concerns. >>> > > > > > Instead one >>> > > > > > > > > > > >> >> >> idea >>> > > > > > > > > > > >> >> >>>>> could >>> > > > > > > > > > > >> >> >>>>>> be >>> > > > > > > > > > > >> >> >>>>>>>> to >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> retrieve >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> current ClusterClient from >>> > the >>> > > > > > > > > > > >> >> >>>>> ExecutionEnvironment >>> > > > > > > > > > > >> >> >>>>>>>> which >>> > > > > > > > > > > >> >> >>>>>>>>>>> can >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> then >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> be >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> used >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> for cluster and job >>> > control. But >>> > > > > > before >>> > > > > > > > we >>> > > > > > > > > > > >> >> >>> start >>> > > > > > > > > > > >> >> >>>>> an >>> > > > > > > > > > > >> >> >>>>>>>> effort >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> here, >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> we >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> need >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> to >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> agree and capture what >>> > > > > > functionality we >>> > > > > > > > > want >>> > > > > > > > > > > >> >> >>> to >>> > > > > > > > > > > >> >> >>>>>>> provide. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> Initially, the idea was >>> > that we >>> > > > > > have the >>> > > > > > > > > > > >> >> >>>>>>>> ClusterDescriptor >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> describing >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> how >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> to talk to cluster manager >>> > like >>> > > > > > Yarn or >>> > > > > > > > > > > >> >> >> Mesos. >>> > > > > > > > > > > >> >> >>>> The >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> ClusterDescriptor >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> can >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> be >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> used for deploying Flink >>> > > > clusters >>> > > > > > (job >>> > > > > > > > and >>> > > > > > > > > > > >> >> >>>>> session) >>> > > > > > > > > > > >> >> >>>>>>> and >>> > > > > > > > > > > >> >> >>>>>>>>>>> gives >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> you a >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> ClusterClient. The >>> > ClusterClient >>> > > > > > > > controls >>> > > > > > > > > > > >> >> >> the >>> > > > > > > > > > > >> >> >>>>>> cluster >>> > > > > > > > > > > >> >> >>>>>>>>>>> (e.g. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> submitting >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> jobs, listing all running >>> > jobs). >>> > > > > And >>> > > > > > > > then >>> > > > > > > > > > > >> >> >>> there >>> > > > > > > > > > > >> >> >>>>> was >>> > > > > > > > > > > >> >> >>>>>>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>> idea >>> > > > > > > > > > > >> >> >>>>>>>>>>>> to >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> introduce a >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> JobClient which you obtain >>> > from >>> > > > > the >>> > > > > > > > > > > >> >> >>>> ClusterClient >>> > > > > > > > > > > >> >> >>>>> to >>> > > > > > > > > > > >> >> >>>>>>>>>>> trigger >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> job >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> specific >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> operations (e.g. taking a >>> > > > > savepoint, >>> > > > > > > > > > > >> >> >>> cancelling >>> > > > > > > > > > > >> >> >>>>> the >>> > > > > > > > > > > >> >> >>>>>>>> job). >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> [1] >>> > > > > > > > > > > >> >> >>>>>> >>> > > > https://issues.apache.org/jira/browse/FLINK-4272 >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> Cheers, >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> Till >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> On Tue, Dec 11, 2018 at >>> > 10:13 AM >>> > > > > > Jeff >>> > > > > > > > > Zhang >>> > > > > > > > > > > >> >> >> < >>> > > > > > > > > > > >> >> >>>>>>>>>>> zjf...@gmail.com >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> wrote: >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> Hi Folks, >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> I am trying to integrate >>> > flink >>> > > > > into >>> > > > > > > > > apache >>> > > > > > > > > > > >> >> >>>>> zeppelin >>> > > > > > > > > > > >> >> >>>>>>>>>>> which is >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> an >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> interactive >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> notebook. And I hit >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> several >>> > > > > issues >>> > > > > > that >>> > > > > > > > > is >>> > > > > > > > > > > >> >> >>>> caused >>> > > > > > > > > > > >> >> >>>>>> by >>> > > > > > > > > > > >> >> >>>>>>>>>>> flink >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> client >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> api. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> So >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> I'd like to proposal the >>> > > > > following >>> > > > > > > > > changes >>> > > > > > > > > > > >> >> >>> for >>> > > > > > > > > > > >> >> >>>>>> flink >>> > > > > > > > > > > >> >> >>>>>>>>>>> client >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> api. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> 1. Support nonblocking >>> > > > execution. >>> > > > > > > > > > > >> >> >> Currently, >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> ExecutionEnvironment#execute >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> is a blocking method which >>> > > > would >>> > > > > > do 2 >>> > > > > > > > > > > >> >> >> things, >>> > > > > > > > > > > >> >> >>>>> first >>> > > > > > > > > > > >> >> >>>>>>>>>>> submit >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> job >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> and >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> then >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> wait for job until it is >>> > > > > finished. >>> > > > > > I'd >>> > > > > > > > > like >>> > > > > > > > > > > >> >> >>>>>>> introduce a >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> nonblocking >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> execution method like >>> > > > > > > > > > > >> >> >>>> ExecutionEnvironment#submit >>> > > > > > > > > > > >> >> >>>>>>> which >>> > > > > > > > > > > >> >> >>>>>>>>>>> only >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> submit >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> job >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> and >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> then return jobId to >>> > client. >>> > > > And >>> > > > > > allow >>> > > > > > > > > user >>> > > > > > > > > > > >> >> >>> to >>> > > > > > > > > > > >> >> >>>>>> query >>> > > > > > > > > > > >> >> >>>>>>>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>> job >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> status >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> via >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> jobId. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> 2. Add cancel api in >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >> ExecutionEnvironment/StreamExecutionEnvironment, >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> currently the only way to >>> > > > cancel >>> > > > > > job is >>> > > > > > > > > via >>> > > > > > > > > > > >> >> >>> cli >>> > > > > > > > > > > >> >> >>>>>>>>>>> (bin/flink), >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> this >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> is >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> not >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> convenient for downstream >>> > > > project >>> > > > > > to >>> > > > > > > > use >>> > > > > > > > > > > >> >> >> this >>> > > > > > > > > > > >> >> >>>>>>> feature. >>> > > > > > > > > > > >> >> >>>>>>>>>>> So I'd >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> like >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> to >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> add >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> cancel api in >>> > > > > ExecutionEnvironment >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> 3. Add savepoint api in >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>> >>> > ExecutionEnvironment/StreamExecutionEnvironment. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> It >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> is similar as cancel api, >>> > we >>> > > > > > should use >>> > > > > > > > > > > >> >> >>>>>>>>>>> ExecutionEnvironment >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> as >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> unified >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> api for third party to >>> > > > integrate >>> > > > > > with >>> > > > > > > > > > > >> >> >> flink. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> 4. Add listener for job >>> > > > execution >>> > > > > > > > > > > >> >> >> lifecycle. >>> > > > > > > > > > > >> >> >>>>>>> Something >>> > > > > > > > > > > >> >> >>>>>>>>>>> like >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> following, >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> so >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> that downstream project >>> > can do >>> > > > > > custom >>> > > > > > > > > logic >>> > > > > > > > > > > >> >> >>> in >>> > > > > > > > > > > >> >> >>>>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>> lifecycle >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> of >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> job. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> e.g. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> Zeppelin would capture the >>> > > > jobId >>> > > > > > after >>> > > > > > > > > job >>> > > > > > > > > > > >> >> >> is >>> > > > > > > > > > > >> >> >>>>>>> submitted >>> > > > > > > > > > > >> >> >>>>>>>>>>> and >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> then >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> use >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> this >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> jobId to cancel it later >>> > when >>> > > > > > > > necessary. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> public interface >>> > JobListener { >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> void onJobSubmitted(JobID >>> > > > > jobId); >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> void >>> > > > > > onJobExecuted(JobExecutionResult >>> > > > > > > > > > > >> >> >>>>> jobResult); >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> void onJobCanceled(JobID >>> > > > jobId); >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> } >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> 5. Enable session in >>> > > > > > > > > ExecutionEnvironment. >>> > > > > > > > > > > >> >> >>>>>> Currently >>> > > > > > > > > > > >> >> >>>>>>> it >>> > > > > > > > > > > >> >> >>>>>>>>>>> is >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> disabled, >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> but >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> session is very convenient >>> > for >>> > > > > > third >>> > > > > > > > > party >>> > > > > > > > > > > >> >> >> to >>> > > > > > > > > > > >> >> >>>>>>>> submitting >>> > > > > > > > > > > >> >> >>>>>>>>>>> jobs >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> continually. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> I hope flink can enable it >>> > > > again. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> 6. Unify all flink client >>> > api >>> > > > > into >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>> >>> > ExecutionEnvironment/StreamExecutionEnvironment. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> This is a long term issue >>> > which >>> > > > > > needs >>> > > > > > > > > more >>> > > > > > > > > > > >> >> >>>>> careful >>> > > > > > > > > > > >> >> >>>>>>>>>>> thinking >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> and >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> design. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> Currently some of features >>> > of >>> > > > > > flink is >>> > > > > > > > > > > >> >> >>> exposed >>> > > > > > > > > > > >> >> >>>> in >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>> >>> > ExecutionEnvironment/StreamExecutionEnvironment, >>> > > > > > > > > > > >> >> >>>>>> but >>> > > > > > > > > > > >> >> >>>>>>>>>>> some are >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> exposed >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> in >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> cli instead of api, like >>> > the >>> > > > > > cancel and >>> > > > > > > > > > > >> >> >>>>> savepoint I >>> > > > > > > > > > > >> >> >>>>>>>>>>> mentioned >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> above. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> I >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> think the root cause is >>> > due to >>> > > > > that >>> > > > > > > > flink >>> > > > > > > > > > > >> >> >>>> didn't >>> > > > > > > > > > > >> >> >>>>>>> unify >>> > > > > > > > > > > >> >> >>>>>>>>>>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> interaction >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> with >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> flink. Here I list 3 >>> > scenarios >>> > > > of >>> > > > > > flink >>> > > > > > > > > > > >> >> >>>> operation >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> - Local job execution. >>> > Flink >>> > > > > will >>> > > > > > > > > create >>> > > > > > > > > > > >> >> >>>>>>>>>>> LocalEnvironment >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> and >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> then >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> use >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> this LocalEnvironment to >>> > > > create >>> > > > > > > > > > > >> >> >>> LocalExecutor >>> > > > > > > > > > > >> >> >>>>> for >>> > > > > > > > > > > >> >> >>>>>>> job >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> execution. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> - Remote job execution. >>> > Flink >>> > > > > will >>> > > > > > > > > create >>> > > > > > > > > > > >> >> >>>>>>>> ClusterClient >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> first >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> and >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> then >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> create ContextEnvironment >>> > > > based >>> > > > > > on the >>> > > > > > > > > > > >> >> >>>>>>> ClusterClient >>> > > > > > > > > > > >> >> >>>>>>>>>>> and >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> then >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> run >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> job. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> - Job cancelation. Flink >>> > will >>> > > > > > create >>> > > > > > > > > > > >> >> >>>>>> ClusterClient >>> > > > > > > > > > > >> >> >>>>>>>>>>> first >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> and >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> then >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> cancel >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> this job via this >>> > > > ClusterClient. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> As you can see in the >>> > above 3 >>> > > > > > > > scenarios. >>> > > > > > > > > > > >> >> >>> Flink >>> > > > > > > > > > > >> >> >>>>>> didn't >>> > > > > > > > > > > >> >> >>>>>>>>>>> use the >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> same >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> approach(code path) to >>> > interact >>> > > > > > with >>> > > > > > > > > flink >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> What I propose is >>> > following: >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> Create the proper >>> > > > > > > > > > > >> >> >>>>>> LocalEnvironment/RemoteEnvironment >>> > > > > > > > > > > >> >> >>>>>>>>>>> (based >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> on >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> user >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> configuration) --> Use >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> this >>> > > > > > Environment >>> > > > > > > > > to >>> > > > > > > > > > > >> >> >>>> create >>> > > > > > > > > > > >> >> >>>>>>>> proper >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> ClusterClient >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> (LocalClusterClient or >>> > > > > > > > RestClusterClient) >>> > > > > > > > > > > >> >> >> to >>> > > > > > > > > > > >> >> >>>>>>>> interactive >>> > > > > > > > > > > >> >> >>>>>>>>>>> with >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> Flink ( >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> job >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> execution or cancelation) >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> This way we can unify the >>> > > > process >>> > > > > > of >>> > > > > > > > > local >>> > > > > > > > > > > >> >> >>>>>> execution >>> > > > > > > > > > > >> >> >>>>>>>> and >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> remote >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> execution. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> And it is much easier for >>> > third >>> > > > > > party >>> > > > > > > > to >>> > > > > > > > > > > >> >> >>>>> integrate >>> > > > > > > > > > > >> >> >>>>>>> with >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> flink, >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> because >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> ExecutionEnvironment is >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> the >>> > > > > unified >>> > > > > > > > entry >>> > > > > > > > > > > >> >> >>> point >>> > > > > > > > > > > >> >> >>>>> for >>> > > > > > > > > > > >> >> >>>>>>>>>>> flink. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> What >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> third >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> party >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> needs to do is just pass >>> > > > > > configuration >>> > > > > > > > to >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> ExecutionEnvironment >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> and >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> ExecutionEnvironment will >>> > do >>> > > > the >>> > > > > > right >>> > > > > > > > > > > >> >> >> thing >>> > > > > > > > > > > >> >> >>>>> based >>> > > > > > > > > > > >> >> >>>>>> on >>> > > > > > > > > > > >> >> >>>>>>>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> configuration. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> Flink cli can also be >>> > > > considered >>> > > > > as >>> > > > > > > > flink >>> > > > > > > > > > > >> >> >> api >>> > > > > > > > > > > >> >> >>>>>>> consumer. >>> > > > > > > > > > > >> >> >>>>>>>>>>> it >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> just >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> pass >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> the >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> configuration to >>> > > > > > ExecutionEnvironment >>> > > > > > > > and >>> > > > > > > > > > > >> >> >> let >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> ExecutionEnvironment >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> to >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> create the proper >>> > ClusterClient >>> > > > > > instead >>> > > > > > > > > of >>> > > > > > > > > > > >> >> >>>>> letting >>> > > > > > > > > > > >> >> >>>>>>> cli >>> > > > > > > > > > > >> >> >>>>>>>> to >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> create >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> ClusterClient directly. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> 6 would involve large code >>> > > > > > refactoring, >>> > > > > > > > > so >>> > > > > > > > > > > >> >> >> I >>> > > > > > > > > > > >> >> >>>>> think >>> > > > > > > > > > > >> >> >>>>>> we >>> > > > > > > > > > > >> >> >>>>>>>> can >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> defer >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> it >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> for >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> future release, 1,2,3,4,5 >>> > could >>> > > > > be >>> > > > > > done >>> > > > > > > > > at >>> > > > > > > > > > > >> >> >>>> once I >>> > > > > > > > > > > >> >> >>>>>>>>>>> believe. >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> Let >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> me >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> know >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> your >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> comments and feedback, >>> > thanks >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> -- >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> Best Regards >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> Jeff Zhang >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> -- >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> Best Regards >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> Jeff Zhang >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> -- >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> Best Regards >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> Jeff Zhang >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> -- >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> Best Regards >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> Jeff Zhang >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>> -- >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>> Best Regards >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>>> Jeff Zhang >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> -- >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> Best Regards >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> Jeff Zhang >>> > > > > > > > > > > >> >> >>>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>> -- >>> > > > > > > > > > > >> >> >>>>>>>> Best Regards >>> > > > > > > > > > > >> >> >>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>>> Jeff Zhang >>> > > > > > > > > > > >> >> >>>>>>>> >>> > > > > > > > > > > >> >> >>>>>>> >>> > > > > > > > > > > >> >> >>>>>> >>> > > > > > > > > > > >> >> >>>>> >>> > > > > > > > > > > >> >> >>>>> >>> > > > > > > > > > > >> >> >>>>> -- >>> > > > > > > > > > > >> >> >>>>> Best Regards >>> > > > > > > > > > > >> >> >>>>> >>> > > > > > > > > > > >> >> >>>>> Jeff Zhang >>> > > > > > > > > > > >> >> >>>>> >>> > > > > > > > > > > >> >> >>>> >>> > > > > > > > > > > >> >> >>> >>> > > > > > > > > > > >> >> >> >>> > > > > > > > > > > >> >> > >>> > > > > > > > > > > >> >> > >>> > > > > > > > > > > >> >> > -- >>> > > > > > > > > > > >> >> > Best Regards >>> > > > > > > > > > > >> >> > >>> > > > > > > > > > > >> >> > Jeff Zhang >>> > > > > > > > > > > >> >> >>> > > > > > > > > > > >> >> >>> > > > > > > > > > > >> >>> > > > > > > > > > > > >>> > > > > > > > > > > > >>> > > > > > > > > > > >>> > > > > > > > > > >>> > > > > > > > > >>> > > > > > > > >>> > > > > > >>> > > > > > >>> > > > > >>> > > > >>> > >>> >>> >>> -- >>> Best Regards >>> >>> Jeff Zhang