首先看一条kafka cube构建语句
curl -X PUT –user ADMIN:KYLIN -H “Content-Type: application/json;charset=utf-8” -d ‘{ “sourceOffsetStart”: 0,”sourceOffsetEnd”: 9223372036854775807,”buildType”: “BUILD”}’ http://99.48.2.1:7070/kylin/api/cubes/cubename/build2
源码入口CubeController
/**
* Build/Rebuild a cube segment by source offset
*/
@RequestMapping(value = "/{cubeName}/build2", method = { RequestMethod.PUT }, produces = { "application/json" })
@ResponseBody
public JobInstance build2(@PathVariable String cubeName, @RequestBody JobBuildRequest2 req) {
boolean existKafkaClient = false;
...
return rebuild2(cubeName, req);
}
private JobInstance buildInternal(String cubeName, TSRange tsRange, SegmentRange segRange, //
Map<Integer, Long> sourcePartitionOffsetStart, Map<Integer, Long> sourcePartitionOffsetEnd,
String buildType, boolean force) {
return jobService.submitJob(cube, tsRange, segRange, sourcePartitionOffsetStart, sourcePartitionOffsetEnd,
CubeBuildTypeEnum.valueOf(buildType), force, submitter);
}
这里出现了jobService,我们进入看看
public class JobService extends BasicService implements InitializingBean {
看到InitializingBean自然想到了afterPropertiesSet(),方法里面做了什么呢?
@SuppressWarnings("unchecked")
@Override
public void afterPropertiesSet() throws Exception {
...
new Thread(new Runnable() {
@Override
public void run() {
try {
scheduler.init(new JobEngineConfig(kylinConfig), new ZookeeperJobLock());
if (!scheduler.hasStarted()) {
logger.info("scheduler has not been started");
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}).start();
...
}
这里启动了一个调度器线程,跟进去看init方法,这里面很重要。
@Override
public synchronized void init(JobEngineConfig jobEngineConfig, JobLock jobLock) throws SchedulerException {
String serverMode = jobEngineConfig.getConfig().getServerMode();
if (!("job".equals(serverMode.toLowerCase()) || "all".equals(serverMode.toLowerCase()))) {
logger.info("server mode: " + serverMode + ", no need to run job scheduler");
return;
}
logger.info("Initializing Job Engine ....");
if