解决kylin报错:java.lang.ArrayIndexOutOfBoundsException: -1

 

 

报错信息:

2017-06-26 14:17:30,167 INFO  [pool-9-thread-3] cli.DictionaryGeneratorCLI:57 : Building snapshot of ENERGON_DM.DM_DIAGNOSIS_FACT_SGYY_ROOT_SET_FLAG
2017-06-26 14:17:31,484 ERROR [pool-9-thread-3] common.HadoopShellExecutable:65 : error execute HadoopShellExecutable{id=8188ef71-3bc6-4b9a-b87d-5559e3ea6b4a-03, name=Bu
ild Dimension Dictionary, state=RUNNING}
java.lang.ArrayIndexOutOfBoundsException: -1
        at org.apache.kylin.dict.lookup.SnapshotTable.takeSnapshot(SnapshotTable.java:89)
        at org.apache.kylin.dict.lookup.SnapshotManager.buildSnapshot(SnapshotManager.java:132)
        at org.apache.kylin.cube.CubeManager.buildSnapshotTable(CubeManager.java:270)
        at org.apache.kylin.cube.cli.DictionaryGeneratorCLI.processSegment(DictionaryGeneratorCLI.java:58)
        at org.apache.kylin.cube.cli.DictionaryGeneratorCLI.processSegment(DictionaryGeneratorCLI.java:41)
        at org.apache.kylin.engine.mr.steps.CreateDictionaryJob.run(CreateDictionaryJob.java:54)
        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:113)
        at org.apache.kylin.job.execution.DefaultChainedExecutable.doWork(DefaultChainedExecutable.java:57)
        at org.apache.kylin.job.execution.AbstractExecutable.execute(AbstractExecutable.java:113)
        at org.apache.kylin.job.impl.threadpool.DefaultScheduler$JobRunner.run(DefaultScheduler.java:136)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
解决:
meta 中 /table/ 下存在同名但大小写不同的两个 table 的 meta, 这个 meta 文件里 column 的 id 起始为 0,正常情况应该为 1. kylin 内部把表的 meta 存到一个 hashmap 里,key 为大写的表名,不论原来是否为大写。在这个情况中小写的 meta 的内容把大写的 meta 内容覆盖了,查 ID 的时候有一个操作是把 id 值 - 1。如果原始的 ID 为 0,-1 之后就变成 -1,然后就抛出上面的异常。
 

org.apache.kylin.dict.lookup.SnapshotTable:

org.apache.kylin.metadata.model.ColumnDesc:

问题 meta:

ps: 类 org.apache.kylin.metadata.model.ColumnDesc 对应 table 中的一个 column:

v.s.