Hi everyone,

Sorry for the incorrect message in my last email. I want to start the vote
on Wednesday
as long as there are no questions in this period.

Best,
Yu Zelin

On Tue, Dec 13, 2022 at 5:08 PM yu zelin <yuzelin....@gmail.com> wrote:

> Hi, everyone,
>
> Looks like our new design is similar to Timo’s suggestion, and considering
> that there has
> no response from other devs for a long time, I want to start the vote on
> Thursday.
>
>
> Best,
> Yu Zelin
>
> 2022年12月13日 16:23,yu zelin <yuzelin....@gmail.com> 写道:
>
> Hi, Timo,
>
> Thanks for your suggestion. Recently I have discussed with @Godfrey He,
> @Shengkai Fang
> and @Jark Wu about the `RowFormat` (Thanks for all your suggestions). We
> finally came to
> a consensus which is similar to your suggestion. The details are as
> follows:
>
> 1. Add a REST query parameter ‘*RowFormat*’ = JSON/PLAIN_TEXT to tell the
> REST Endpoint
> how to deserialize the RowData int ResultSet.
>
>     JSON format means the RowData will be serialized to JSON format, which
> contains original
> *    LogicalType* information, so it can be deserialized back to RowData.
>
>     PLAIN_TEXT format means the RowData will be serialized to
> SQL-compliant, plain strings.
>     The SQL Client can print the strings directly.
>
> The example URI for fetching results is:
> > /v2/sessions/:session_handle/operations/:operation_handle/result/:token?
> rowFormat=PLAIN_TEXT
>
> 2. Introduce two response bodies for fetching results in two formats.
>
> For more details, please take a look at the FLIP [
> https://cwiki.apache.org/confluence/x/T48ODg].
> I have updated it with an example of query response bodies in two format
> in section:
> Public Interface -> REST Endpoint Modification.
>
> 2022年12月12日 18:09,Timo Walther <twal...@apache.org> 写道:
>
> Hi everyone,
>
> sorry to jump into this discussion so late.
>
> > So we decided to revert the RowFormat related changes and let the client
> to resolve the print format.
>
> Could you elaborate a bit on this topic in the FLIP? I still believe that
> we need 2 types of output formats.
>
> Format A: for the SQL Client CLI and other interactive notebooks that just
> uses SQL CAST(... AS STRING) semantics executed on the server side
>
> Format B: for JDBC SDK or other machine-readable downstream libraries
>
> Take a TIMESTAMP WITH LOCAL TIME ZONE as an example. The string
> representation depends on a session configuration option. Clients might not
> be aware of this session option, so the formatting must happen on the
> server side.
>
> However, when the downstream consumer is a library, maybe the library
> would like to get the raw millis/nanos since epoch.
>
> Also nested rows and collections might be better encoded with format B for
> libraries but interactive sessions are happy if nested types are already
> formatted server-side, so not every client needs custom code for the
> formatting.
>
> Regards,
> Timo
>
>
>
> On 06.12.22 15:13, godfrey he wrote:
>
> Hi, zeklin
>
> The CLI will use default print style for the non-query result.
>
> Please make sure the print results of EXPLAIN/DESC/SHOW CREATE TABLE
> commands are clear.
>
> We think it’s better to add the root cause to the ErrorResponseBody.
>
> LGTM
> Best,
> Godfrey
> yu zelin <yuzelin....@gmail.com> 于2022年12月6日周二 17:51写道:
>
>
> Hi, Godfrey
>
> Thanks for your feedback. Below is my thoughts about your questions.
>
> 1. About RowFormat.
> I agree to your opinion. So we decided to revert the RowFormat related
> changes
> and let the client to resolve the print format.
>
> 2. About ContentType
> I agree that the definition of the ContentType is not clear. But how to
> define the
> statement type is another big question. So, we decided to only tell the
> query result
> and non-query result apart. The CLI will use default print style for the
> non-query
> result.
>
> 3. About ErrorHandling
> I think reuse the current ErrorResponseBody is good, but parse the root
> cause
> from the exception stack strings is quite hacking. We think it’s better to
> add the
> root cause to the ErrorResponseBody.
>
> 4. About Runtime REST API Modifications
> I agree, too. This part is moved to the ‘Future Work’.
>
> Best,
> Yu Zelin
>
>
> 2022年12月5日 18:33,godfrey he <godfre...@gmail.com> 写道:
>
> Hi Zelin,
>
> Thanks for driving this discussion.
>
> I have a few comments,
>
> Add RowFormat to ResultSet to indicate the format of rows.
>
> We should not require SqlGateway server to meet the display
> requirements of a CliClient.
> Because different CliClients may have different display style. The
> server just need to response the data,
> and the CliClient prints the result as needed. So RowFormat is not needed.
>
> Add ContentType to ResultSet to indicate what kind of data the result
> contains.
>
> from my first sight, the values of ContentType are intersected, such
> as: A select query will return QUERY_RESULT,
> but it also has JOB_ID. OTHER is too ambiguous, I don't know which
> kind of query will return OTHER.
> I recommend returning the concrete type for each statement, such as
> "CREATE TABLE" for "create table xx (...) with ()",
> "SELECT" for "select * from xxx". The statement type can be maintained
> in `Operation`s.
>
> Error Handling
>
> I think current design of error handling mechanism can meet the
> requirement of CliClient, we can get the root cause from
> the stack (see ErrorResponseBody#errors). If it becomes a common
> requirement (for many clients) in the future,
> we can introduce this interface.
>
> Runtime REST API Modification for Local Client Migration
>
> I think this part is over-engineered, this part belongs to optimization.
> The client does not require very high performance, the current design
> can already meet our needs.
> If we find performance problems in the future, do such optimizations.
>
> Best,
> Godfrey
>
> yu zelin <yuzelin....@gmail.com> 于2022年12月5日周一 11:11写道:
>
>
> Hi, Shammon
>
> Thanks for your feedback. I think it’s good to support jdbc-sdk. However,
> it's not supported in the gateway side yet. In my opinion, this FLIP is
> more
> concerned with the SQL Client. How about put “supporting jdbc-sdk” in
> ‘Future Work’? We can discuss how to implement it in another thread.
>
> Best,
> Yu Zelin
>
> 2022年12月2日 18:12,Shammon FY <zjur...@gmail.com> 写道:
>
> Hi zelin
>
> Thanks for driving this discussion.
>
> I notice that the sql-client will interact with sql-gateway by `REST
> Client` in the `Executor` in the FLIP, how about introducing jdbc-sdk for
> sql-gateway?
>
> Then the sql-client can connect the gateway with jdbc-sdk, on the other
> hand, the other applications and tools such as jmeter can use the jdbc-sdk
> to connect sql-gateway too.
>
> Best,
> Shammon
>
>
> On Fri, Dec 2, 2022 at 4:10 PM yu zelin <yuzelin....@gmail.com> wrote:
>
> Hi Jim,
>
> Thanks for your feedback!
>
> Should this configuration be mentioned in the FLIP?
>
>
> Sure.
>
> some way for the server to be able to limit the number of requests it
>
> receives.
> I’m sorry that this FLIP is dedicated in implementing the Remote mode, so
> we
> didn't consider much about this. I think the option is enough currently.
> I will add
> the improvement suggestions to the ‘Future Work’.
>
> I wonder if two other options are possible
>
>
> To forward the raw format to gateway and then to client is possible. The
> raw
> results from sink is in ‘CollectResultIterator#bufferedResult’. First, we
> can find
> a way to get this result without wrapping it. Second, constructing a
> ‘InternalTypeInfo’.
> We can construct it using the schema information (data’s logical type).
> After
> construction, we can get the ’TypeSerializer’ to deserialize the raw
> result.
>
>
>
>
> 2022年12月1日 04:54,Jim Hughes <jhug...@confluent.io.INVALID> 写道:
>
> Hi Yu,
>
> Thanks for moving my comments to this thread!  Also, thank you for
> answering my questions; it is helping me understand the SQL Gateway
> better.
>
> 5.
>
> Our idea is to introduce a new session option (like
>
> 'sql-client.result.fetch-interval') to control
> the fetching requests sending frequency. What do you think?
>
> Should this configuration be mentioned in the FLIP?
>
> One slight concern I have with having 'sql-client.result.fetch-interval'
>
> as
>
> a session configuration is that users could set it low and cause the
>
> client
>
> to send a large volume of requests to the SQL gateway.
>
> Generally, I'd like to see some way for the server to be able to limit
>
> the
>
> number of requests it receives.  If that really needs to be done by a
>
> proxy
>
> in front of the SQL gateway, that is fine as well.  (To be clear, I don't
> think my concern here should be blocking in any way.)
>
> 7.
>
> What is the serialization lifecycle for results?
>
>
> I wonder if two other options are possible:
> 3) Could the Gateway just forward the result byte array?  (Or does the
> Gateway need to deserialize the response in order to understand it for
>
> some
>
> reason?)
> 4) Could the JobManager prepare the results in JSON?  (Or similarly could
> the Client read the format which the JobManager sends?)
>
> Thanks again!
>
> Cheers,
>
> Jim
>
> On Wed, Nov 30, 2022 at 9:40 AM yu zelin <yuzelin....@gmail.com> wrote:
>
> Hi, all
>
> Thanks Jim’s questions below. Here I’d like to reply to them.
>
> 1. For the Client Parser, is it going to work with the extended syntax
> from the Flink Table Store?
>
> 2. Relatedly, what will happen if an older Client tries to handle
>
> syntax
>
> that a newer service supports?  (Suppose I use a 1.17 client with a
>
> 1.18
>
> Gateway/system which has a new keyword.  Is there anything we should
>
> be
>
> designing for upfront?)
>
> 3. How will client and server version mismatches be handled?  Will a
> single gateway be able to support multiple endpoint versions?
> 4. How are commands which change a session handled?  Are those sent
>
> via
>
> an ExecuteStatementRequest?
>
> 5. The remote POC uses polling for getting back status and getting
>
> back
>
> results.  Would it be possible to switch to web sockets or some other
> mechanism to avoid polling?  If polling is used for both, the polling
> frequency should be different between local and remote configurations.
>
> 6. What does this sentence mean?  "The reason why we didn't get the
>
> sql
>
> type in client side is because it's hard for the lightweight
>
> client-level
>
> parser to recognize some sql type  sql, such as query with CTE.  "
>
> 7. What is the serialization lifecycle for results?  It makes sense to
> have some control over whether the gateway returns results as SQL or
>
> JSON.
>
> I'd love to see a way to avoid needing to serialize and deserialize
>
> results
>
> on the SQL Gateway if possible.  I'm still new enough to the project
>
> that
>
> I'm not sure if that's readily possible.  Maybe the SQL Gateway's
>
> return
>
> type can be sent as part of the request so that the JobManager can
>
> send
>
> back results in an advantageous format?
>
> 8. Does ErrorType need to be marked as @PublicEvolving?
>
> I'm excited for the SQL client to support gateway mode!  Given the
>
> change
>
> in design, do you think it'll still be part of the Flink 1.17 release?
>
>
> 1.  ClientParser can work with new (and unknown) SQL syntax. It is
>
> because
>
> if the
> sql type is not recognized, the sql will be submitted to the gateway
> directly.
>
> For more information: Actually, the proposed ClientParser only do two
> things:
> (1) Tell client commands (help, clear, etc) and sqls apart.
> (2) parses several sql types (e.g. SHOW CREATE statement, we can print
>
> raw
>
> string
> for the SHOW CREATE result instead of table). Here the recognization of
> sql types
> mostly affects the print style, and unrecognized sql also can be
>
> submitted
>
> to cluster.
> So the Client with new ClientParser can work compatible with new syntax.
>
> 2. First, I'd like to explain that the gateway APIs and supported syntax
> is two things.
> For example, ‘configureSession' and 'completeStatement' are APIs. As
> mentioned
> in #1, the sql statements which syntax is unknown will be submitted to
>
> the
>
> gateway,
> and whether they can be executed normally depends on whether the
>
> execution
>
> environment supports the syntax.
>
> Is there anything we should be designing for upfront?
>
>
> The 'SqlGatewayRestAPIVersion’ has been introduced. But it is for sql
> gateway APIs.
>
> 3.
>
> How will client and server version mismatches be handled?
>
>
> A lower version client can work compatible with a higher version gateway
> because the
> old interfaces won’t be deleted. When a higher version client connects
>
> to
>
> a lower version
> gateway, the client should notify the users if they try to use
>
> unsupported
>
> features. For
> example, the client start option ‘-i’  means using initialization file
>
> to
>
> initialize the session.
> We plan to use the gateway’s ‘configureSession’ to implement it. But
>
> this
>
> API is not
> implemented in 1.16 Gateway (SqlGatewayRestAPIVersion = V1), so if the
> user try to
> use ‘-i’ option to start the client with the 1.16 gateway, the client
> should tell the user that
> Can’t execute ‘-i’ option with gateway which version is lower than V2.
>
> Will a single gateway be able to support multiple endpoint versions?
>
>
> Currently, the gateway only starts a highest version endpoint and the
> higher version endpoint
> is compatible with the lower version endpoint’s protocol.
>
> 4. Yes. Mostly, we use ’SET’ and ‘RESET’ statements to change the
>
> session
>
> configuration.
> Notice: the client can’t change the session (I mean, close current
>
> session
>
> and open another
> one). I’m not sure if you have need to change the session itself?
>
> 5.
>
> Would it be possible to switch to web sockets or some other mechanism
>
> to avoid polling?
>
> Your suggestion is very good, but this flip is for supporting the remote
> client. How about taking
> it as a future work?
>
> If polling is used for both, the polling frequency should be different
>
> between local and remote
> configurations.
>
> Our idea is to introduce a new session option (like
> 'sql-client.result.fetch-interval') to control
> the fetching requests sending frequency. What do you think?
>
> For more information: we are inclined to keep the polling behavior in
>
> this
>
> version. For streaming
> query, fetching results synchronously may occupy resources of the
>
> gateway
>
> in a long period.
> For example, if the job doesn’t return results for a long time because
>
> the
>
> window has not been
> triggered, the synchronously fetching will keep occupying the
>
> connection.
>
> In asynchronous
> situation, the gateway can return a NOT_READY_RESULT quickly and release
> the resources
> for other clients to use. I think we can make some improvements for the
> whole flow path in the
> future.
>
> 6. Sorry for that there is mistakes in this sentence. Let me make it
>
> clear.
>
>
> We proposed to add 'ContentType' to indicates the result is for what
>
> kind
>
> of sql. In this sentence,
> I want to explain why we add 'ContentType' since the ClientParser can
> recognize the sql type too.
> It is because the proposed ClientParser can't recognize complex syntax.
> For example, it can’t
> recognize query with CTE. So the result should carry content type
> information to help the client to
> know the sql type. For example, the 'ContentType.QUERY_RESULT' indicates
> the result is for a
> query statement.
>
> 7.
>
> What is the serialization lifecycle for results?
>
>
> 1) Sink to JobManager        : RowData -> Byte[ ] (serialize)
> 2) JobManager to Gateway : Byte[ ] -> RowData (deserialize)
> 3) Gateway sending            : RowData -> Byte[ ] (serialized to JSON
> format)
> 4) Client receiving               : Byte[ ] -> RowData (deserialize)
>
> Maybe the SQL Gateway's return type can be sent as part of the request
>
> so that the
> JobManager can send  back results in an advantageous format?
>
> Yes. I think it's an improvement for the Client and Gateway. We have
>
> some
>
> ideas. For example,
>
> 1) We can move the Gateway into the JobManager and reduce the Ser/De
>
> costs
>
> from JM to Gateway.
> 2) Or the Gateway can collect the data from the sink function directly
> instead of JobManager.
>
> But I think we can leave this as a future work and discuss in another
> thread.
>
> 8. Yes.
>
> Do you think it'll still be part of the Flink 1.17 release?
>
> Yes. We will try our best to finish the work.
>
> Feel free to talk to me if I’m wrong or you have any other questions.
>
>
> 2022年11月25日 11:48,yu zelin <yuzelin....@gmail.com> 写道:
>
> Hi, all
>
> I want to initiate a discussion on the FLIP-275: Support Remote SQL
>
> Client Based on SQL Gateway[1].
>
> The motivation of this FLIP is that the current SQL Client allows only
>
> local connection which can not satisfy
>
> the common need of connecting to a remote cluster.
>
> Since the FLIP-91[2] has introduced SQL Gateway, we proposed to
>
> implement the Remote SQL Client
>
> based on SQL Gateway. In our design, we proposed two main changes:
>
> 1. New remote mode client which performs connection to the remote
>
> gateway through REST API.
>
> 2. Migration of the current local mode client. We proposed to refactor
>
> the local client based on SQL Gateway
>
> to unify the interface for two modes.
>
> Looking forward to your suggestions.
>
> Best,
> Yu Zelin
>
> [1] https://cwiki.apache.org/confluence/x/T48ODg
> [2] https://cwiki.apache.org/confluence/x/rIyMC
>
>
>
>
>
>
>
>
>
>
>

Reply via email to