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




Reply via email to