select count(distinct xxx) from xxxx Query like this returns only one row, and only put very little pressure to hbase. It could take some time to calculate if the data set is huge, but shall never bring down hbase.
I cannot reproduce the problem on sample cube. May find a bigger cube and try again. Yang On Fri, Jun 24, 2016 at 10:16 AM, Jiaojiao Li <jia...@microsoft.com> wrote: > Thanks! > The scenario for hbase region server down only happens why I perform > query, especially which needs scan lots of data. > Is there any way to tune certain parameter of hbase to avoid this issue? > > -----Original Message----- > From: ShaoFeng Shi [mailto:shaofeng...@apache.org] > Sent: Thursday, June 23, 2016 10:07 AM > To: dev@kylin.apache.org > Cc: u...@kylin.apache.org; mahong...@apache.org > Subject: Re: Timeout visiting cube > > Jiao, > > From your log it indicates some region servers for that HTable were down > so Kylin couldn't connect, please have a HBase healthy check: > > Caused by: java.io.IOException: Call to martinitest002/10.0.0.6:16020 > failed on local exception: > org.apache.hadoop.hbase.ipc.CallTimeoutException: Call id=155399, > waitTime=90002, operationTimeout=90000 expired. > at > > org.apache.hadoop.hbase.ipc.RpcClientImpl.wrapException(RpcClientImpl.java:1262) > at org.apache.hadoop.hbase.ipc.RpcClientImpl.call(RpcClientImpl.java:1230) > at > > org.apache.hadoop.hbase.ipc.AbstractRpcClient.callBlockingMethod(AbstractRpcClient.java:213) > at > > org.apache.hadoop.hbase.ipc.AbstractRpcClient$BlockingRpcChannelImplementation.callBlockingMethod(AbstractRpcClient.java:287) > at > > org.apache.hadoop.hbase.protobuf.generated.ClientProtos$ClientService$BlockingStub.execService(ClientProtos.java:32675) > at > > org.apache.hadoop.hbase.protobuf.ProtobufUtil.execService(ProtobufUtil.java:1618) > at > > org.apache.hadoop.hbase.ipc.RegionCoprocessorRpcChannel$1.call(RegionCoprocessorRpcChannel.java:92) > at > > org.apache.hadoop.hbase.ipc.RegionCoprocessorRpcChannel$1.call(RegionCoprocessorRpcChannel.java:89) > at > > org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithRetries(RpcRetryingCaller.java:126) > ... 10 more > Caused by: org.apache.hadoop.hbase.ipc.CallTimeoutException: Call > id=155399, waitTime=90002, operation > > > > 2016-06-22 11:59 GMT+08:00 ShaoFeng Shi <shaofeng...@apache.org>: > > > We doubt there is another HBase side error before throwing the timeout > > error, which can be the root cause. As HBase client will retry several > > times, and each time has an timeout, so that error was output to > > kylin.log in several minutes later (0 - 20 minutes are possible). > > Please take a check to see whether it is true. Or if you can share the > > full kylin.log to somewhere like gist, that would be great; > > > > > > > > 2016-06-22 9:48 GMT+08:00 Jiaojiao Li <jia...@microsoft.com>: > > > >> In my case, related information is like this. > >> Kylin version: 1.5.2 > >> HBase version: HBase 0.98.4.2.2.9.0-3393 Cube size: 13.16GB Source > >> records: 85,794,927 Dimension number: 20 (several joint groups) > >> Measure type: bigint SQL query: select count(distinct userid) from > >> XXX LIMIT 50000 > >> > >> If you need more information please let me know. > >> > >> -----Original Message----- > >> From: ShaoFeng Shi [mailto:shaofeng...@apache.org] > >> Sent: Tuesday, June 21, 2016 10:51 PM > >> To: dev@kylin.apache.org; u...@kylin.apache.org > >> Cc: mahong...@apache.org > >> Subject: Re: Timeout visiting cube > >> > >> Hi all, > >> > >> Recently we noticed a couple of users are facing this timeout error, > >> even with some tiny cubes; We will try to re-produce it in our side > >> first; If you can provide more information about your case (like > >> hbase version, cube size, dimension nubmer, measure type, SQL query, > etc), that would be great! > >> > >> 2016-06-20 9:52 GMT+08:00 Jiaojiao Li <jia...@microsoft.com>: > >> > >> > Any update for this issue or can you share your insight for it? > >> > Increase the value of *kylin.query.cube.visit.timeout.times* > >> > doesn't work for me. > >> > > >> > Thanks! > >> > > >> > -----Original Message----- > >> > From: Jiaojiao Li > >> > Sent: Thursday, June 16, 2016 5:15 PM > >> > To: dev <dev@kylin.apache.org> > >> > Cc: 'mahong...@apache.org' <mahong...@apache.org> > >> > Subject: RE: Timeout visiting cube > >> > > >> > Thank you for taking time to investigation. > >> > Today I rerun the query and all the log are as follows. > >> > Kylin_query.log: > >> > root@MartiniTest000:/home/martini/kylin/logs# cat kylin_query.log > >> > 2016-06-16 09:04:10,795 DEBUG [http-bio-7070-exec-2] > >> > service.QueryService:291 : getting table metas > >> > 2016-06-16 09:04:10,796 DEBUG [http-bio-7070-exec-2] > >> > service.QueryService:309 : getting column metas > >> > 2016-06-16 09:04:10,804 DEBUG [http-bio-7070-exec-2] > >> > service.QueryService:323 : done column metas > >> > 2016-06-16 09:04:25,880 DEBUG [http-bio-7070-exec-10] > >> > service.QueryService:291 : getting table metas > >> > 2016-06-16 09:04:25,882 DEBUG [http-bio-7070-exec-10] > >> > service.QueryService:309 : getting column metas > >> > 2016-06-16 09:04:25,889 DEBUG [http-bio-7070-exec-10] > >> > service.QueryService:323 : done column metas > >> > 2016-06-16 09:04:34,045 INFO [http-bio-7070-exec-10] > >> > controller.QueryController:174 : Using project: CortanaTest > >> > 2016-06-16 09:04:34,046 INFO [http-bio-7070-exec-10] > >> > controller.QueryController:175 : The original query: select > >> > count(distinct > >> > userid) from cortanauu > >> > 2016-06-16 09:04:34,047 INFO [http-bio-7070-exec-10] > >> > service.QueryService:266 : The corrected query: select > >> > count(distinct > >> > userid) from cortanauu LIMIT 50000 > >> > 2016-06-16 09:04:34,104 INFO [http-bio-7070-exec-10] > >> > routing.QueryRouter:48 : The project manager's reference is > >> > org.apache.kylin.metadata.project.ProjectManager@419808ad > >> > 2016-06-16 09:04:34,105 INFO [http-bio-7070-exec-10] > >> > routing.QueryRouter:60 : Find candidates by table > >> > CORTANAUU.CORTANAUU and project=CORTANATEST : > >> > org.apache.kylin.query.routing.Candidate@f3ac47f > >> > 2016-06-16 09:04:34,105 INFO [http-bio-7070-exec-10] > >> > routing.QueryRouter:49 : Applying rule: class > >> > org.apache.kylin.query.routing.rules.RemoveUncapableRealizationsRul > >> > e, realizations before: [CortanaUUTest_clone(CUBE)], realizations > >> > after: > >> > [CortanaUUTest_clone(CUBE)] > >> > 2016-06-16 09:04:34,105 INFO [http-bio-7070-exec-10] > >> > routing.QueryRouter:49 : Applying rule: class > >> > org.apache.kylin.query.routing.rules.RealizationSortRule, > >> > realizations > >> > before: [CortanaUUTest_clone(CUBE)], realizations after: > >> > [CortanaUUTest_clone(CUBE)] > >> > 2016-06-16 09:04:34,106 INFO [http-bio-7070-exec-10] > >> > routing.QueryRouter:85 : Adjust DimensionAsMeasure for FunctionDesc > >> > [expression=COUNT_DISTINCT, parameter=ParameterDesc [type=column, > >> > value=USERID, nextParam=null], returnType=null] > >> > 2016-06-16 09:04:34,106 INFO [http-bio-7070-exec-10] > >> > routing.QueryRouter:72 : The realizations remaining: > >> > [CortanaUUTest_clone(CUBE)] And the final chosen one is the first > >> > one > >> > 2016-06-16 09:04:34,152 DEBUG [http-bio-7070-exec-10] > >> > enumerator.OLAPEnumerator:107 : query storage... > >> > 2016-06-16 09:04:34,405 DEBUG [http-bio-7070-exec-10] > >> > enumerator.OLAPEnumerator:127 : return TupleIterator... > >> > 2016-06-16 09:06:46,286 ERROR [http-bio-7070-exec-10] > >> > controller.QueryController:209 : Exception when execute sql > >> > java.sql.SQLException: Error while executing SQL "select > >> > count(distinct > >> > userid) from cortanauu LIMIT 50000": Timeout visiting cube! > >> > 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.AvaticaStatement.executeInternal(AvaticaSt > >> atement.java:143) > >> > at > >> > > >> org.apache.calcite.avatica.AvaticaStatement.executeQuery(AvaticaState > >> ment.java:186) > >> > at > >> > > >> org.apache.kylin.rest.service.QueryService.execute(QueryService.java: > >> 361) > >> > at > >> > > >> org.apache.kylin.rest.service.QueryService.queryWithSqlMassage(QueryS > >> ervice.java:273) > >> > at > >> > > org.apache.kylin.rest.service.QueryService.query(QueryService.java:121) > >> > at > >> > > >> org.apache.kylin.rest.service.QueryService$$FastClassByCGLIB$$4957273 > >> f.invoke(<generated>) > >> > at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) > >> > at > >> > > >> org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterc > >> eptor.intercept(Cglib2AopProxy.java:618) > >> > at > >> > > >> org.apache.kylin.rest.service.QueryService$$EnhancerByCGLIB$$72e265c1 > >> .query(<generated>) > >> > at > >> > > >> org.apache.kylin.rest.controller.QueryController.doQueryWithCache(Que > >> ryController.java:192) > >> > at > >> > > >> org.apache.kylin.rest.controller.QueryController.query(QueryControlle > >> r.java:94) > >> > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > >> > at > >> > > >> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl. > >> java:57) > >> > at > >> > > >> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces > >> sorImpl.java:43) > >> > at java.lang.reflect.Method.invoke(Method.java:606) > >> > at > >> > > >> org.springframework.web.method.support.InvocableHandlerMethod.invoke( > >> InvocableHandlerMethod.java:213) > >> > at > >> > > >> org.springframework.web.method.support.InvocableHandlerMethod.invokeF > >> orRequest(InvocableHandlerMethod.java:126) > >> > at > >> > > >> org.springframework.web.servlet.mvc.method.annotation.ServletInvocabl > >> eHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96) > >> > at > >> > > >> org.springframework.web.servlet.mvc.method.annotation.RequestMappingH > >> andlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:6 > >> 17) > >> > at > >> > > >> org.springframework.web.servlet.mvc.method.annotation.RequestMappingH > >> andlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578) > >> > at > >> > > >> org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapt > >> er.handle(AbstractHandlerMethodAdapter.java:80) > >> > at > >> > > >> org.springframework.web.servlet.DispatcherServlet.doDispatch(Dispatch > >> erServlet.java:923) > >> > at > >> > > >> org.springframework.web.servlet.DispatcherServlet.doService(Dispatche > >> rServlet.java:852) > >> > at > >> > > >> org.springframework.web.servlet.FrameworkServlet.processRequest(Frame > >> workServlet.java:882) > >> > at > >> > > >> org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServ > >> let.java:789) > >> > at > javax.servlet.http.HttpServlet.service(HttpServlet.java:646) > >> > at > javax.servlet.http.HttpServlet.service(HttpServlet.java:727) > >> > at > >> > > >> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl > >> icationFilterChain.java:303) > >> > at > >> > > >> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF > >> ilterChain.java:208) > >> > at > >> > org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) > >> > at > >> > > >> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl > >> icationFilterChain.java:241) > >> > at > >> > > >> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF > >> ilterChain.java:208) > >> > at > >> > > >> org.springframework.security.web.FilterChainProxy$VirtualFilterChain. > >> doFilter(FilterChainProxy.java:330) > >> > at > >> > > >> org.springframework.security.web.access.intercept.FilterSecurityInter > >> ceptor.invoke(FilterSecurityInterceptor.java:118) > >> > at > >> > > >> org.springframework.security.web.access.intercept.FilterSecurityInter > >> ceptor.doFilter(FilterSecurityInterceptor.java:84) > >> > at > >> > > >> org.springframework.security.web.FilterChainProxy$VirtualFilterChain. > >> doFilter(FilterChainProxy.java:342) > >> > at > >> > > >> org.springframework.security.web.access.ExceptionTranslationFilter.do > >> Filter(ExceptionTranslationFilter.java:113) > >> > at > >> > > >> org.springframework.security.web.FilterChainProxy$VirtualFilterChain. > >> doFilter(FilterChainProxy.java:342) > >> > at > >> > > >> org.springframework.security.web.session.SessionManagementFilter.doFi > >> lter(SessionManagementFilter.java:103) > >> > at > >> > > >> org.springframework.security.web.FilterChainProxy$VirtualFilterChain. > >> doFilter(FilterChainProxy.java:342) > >> > at > >> > > >> org.springframework.security.web.authentication.AnonymousAuthenticati > >> onFilter.doFilter(AnonymousAuthenticationFilter.java:113) > >> > at > >> > > >> org.springframework.security.web.FilterChainProxy$VirtualFilterChain. > >> doFilter(FilterChainProxy.java:342) > >> > at > >> > > >> org.springframework.security.web.servletapi.SecurityContextHolderAwar > >> eRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java: > >> 54) > >> > at > >> > > >> org.springframework.security.web.FilterChainProxy$VirtualFilterChain. > >> doFilter(FilterChainProxy.java:342) > >> > at > >> > > >> org.springframework.security.web.savedrequest.RequestCacheAwareFilter > >> .doFilter(RequestCacheAwareFilter.java:45) > >> > at > >> > > >> org.springframework.security.web.FilterChainProxy$VirtualFilterChain. > >> doFilter(FilterChainProxy.java:342) > >> > at > >> > > >> org.springframework.security.web.authentication.www.BasicAuthenticati > >> onFilter.doFilter(BasicAuthenticationFilter.java:201) > >> > at > >> > > >> org.springframework.security.web.FilterChainProxy$VirtualFilterChain. > >> doFilter(FilterChainProxy.java:342) > >> > at > >> > > >> org.springframework.security.web.authentication.ui.DefaultLoginPageGe > >> neratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:91) > >> > at > >> > > >> org.springframework.security.web.FilterChainProxy$VirtualFilterChain. > >> doFilter(FilterChainProxy.java:342) > >> > at > >> > > >> org.springframework.security.web.authentication.AbstractAuthenticatio > >> nProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.jav > >> a:183) > >> > at > >> > > >> org.springframework.security.web.FilterChainProxy$VirtualFilterChain. > >> doFilter(FilterChainProxy.java:342) > >> > at > >> > > >> org.springframework.security.web.authentication.logout.LogoutFilter.d > >> oFilter(LogoutFilter.java:105) > >> > at > >> > > >> org.springframework.security.web.FilterChainProxy$VirtualFilterChain. > >> doFilter(FilterChainProxy.java:342) > >> > at > >> > > >> org.springframework.security.web.context.SecurityContextPersistenceFi > >> lter.doFilter(SecurityContextPersistenceFilter.java:87) > >> > at > >> > > >> org.springframework.security.web.FilterChainProxy$VirtualFilterChain. > >> doFilter(FilterChainProxy.java:342) > >> > at > >> > > >> org.springframework.security.web.FilterChainProxy.doFilterInternal(Fi > >> lterChainProxy.java:192) > >> > at > >> > > >> org.springframework.security.web.FilterChainProxy.doFilter(FilterChai > >> nProxy.java:160) > >> > at > >> > > >> org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(D > >> elegatingFilterProxy.java:346) > >> > at > >> > > >> org.springframework.web.filter.DelegatingFilterProxy.doFilter(Delegat > >> ingFilterProxy.java:259) > >> > at > >> > > >> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl > >> icationFilterChain.java:241) > >> > at > >> > > >> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF > >> ilterChain.java:208) > >> > at > >> > > com.thetransactioncompany.cors.CORSFilter.doFilter(CORSFilter.java:195) > >> > at > >> > > com.thetransactioncompany.cors.CORSFilter.doFilter(CORSFilter.java:266) > >> > at > >> > > >> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl > >> icationFilterChain.java:241) > >> > at > >> > > >> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF > >> ilterChain.java:208) > >> > at > >> > > >> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperV > >> alve.java:220) > >> > at > >> > > >> org.apache.catalina.core.StandardContextValve.invoke(StandardContextV > >> alve.java:122) > >> > at > >> > > >> org.apache.catalina.authenticator.AuthenticatorBase.invoke(Authentica > >> torBase.java:504) > >> > at > >> > > >> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.j > >> ava:170) > >> > at > >> > > >> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.j > >> ava:103) > >> > at > >> > > >> org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java: > >> 950) > >> > at > >> > > >> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineVal > >> ve.java:116) > >> > at > >> > > >> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.jav > >> a:421) > >> > at > >> > > >> org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp > >> 11Processor.java:1074) > >> > at > >> > > >> org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process( > >> AbstractProtocol.java:611) > >> > at > >> > > >> org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoin > >> t.java:316) > >> > at > >> > > >> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor. > >> java:1145) > >> > at > >> > > >> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor > >> .java:615) > >> > at > >> > > >> org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskTh > >> read.java:61) > >> > at java.lang.Thread.run(Thread.java:745) > >> > Caused by: java.lang.RuntimeException: Timeout visiting cube! > >> > at > >> > > >> org.apache.kylin.storage.hbase.cube.v2.CubeHBaseEndpointRPC$ExpectedS > >> izeIterator.next(CubeHBaseEndpointRPC.java:127) > >> > at > >> > > >> org.apache.kylin.storage.hbase.cube.v2.CubeHBaseEndpointRPC$ExpectedS > >> izeIterator.next(CubeHBaseEndpointRPC.java:81) > >> > at > >> > > >> com.google.common.collect.TransformedIterator.next(TransformedIterato > >> r.java:48) > >> > at > >> > com.google.common.collect.Iterators$6.hasNext(Iterators.java:583) > >> > at > >> > > >> org.apache.kylin.storage.hbase.cube.v2.SequentialCubeTupleIterator.ha > >> sNext(SequentialCubeTupleIterator.java:96) > >> > at > >> > > >> org.apache.kylin.query.enumerator.OLAPEnumerator.moveNext(OLAPEnumera > >> tor.java:74) > >> > at Baz$1$1.moveNext(Unknown Source) > >> > at > >> > > >> org.apache.calcite.linq4j.EnumerableDefaults.aggregate(EnumerableDefa > >> ults.java:112) > >> > at > >> > > >> org.apache.calcite.linq4j.DefaultEnumerable.aggregate(DefaultEnumerab > >> le.java:107) > >> > at Baz.bind(Unknown Source) > >> > at > >> > > >> org.apache.calcite.jdbc.CalcitePrepare$CalciteSignature.enumerable(Ca > >> lcitePrepare.java:326) > >> > at > >> > > >> org.apache.calcite.jdbc.CalciteConnectionImpl.enumerable(CalciteConne > >> ctionImpl.java:281) > >> > at > >> > > >> org.apache.calcite.jdbc.CalciteMetaImpl._createIterable(CalciteMetaIm > >> pl.java:545) > >> > at > >> > > >> org.apache.calcite.jdbc.CalciteMetaImpl.createIterable(CalciteMetaImp > >> l.java:536) > >> > at > >> > > >> org.apache.calcite.avatica.AvaticaResultSet.execute(AvaticaResultSet. > >> java:187) > >> > at > >> > > >> org.apache.calcite.jdbc.CalciteResultSet.execute(CalciteResultSet.jav > >> a:65) > >> > at > >> > > >> org.apache.calcite.jdbc.CalciteResultSet.execute(CalciteResultSet.jav > >> a:44) > >> > at > >> > > >> org.apache.calcite.avatica.AvaticaConnection$1.execute(AvaticaConnect > >> ion.java:566) > >> > at > >> > > >> org.apache.calcite.jdbc.CalciteMetaImpl.prepareAndExecute(CalciteMeta > >> Impl.java:578) > >> > at > >> > > >> org.apache.calcite.avatica.AvaticaConnection.prepareAndExecuteInterna > >> l(AvaticaConnection.java:571) > >> > at > >> > > >> org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaSt > >> atement.java:135) > >> > ... 80 more > >> > 2016-06-16 09:06:46,289 INFO [http-bio-7070-exec-10] > >> > service.QueryService:250 : > >> > ==========================[QUERY]=============================== > >> > SQL: select count(distinct userid) from cortanauu > >> > User: ADMIN > >> > Success: false > >> > Duration: 0.0 > >> > Project: CortanaTest > >> > Realization Names: [CortanaUUTest_clone] Cuboid Ids: [1048062] > >> > Total scan > >> > count: 0 Result row count: 0 Accept Partial: true Is Partial Result: > >> > false Hit Exception Cache: false Storage cache used: false > >> > Message: Error while executing SQL "select count(distinct userid) > >> > from cortanauu LIMIT 50000": Timeout visiting cube! > >> > ==========================[QUERY]=============================== > >> > > >> > > >> > > >> > -----Original Message----- > >> > From: hongbin ma [mailto:mahong...@apache.org] > >> > Sent: Wednesday, June 15, 2016 10:09 PM > >> > To: dev <dev@kylin.apache.org> > >> > Subject: Re: Timeout visiting cube > >> > > >> > actually, can you please attach latest 2 minutes' log before > >> > 2016-06-15 02:18:22,741? > >> > it's still incomplete for our analysis > >> > > >> > > >> > > >> > > >> > -- > >> > Regards, > >> > > >> > *Bin Mahone | 马洪宾* > >> > Apache Kylin: > >> > https://na01.safelinks.protection.outlook.com/?url=http%3a%2f%2fkylin > . > >> > io&data=01%7c01%7cjiaoli%40064d.mgd.microsoft.com%7ce53a04299632406 > >> > e33 > >> > 4208d395269be8%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=vpTxGJM > >> > sJQ 7CoMHsEjHWBxaRVgQWfLVp6mcuFmlqzzI%3d > >> > Github: https://github.com/binmahone > >> > > >> > >> > >> > >> -- > >> Best regards, > >> > >> Shaofeng Shi > >> > > > > > > > > -- > > Best regards, > > > > Shaofeng Shi > > > > > > > -- > Best regards, > > Shaofeng Shi >