??????
????????kylin????merge??????????????????????????
??????merge????????
public void updateOnNewSegmentReady(String cubeName) {
final KylinConfig kylinConfig = KylinConfig.getInstanceFromEnv();
String serverMode = kylinConfig.getServerMode();
if (Constant.SERVER_MODE_JOB.equals(serverMode.toLowerCase())
|| Constant.SERVER_MODE_ALL.equals(serverMode.toLowerCase())) {
CubeInstance cube = getCubeManager().getCube(cubeName);
if (cube != null) {
CubeSegment seg = cube.getLatestBuiltSegment();
if (seg != null && seg.getStatus() == SegmentStatusEnum.READY) {
keepCubeRetention(cubeName);
mergeCubeSegment(cubeName);
}
}
}
}
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);//??????????????cube??merge??????????cube????????cube??????????
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);
}
}
}
public CubeSegment mergeSegments(CubeInstance cube, TSRange tsRange,
SegmentRange segRange, boolean force)
throws IOException {
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);//????????
}
????????????????????????????????????????kylin2.2.x????????????????????