Thank Shengkai for the new round of updating.
I don't have comments on the updates.
+1 for starting the vote.

Best,
Jark

On Thu, 19 May 2022 at 20:18, Shengkai Fang <fskm...@gmail.com> wrote:

> Hi, Timo.
>
> Thanks for your feedback!
>
>  > SQLGatewayService.getFunction / UserDefinedFunctionInfo
>
> Yes. I miss some parts in the FLIP. I have fix the errors now.
>
>  > configure_session
>
> Thanks for your inputs. Considering the difference, I am still prone to use
> the `configure_session`.
>
>  > `./sql-gateway.sh`
>
> Yes, you are right. We should add a new startup script in the distribution.
> I update the FLIP and add the description to uses the script. Users can
> - start the server with `./sql-gateway.sh start -Dkey=value`
> - stop the last started server  with `./sql-gateway.sh stop`
> - stop all the running server with `./sql-gateway.sh stop-all`
>
> >  an "-e" converts a client to a server
> The "-e" options is just used to connect to the Gateway with the specified
> endpoint. It doesn't  convert the client to the server.
>
> Thank everyone for all the inputs and discussion. If no other problems, I
> think we can restart the voting tomorrow.
>
> Best,
> Shengkai
>
>
> Timo Walther <twal...@apache.org> 于2022年5月19日周四 15:27写道:
>
> > Hi Shengkai,
> >
> > thanks again for the update. I don't have much to add:
> >
> >  > I still think we should use a new state machine
> >
> > Thanks for the explanation about async/sync behavior. I thought we also
> > want to use the Gateway for job status updates. But if FINISHED only
> > refers to the job submission, the new state machine makes more sense.
> > Nevertheless, checking the job status will be a frequent request esp.
> > also for the new lifecycle statements. But I agree to the current design
> > that this is different to state of the operation.
> >
> >  > SQLGatewayService.getFunction / UserDefinedFunctionInfo
> >
> > You forgot to update the class. There is still a UserDefinedFunctionInfo
> > in the FLIP.
> >
> >  > configure_session
> >
> > I don't have a strong opinion on the naming of this particular REST
> > path. But my concern is that we should introduce a term of this family
> > of init/configure statements. Because in SQL Client we call it `init
> > statements` and in the gateway we call it `configuration statements`,
> > but in the end is all statements that are `not DML and DQL`.
> >
> >  > './sql-client.h -e'
> >
> > Would it make sense to introduce a separate `./sql-gateway.sh`? I find
> > it a bit confusing that an "-e" converts a client to a server. Under the
> > hood we can still share the same classes but make it a bit more explicit
> > in the distribution (also for marketing purposes of this feature).
> >
> > Please continue with the voting afterwards.
> >
> > Regards,
> > Timo
> >
> > On 17.05.22 09:14, Shengkai Fang wrote:
> > > Hi, all.
> > >
> > > After discussing with Becket Qin offline, I modified the FLIP a little.
> > The
> > > change is as follow:
> > >
> > > 1. Add /api_versions in the REST API.
> > >
> > > The api is used by the client to know the current REST Endpoint
> supports
> > > which version. The client is able to choose the version for later
> > > communication.
> > >
> > > 2. SqlClient uses -e option to input the endpoint address and port.
> > >
> > > Because the -h option has already been used by the SqlClient. We use
> the
> > > -e, --endpoint for SqlClient to input the address:port of the endpoint.
> > >
> > > 3. Use './sql-client.h -e' to start the gateway mode rather than
> > > '/sql-client.h gateway -e'.
> > >
> > > If the user specifies the -e option, it definitely means to use the
> > gateway
> > > mode. Therefore, it is redundant to use another keyword to indicate the
> > > mode.
> > >
> > > Best,
> > > Shengkai
> > >
> > > Shengkai Fang <fskm...@gmail.com> 于2022年5月17日周二 14:13写道:
> > >
> > >> Hi, Jark, Timo. Nice to have an agreement!
> > >>
> > >> Thanks for Jark's inputs about the multiple version Flink. I have
> > already
> > >> updated the FLIP in the rejected alternatives about details.
> > >>
> > >> 1. We should definitely just use LogicalTypeJsonSerializer and not a
> > >> second JSON representation.
> > >>
> > >> Our concern is mainly that it's hard for users to use because of the
> > >> flexible structure. The LogicalTypeJsonSerializer will serialize the
> > >> VARCHAR to "VARCHAR(<LENGTH>)" or "{\"TYPE\": \"VARCHAR\", \"LENGTH\":
> > 0}",
> > >> which requires the end users to process the different situations. But
> in
> > >> some cases, users just print the json to the terminal/web UI.  WDYT?
> > >>
> > >>> Serialize the RowData
> > >>
> > >> Sure. I will keep your advice in mind. I think the current
> serialization
> > >> of the RowData will not use the column name as the Object key in the
> > json.
> > >> I am not sure whether I missed something. It would be nice if you can
> > give
> > >> me an example if I do something wrong.
> > >>
> > >>> Have you also thought about using Flink's state types from Flink
> > >> tasks/jobs?
> > >>
> > >> Yes. But I still think we should use a new state machine. First of
> all,
> > >> Operation in the FLIP is much different from the Job. Operations
> include
> > >> DDL, DML and so on. So it's not suitable to use the small concept to
> > >> replace the big concept. Actually some status in the JobStatus, e.g.
> > >> RESTARTING/SUSPENDED/RECONCILING don't work in the DDL Operation.
> > >>
> > >> On the other hand, the Gateway allows users to submit jobs(DML) in
> > >> sync/async mode. The running status in the Operation Status in the
> > >> different mode has different meaning:
> > >> - In the async mode, when the gateway submits the job, the state comes
> > to
> > >> the FINISHED state
> > >> - In the sync mode, the running status in the Operation status
> includes
> > >> submitting the job, running job. Even if a failover occurs, we still
> > think
> > >> that this Operation is in the RUNNING state. Unless the job is
> > >> unrecoverable, we change the Operation status to ERROR.
> > >>
> > >> Therefore, I think these two concepts are not consistent and we should
> > not
> > >> reuse the JobStatus. I add a section in the rejected alternatives.
> > >>
> > >>> Options to configure the REST endpoint
> > >>
> > >> Yes. I have modified the FLIP about this.
> > >>
> > >>> Naming conversion
> > >>
> > >> Yes. I have modified the FLIP with your suggestions.
> > >>
> > >>> Another smaller shortcomings in the FLIP
> > >>
> > >>>> SQLGatewayService.getFunction / UserDefinedFunctionInfo
> > >>
> > >> After reviewing the java.sql.DatabaseMetaData#getFunctions's java
> doc, I
> > >> find it will return the system and user functions available in the
> > Catalog.
> > >> I think you are right. Therefore, we'd better to rename to the
> > >> listFunctions(SessionHandle sessionHandle, OperationHandle
> > operationHandle,
> > >> String catalog, String database, ShowFunctionsOperation.FunctionScope)
> > and
> > >> it returns FunctionInfo.
> > >>
> > >>>> SQLGatewayService.getGatewayInfo()/getSessionConfig
> > >>
> > >> The result of the SQLGatewayService.getGatewayInfo and
> getSessionConfig
> > is
> > >> not used by the endpoint. The endpoint just serializes the result and
> > >> presents it to the users. If we use the ReadableConfig, it's hard for
> > us to
> > >> iterate all the key value pairs.
> > >>
> > >>> configure_session VS initialize_session
> > >>>> If calling it initialize_session, should we limit it only being
> called
> > >> once?
> > >>
> > >> If we limit it only being called once, it allows the input of the
> > >> initialize_session script. But the current design in the Gateway is
> > aligned
> > >> with the TableEnvironment#executeSql. That is, the input of the
> > statement
> > >> is a single statement rather than the script. Considering the API in
> the
> > >> FLIP is not as same as the initialization in the CLI, I think we can
> use
> > >> the configure_session? What do you think, Timo?
> > >>
> > >> Best,
> > >> Shengkai
> > >>
> > >>
> > >>
> > >>
> > >>
> > >>
> > >>
> > >> Timo Walther <twal...@apache.org> 于2022年5月16日周一 14:28写道:
> > >>
> > >>> Hi Shengkai, Hi Jark,
> > >>>
> > >>> thanks for the additional explanation and the update of the FLIP.
> This
> > >>> will help us in the future for documenting our decisions. The
> arguments
> > >>> why to include the Gateway into the main repo make a lot of sense to
> > me.
> > >>> Esp. also because both CLI and gateway need some parsing
> functionality
> > >>> that is dependent on the current state of the SQL syntax.
> > >>>
> > >>> Here is my last set of feedback, other than that +1 for the proposal:
> > >>>
> > >>> Serialize the LogicalType
> > >>>
> > >>> The FLIP mentions LogicalTypeJsonSerializer but the shown JSON is
> > >>> different from the current master. We are using the serializable
> > >>> representation of LogicalType as much as possible nowadays. We should
> > >>> definitely just use LogicalTypeJsonSerializer and not a second JSON
> > >>> representation.
> > >>>
> > >>> 1) Serialize the RowData
> > >>>
> > >>> Side note for serializing ROWs: we should not use field names in JSON
> > >>> object keys. As e.g. `null` and other names with special characters
> > >>> cause issues in JSON.
> > >>>
> > >>> 2) We propose the state machine like HiveServer2
> > >>>
> > >>> Have you also thought about using Flink's state types from Flink
> > >>> tasks/jobs? If we were using Flink types directly, it would be easier
> > to
> > >>> monitor the execution of a INSERT INTO job via the gateway without
> > >>> having to map state types. Monitoring jobs is the most important
> > >>> functionality and should be in sync with regular Flink job
> monitoring.
> > A
> > >>> HiveServer2 endpoint can still perform mapping if necessary, but
> within
> > >>> the Flink code base we use a consistent state transition scheme.
> > >>>
> > >>> 3) Options to configure the REST endpoint
> > >>>
> > >>> Given that we also want to be able to put endpoint options into
> > >>> flink-conf.yaml, we should make those option a bit more globally
> > >>> understandable:
> > >>>
> > >>> endpoint.type -> sql-gateway.endpoint.type
> > >>> endpoint.rest.port -> sql-gateway.endpoint.rest.port
> > >>> ...
> > >>>
> > >>> 4) Naming conversion
> > >>>
> > >>> This is very nit picking, but please make sure to name the interfaces
> > >>> consistently for abbreviations. Currently, we mostly use
> `SqlInterface`
> > >>> instead of `SQLInterface`. So in the FLIP:
> > >>>
> > >>> SQLGatewayEndpoint -> SqlGatewayEndpoint
> > >>> SQLGatewayEndpointFactory -> SqlGatewayEndpointFactory
> > >>> e.g. for REST we do it already: RestEndpointVersion
> > >>>
> > >>> 5) Another smaller shortcomings in the FLIP
> > >>>
> > >>> SQLGatewayService.getFunction / UserDefinedFunctionInfo
> > >>> Was it a conscious decision to not use FunctionIdentifier here? You
> > will
> > >>> not be able to list system functions.
> > >>>
> > >>> SQLGatewayService.getGatewayInfo()/getSessionConfig
> > >>> Why not returning ReadableConfig here?
> > >>>
> > >>> Thanks,
> > >>> Timo
> > >>>
> > >>>
> > >>>
> > >>>
> > >>> On 12.05.22 17:02, Jark Wu wrote:
> > >>>> Hi Shengkai,
> > >>>>
> > >>>> One comment on the configure_session VS initialize_session,
> > >>>> I think configure_session is better than initialize_session,
> > >>>> because "initialize" sounds like this method can only be invoked
> once.
> > >>>> But I can see this method is useful to be invoked several times to
> > >>>> configure
> > >>>> the session during the lifecycle of a session. If calling it
> > >>>> initialize_session,
> > >>>> should we limit it only be called once?
> > >>>>
> > >>>> Best,
> > >>>> Jark
> > >>>>
> > >>>>
> > >>>>
> > >>>> On Thu, 12 May 2022 at 22:38, Jark Wu <imj...@gmail.com
> > >>>> <mailto:imj...@gmail.com>> wrote:
> > >>>>
> > >>>>      Hi Timo,
> > >>>>
> > >>>>      I agree with Shengkai that we should keep Gateway in the Flink
> > main
> > >>>>      repo.
> > >>>>      Here are my thoughts:
> > >>>>
> > >>>>      1) It is not feasible and maintainable to invoke different
> > versions
> > >>>>      of Flink dependencies
> > >>>>      in one JVM. I'm afraid it would be a nightmare when the code is
> > >>>>      messed up with all the reflections.
> > >>>>
> > >>>>      2) Actually, it's very mature to support submitting
> > multi-version by
> > >>>>      deploying one
> > >>>>      gateway process for one version. Many systems are following
> this
> > >>>>      architecture as Shengkai
> > >>>>      mentioned above, including the Ververica Platform. And I don't
> > see
> > >>>>      any problem with it.
> > >>>>
> > >>>>      3) As Jingsong said, SQL CLI should build on top of Gateway to
> > share
> > >>>>      code and have the ability to
> > >>>>        connect to Gateway. If SQL CLI is still kept in the Flink
> > repo, we
> > >>>>      have to put Gateway there as well.
> > >>>>
> > >>>>      4) Besides, Gateway is indispensable for a SQL engine (think of
> > >>>>      Trino/Presto, Spark, Hive).
> > >>>>      Otherwise, Flink will always be a processing system. With
> Gateway
> > >>>>      inside the Flink repo,
> > >>>>      we can provide an out-of-box experience as a SQL query engine.
> > Users
> > >>>>      can try out the gateway
> > >>>>      for the latest version when a new version is released.
> > >>>>
> > >>>>      5) Last, Gateway inside the Flink repo can ensure the highest
> > degree
> > >>>>      of version compatibility.
> > >>>>
> > >>>>      Best,
> > >>>>      Jark
> > >>>>
> > >>>>
> > >>>>      On Thu, 12 May 2022 at 19:19, Shengkai Fang <fskm...@gmail.com
> > >>>>      <mailto:fskm...@gmail.com>> wrote:
> > >>>>
> > >>>>          Hi Timo.
> > >>>>
> > >>>>          Thanks for your feedback!
> > >>>>
> > >>>>           > It would be great if you can copy/paste some of the
> tricky
> > >>> design
> > >>>>          decisions into the FLIP.
> > >>>>
> > >>>>          Yes. I have already added a section about the `Rejected
> > >>>>          Alternatives`. It
> > >>>>          includes the discuss about the
> > >>>>          - TableInfo and FunctionInfo VS CatalogTable and
> > CatalogFunction
> > >>>>          - Support the multi-version Flink in the Gateway VS Support
> > the
> > >>>>          multi-version in the external Service
> > >>>>          - Merge Gateway into the Flink code base VS Support Gateway
> > in
> > >>>>          the another
> > >>>>          repo
> > >>>>          ...
> > >>>>
> > >>>>
> > >>>>           > Separate code base
> > >>>>
> > >>>>          Let me summarize all the discussion about the separate code
> > >>>>          base. Please
> > >>>>          correct me if anything is wrong.
> > >>>>
> > >>>>
> > >>>>          About support for the Gateway in the Flink code base.
> > >>>>
> > >>>>
> > >>>>          1. It reduces the cost including tests, release and
> > document. We
> > >>>>          don't need
> > >>>>          to upgrade the Gateway when Flink releases.
> > >>>>          2. The SQL Client has the ability to submit the SQL to the
> > >>>>          Gateway. If we
> > >>>>          move the Gateway to the outside repo, the SQL Client
> doesn't
> > >>>>          have the
> > >>>>          related dependencies.
> > >>>>          3. It is benefit for us to reuse code in the same repo.
> > >>>>
> > >>>>          About supporting the Gateway in another repo.
> > >>>>
> > >>>>          1. It is easier to support the multi-version Flink;
> > >>>>
> > >>>>
> > >>>>          First of all, I think we should support the multiple Flink
> > >>>>          version with
> > >>>>          another component that uses the Gateway from the individual
> > >>>>          Flink releases.
> > >>>>          Zeppelin, Livy, and Kyuubi all use similar architecture.
> > >>>>
> > >>>>          The current Gateway in the FLIP is bound to the specific
> > Flink
> > >>>>          version,
> > >>>>          which needs to compile the SQL and submit the job to the
> > cluster
> > >>>>          with the
> > >>>>          specified Flink version.
> > >>>>          We can introduce a service in the future(Maybe we can name
> it
> > >>>>          MultipleVersionFlinkService? ). It may tell the client
> where
> > the
> > >>>>          Gateway
> > >>>>          with specified version is and the client just communicate
> > with
> > >>>>          the Gateway
> > >>>>          later. It may also just parse the request,  convert the
> > request
> > >>>>          to the REST
> > >>>>          API in the FLIP and send to the Gateway with specified
> > version.
> > >>>>
> > >>>>          Therefore, I think we should merge the SQL Gateway inside
> the
> > >>>>          Flink repo.
> > >>>>          The MultipleVersionFlinkService may be inside or outside
> the
> > >>> repo.
> > >>>>
> > >>>>          I add more details in the `Rejected Alternatives` in the
> > FLIP.
> > >>>>
> > >>>>           > Missing REST API spec
> > >>>>
> > >>>>          Good point! I add a section in the `Appendix` about the
> > >>>>          serialization of
> > >>>>          the ResultSet. It includes how to serialize the schema,
> > RowData
> > >>> and
> > >>>>          exceptions.
> > >>>>
> > >>>>           > Consistency of concepts
> > >>>>
> > >>>>          configure_session VS initialize_session
> > >>>>
> > >>>>          Okay. I think it's better to use the initialize_session.
> > >>>>
> > >>>>          TableInfo + UserDefinedFunctionInfo  VS  CatalogTable and
> > >>>>          CatalogFunction
> > >>>>
> > >>>>          The CatalogTable and CatalogFunction are much heavier than
> > the
> > >>>>          TableInfo
> > >>>>          and UserDefinedFunction. The CatalogManager requires
> reading
> > >>>>          from the
> > >>>>          Catalog to get the schema. But in the listTables only care
> > about
> > >>>>          the table
> > >>>>          name, which is much lighter. Therefore, we propose to use
> the
> > >>>>          TableInfo
> > >>>>          with required fields.
> > >>>>
> > >>>>           > Result Retrieval
> > >>>>
> > >>>>          Yes. Currently the API is only used for the preview. I
> added
> > a
> > >>>>          section in
> > >>>>          the `Rejected Alternatives` about this.
> > >>>>
> > >>>>          Best,
> > >>>>          Shengkai
> > >>>>
> > >>>
> > >>>
> > >
> >
> >
>

Reply via email to