You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@kylin.apache.org by "ASF GitHub Bot (Jira)" <ji...@apache.org> on 2021/01/04 02:44:00 UTC

[jira] [Commented] (KYLIN-4853) QueryPreparedStatementCache invalid in Spark Query Engine

    [ https://issues.apache.org/jira/browse/KYLIN-4853?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17257907#comment-17257907 ] 

ASF GitHub Bot commented on KYLIN-4853:
---------------------------------------

zzcclp commented on a change in pull request #1532:
URL: https://github.com/apache/kylin/pull/1532#discussion_r551094391



##########
File path: server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java
##########
@@ -708,6 +708,22 @@ private SQLResponse queryWithSqlMassage(SQLRequest sqlRequest) throws Exception
                         borrowPrepareContext = false;
                         preparedContext = createPreparedContext(sqlRequest.getProject(), sqlRequest.getSql());
                     }
+
+                    // when SparkEngine enabled, Execution Plan was created from RelNode directly, RelNode should be cached
+                    if (getConfig().isSparkEngineEnabled()) {
+                        // preparedContext initialized by current thread, put relNode into cache
+                        if (preparedContext.olapRel == null) {
+                            preparedContext.olapRel = QueryContextFacade.current().getOlapRel();
+                            preparedContext.resultType = (QueryContextFacade.current().getResultType());

Review comment:
       Add these code after creating 'PreparedContext' function:
   `
   } catch (NoSuchElementException noElementException) {
                           borrowPrepareContext = false;
                           preparedContext = createPreparedContext(sqlRequest.getProject(), sqlRequest.getSql());
                           preparedContext.olapRel = QueryContextFacade.current().getOlapRel();
                           preparedContext.resultType = (QueryContextFacade.current().getResultType());
                       }
   `




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


> QueryPreparedStatementCache invalid in Spark Query Engine
> ---------------------------------------------------------
>
>                 Key: KYLIN-4853
>                 URL: https://issues.apache.org/jira/browse/KYLIN-4853
>             Project: Kylin
>          Issue Type: Bug
>            Reporter: ShengJun Zheng
>            Priority: Blocker
>
> Prepare statement cache  imported from  KYLIN-3434 get invalid in SparkQuery Engine.
> In SparkQuery Engine, physical plan will be created directly from RelNode, which was not cached, it will cause  prepared statment query fail after first successful query.
> Error Stack like this:
> {code:java}
> ava.sql.SQLException: exception while executing query: java.lang.NullPointerException
>         at org.apache.calcite.avatica.Helper.createException(Helper.java:56)
>         at org.apache.calcite.avatica.Helper.createException(Helper.java:41)
>         at org.apache.calcite.avatica.AvaticaConnection.executeQueryInternal(AvaticaConnection.java:577)
>         at org.apache.calcite.avatica.AvaticaPreparedStatement.executeQuery(AvaticaPreparedStatement.java:137)
>         at org.apache.kylin.rest.service.QueryService.executePrepareRequest(QueryService.java:1032)
>         at org.apache.kylin.rest.service.QueryService.queryWithSqlMassage(QueryService.java:718)
> Caused by: java.lang.RuntimeException: java.lang.NullPointerException
>         at org.apache.kylin.query.exec.SparkExec.collectToEnumerable(SparkExec.java:46)
>         at Baz.bind(Unknown Source)
>         at org.apache.calcite.jdbc.CalcitePrepare$CalciteSignature.enumerable(CalcitePrepare.java:365)
>         at org.apache.calcite.jdbc.CalciteConnectionImpl.enumerable(CalciteConnectionImpl.java:301)
>         at org.apache.calcite.jdbc.CalciteMetaImpl._createIterable(CalciteMetaImpl.java:559)
>         at org.apache.calcite.jdbc.CalciteMetaImpl.createIterable(CalciteMetaImpl.java:550)
>         at org.apache.calcite.avatica.AvaticaResultSet.execute(AvaticaResultSet.java:182)
>         at org.apache.calcite.jdbc.CalciteResultSet.execute(CalciteResultSet.java:67)
>         at org.apache.calcite.jdbc.CalciteResultSet.execute(CalciteResultSet.java:44)
>         at org.apache.calcite.avatica.AvaticaConnection.executeQueryInternal(AvaticaConnection.java:573)
>         ... 84 more
> Caused by: java.lang.NullPointerException
>         at org.apache.kylin.query.runtime.CalciteToSparkPlaner.visit(CalciteToSparkPlaner.scala:45)
>         at org.apache.calcite.rel.RelVisitor.go(RelVisitor.java:61)
>         at org.apache.kylin.query.runtime.SparkEngine.toSparkPlan(SparkEngine.java:61)
>         at org.apache.kylin.query.runtime.SparkEngine.compute(SparkEngine.java:49)
>         at org.apache.kylin.query.exec.QueryEngineFactory.compute(QueryEngineFactory.java:47)
>         at org.apache.kylin.query.exec.SparkExec.collectToEnumerable(SparkExec.java:43)
> {code}
>  
> I  solved this by cache RelNode to avoid SQL be parsed, optimized, code gen again. wonder if there is better way. thanks ~
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)