[ https://issues.apache.org/jira/browse/KYLIN-1985?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Shaofeng SHI resolved KYLIN-1985. --------------------------------- Resolution: Fixed > SnapshotTable should only keep the columns described in tableDesc > ----------------------------------------------------------------- > > Key: KYLIN-1985 > URL: https://issues.apache.org/jira/browse/KYLIN-1985 > Project: Kylin > Issue Type: Bug > Components: Job Engine > Affects Versions: v1.5.3 > Reporter: zhengdong > Assignee: zhengdong > Fix For: v1.5.4 > > Attachments: KYLIN-1985.patch > > > we suffered from a strange problem that we got a > java.lang.ArrayIndexOutOfBoundsException when build of refresh a cube, > exception stack like this : > java.lang.IllegalStateException: Failed to load lookup table DIM_TABLE_NAME > from snapshot > /table_snapshot/dim_table_name/5a78a522-6f85-4650-b47d-6a5f5806b7f7.snapshot > at > org.apache.kylin.cube.CubeManager.getLookupTable(CubeManager.java:621) > at > org.apache.kylin.cube.cli.DictionaryGeneratorCLI.processSegment(DictionaryGeneratorCLI.java:61) > at > org.apache.kylin.cube.cli.DictionaryGeneratorCLI.processSegment(DictionaryGeneratorCLI.java:42) > at > org.apache.kylin.engine.mr.steps.CreateDictionaryJob.run(CreateDictionaryJob.java:56) > at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70) > at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84) > at > org.apache.kylin.engine.mr.common.HadoopShellExecutable.doWork(HadoopShellExecutable.java:63) > at > org.apache.kylin.job.execution.AbstractExecutable.execute(AbstractExecutable.java:112) > at > org.apache.kylin.job.execution.DefaultChainedExecutable.doWork(DefaultChainedExecutable.java:57) > at > org.apache.kylin.job.execution.AbstractExecutable.execute(AbstractExecutable.java:112) > at > org.apache.kylin.job.impl.threadpool.DefaultScheduler$JobRunner.run(DefaultScheduler.java:127) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) > at java.lang.Thread.run(Thread.java:745) > Caused by: java.lang.ArrayIndexOutOfBoundsException: 19 > at > org.apache.kylin.dict.lookup.LookupStringTable.convertRow(LookupStringTable.java:85) > at > org.apache.kylin.dict.lookup.LookupStringTable.convertRow(LookupStringTable.java:34) > at org.apache.kylin.dict.lookup.LookupTable.initRow(LookupTable.java:76) > at org.apache.kylin.dict.lookup.LookupTable.init(LookupTable.java:67) > at > org.apache.kylin.dict.lookup.LookupStringTable.init(LookupStringTable.java:79) > at org.apache.kylin.dict.lookup.LookupTable.<init>(LookupTable.java:55) > at > org.apache.kylin.dict.lookup.LookupStringTable.<init>(LookupStringTable.java:65) > at > org.apache.kylin.cube.CubeManager.getLookupTable(CubeManager.java:619) > ... 13 more > and a simple exception when queried by a lookup table dimension > > ERROR [http-bio-7070-exec-7] controller.QueryController:209 : Exception when > execute sql > 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(AvaticaStatement.java:143) > at > org.apache.calcite.avatica.AvaticaStatement.executeQuery(AvaticaStatement.java:186) > at > org.apache.kylin.rest.service.QueryService.execute(QueryService.java:366) > at > org.apache.kylin.rest.service.QueryService.queryWithSqlMassage(QueryService.java:278) > at > org.apache.kylin.rest.service.QueryService.query(QueryService.java:121) > at > org.apache.kylin.rest.service.QueryService$$FastClassByCGLIB$$4957273f.invoke(<generated>) > at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) > at > org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:618) > at > org.apache.kylin.rest.service.QueryService$$EnhancerByCGLIB$$315e2079.query(<generated>) > at > org.apache.kylin.rest.controller.QueryController.doQueryWithCache(QueryController.java:192) > at > org.apache.kylin.rest.controller.QueryController.query(QueryController.java:94) > Caused by: java.lang.ArrayIndexOutOfBoundsException: 19 > at > org.apache.kylin.dict.lookup.LookupStringTable.convertRow(LookupStringTable.java:85) > at > org.apache.kylin.dict.lookup.LookupStringTable.convertRow(LookupStringTable.java:34) > at > org.apache.kylin.dict.lookup.LookupTable.initRow(LookupTable.java:76) > at org.apache.kylin.dict.lookup.LookupTable.init(LookupTable.java:67) > at > org.apache.kylin.dict.lookup.LookupStringTable.init(LookupStringTable.java:79) > at > org.apache.kylin.dict.lookup.LookupTable.<init>(LookupTable.java:55) > at > org.apache.kylin.dict.lookup.LookupStringTable.<init>(LookupStringTable.java:65) > at > org.apache.kylin.cube.CubeManager.getLookupTable(CubeManager.java:619) > Though the exception message, we found that one lookup table had been > changed in hive (add columns) and not been synchronized with kylin. However, > the cause of this problem is too subtle and not easily found. > As for SnapshotTable, only checking 'row.length <= maxIndex' in > takeSnapshot method to detect 'Bad hive table row ' is not enough. And only > encode and store the data columns described in tableDesc could be better > since these columns not in tableDesc are not used in any cube definition. -- This message was sent by Atlassian JIRA (v6.3.4#6332)