Hi Guys,
I am using Kylin 2.2 and getting some issues with Kylin auto merge.
The error log in kylin.log is here:
2017-12-21 08:31:18,811 INFO [Thread-50937] service.CubeService:552 : checking
keepCubeRetention
2017-12-21 08:31:18,811 DEBUG [Thread-50937] model.Segments:201 : Cube
publishers_v4 has 1 building segments
2017-12-21 08:31:18,811 ERROR [Thread-50937] service.CacheService:87 : Error in
updateOnNewSegmentReady()
java.lang.IllegalArgumentException
at
com.google.common.base.Preconditions.checkArgument(Preconditions.java:76)
at org.apache.kylin.cube.CubeManager.mergeSegments(CubeManager.java:544)
at
org.apache.kylin.rest.service.CubeService.mergeCubeSegment(CubeService.java:601)
at
org.apache.kylin.rest.service.CubeService.updateOnNewSegmentReady(CubeService.java:545)
at
org.apache.kylin.rest.service.CubeService$$FastClassBySpringCGLIB$$17a07c0e.invoke(<generated>)
at
org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at
org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:669)
at
org.apache.kylin.rest.service.CubeService$$EnhancerBySpringCGLIB$$e4f6b188.updateOnNewSegmentReady(<generated>)
at
org.apache.kylin.rest.service.CacheService$1$1.run(CacheService.java:85)
Auto Merge Thresholds
8 (Hours)
1 (Days)
7 (Days)
15 (Days)
As I see inside the code, I see,
private void mergeCubeSegment(String cubeName) {
CubeInstance cube = getCubeManager().getCube(cubeName);
if (!cube.needAutoMerge()) {
return;
}
synchronized (CubeService.class) {
try {
cube = getCubeManager().getCube(cubeName);
SegmentRange offsets = cube.autoMergeCubeSegments();
if (offsets != null) {
CubeSegment newSeg = getCubeManager().mergeSegments(cube, null,
offsets, true);
logger.debug("Will submit merge job on " + newSeg);
DefaultChainedExecutable job =
EngineFactory.createBatchMergeJob(newSeg, "SYSTEM");
getExecutableManager().addJob(job);
} else {
logger.debug("Not ready for merge on cube " + cubeName);
}
} catch (IOException e) {
logger.error("Failed to auto merge cube " + cubeName, e);
}
}
}
ie; getCubeManager().mergeSegments(cube, null, offsets, true); is passing the
TSRange as ‘null’;
to CubeManager:public CubeSegment mergeSegments(CubeInstance cube, TSRange
tsRange, SegmentRange segRange, boolean force) method;
which is defined as:
if (cube.getSegments().isEmpty())
throw new IllegalArgumentException("Cube " + cube + " has no segments");
checkInputRanges(tsRange, segRange);
checkBuildingSegment(cube);
checkCubeIsPartitioned(cube);
if (cube.getSegments().getFirstSegment().isOffsetCube()) {
// offset cube, merge by date range?
if (segRange == null && tsRange != null) {
Pair<CubeSegment, CubeSegment> pair =
cube.getSegments(SegmentStatusEnum.READY)
.findMergeOffsetsByDateRange(tsRange, Long.MAX_VALUE);
if (pair == null)
throw new IllegalArgumentException("Find no segments to merge by "
+ tsRange + " for cube " + cube);
segRange = new SegmentRange(pair.getFirst().getSegRange().start,
pair.getSecond().getSegRange().end);
}
tsRange = null;
Preconditions.checkArgument(segRange != null);
} else {
segRange = null;
Preconditions.checkArgument(tsRange != null);
}
In my case, this is getting invoked,
else {
segRange = null;
Preconditions.checkArgument(tsRange != null);
}
and as we have passed in tsRange as NULL , so we get this exception:
java.lang.IllegalArgumentException
at
com.google.common.base.Preconditions.checkArgument(Preconditions.java:76)
at org.apache.kylin.cube.CubeManager.mergeSegments(CubeManager.java:544)
at
org.apache.kylin.rest.service.CubeService.mergeCubeSegment(CubeService.java:601)
at
org.apache.kylin.rest.service.CubeService.updateOnNewSegmentReady(CubeService.java:545)
at
org.apache.kylin.rest.service.CubeService$$FastClassBySpringCGLIB$$17a07c0e.invoke(<generated>)
at
org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at
org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:669)
at
org.apache.kylin.rest.service.CubeService$$EnhancerBySpringCGLIB$$e4f6b188.updateOnNewSegmentReady(<generated>)
at
org.apache.kylin.rest.service.CacheService$1$1.run(CacheService.java:85)
And the auto merge fails.
Let me know in case I am missing on something here, or a fix maybe.
Thanks,
Ketan