LocalStreamEnvironment#execute MiniCluster#executeJobBlocking -> MiniCluster#submitJob dispatcherGateway.submitJob(jobGraph, rpcTimeout) Dispatcher#submitJob --> Dispatcher#internalSubmitJob --> Dispatcher#persistAndRunJob --> Dispatcher#runJob Dispatcher#createJobManagerRunner –>jobManagerRunnerFactory.createJobManagerRunner –>this::startJobManagerRunner JobManagerRunner#start 成功之后回调JobManagerRunner#grantLeadership JobManagerRunner#verifyJobSchedulingStatusAndStartJobManager --> JobManagerRunner#startJobMaster JobMasterService#start JobMaster#start --> JobMaster#startJobExecution startJobMasterServices resetAndScheduleExecutionGraph JobMaster#resetAndScheduleExecutionGraph --> JobMaster#scheduleExecutionGraph ExecutionGraph#scheduleForExecution --> ExecutionGraph#scheduleEager org.apache.flink.runtime.executiongraph.Execution#deploy taskManagerGateway.submitTask(deployment, rpcTimeout) taskManagerGateway这里是RpcTaskManagerGateway#submitTask --> TaskExecutor#submitTask task.startTaskThread();开始执行。在task线程的run方法中,通过 invokable.invoke();反射的方式来执行任务。对于WordCount例子来说,invokable就是OneInputStreamTask,调用invoke的 时候,就会调用OneInputStreamTask的父类StreamTask的invoke方法。invoke方法中调用抽象方法run方法来执行,然后进入OneInputStreamTask#run
@Override
protected void run ( ) throws Exception {
final StreamInputProcessor< IN> inputProcessor = this . inputProcessor;
while ( running && inputProcessor. processInput ( ) ) {
}
}
StreamInputProcessor#processInput,真正的执行代码在streamOperator.processElement(record);中,然后执行相应的子类的方法,对于StreamFlatMap来说,进入processElement方法,处理用户所写的代码逻辑。
@Override
public void processElement ( StreamRecord< IN> element) throws Exception {
collector. setTimestamp ( element) ;
userFunction. flatMap ( element. getValue ( ) , collector) ;
}
}