任务提交与执行---客户端作业提交

374 阅读2分钟

1.客户端作业提交

image.png

当用户执行 flink run application.jar 时候,客户端开始提交作业,如图所示

1. 生成PackagedProgram

  1. 用户编写和生产Aplication.jar应用程序
  2. 执行的bin/flink run 命令,启动和初始化CLIFronted客户端的main()方法
  3. 将应用程序的JAR包提交到CLIFrontend
  4. 根据用户指定的配置信息,初始化命令行客户端工具CustomCommandLine.默认会初始化ExecutorCLI;如果执行的参数有-y,就会初始化FlinkYarnSessionCli
  5. 调用CLIFronted中的run()方法,执行应用程序
  6. 首先在run方法中调用CliFrontend.buildProgram(programOptions)方法,将提交的应用程序打包成PackagedProgram.PackagedProgram包含应用程序中的mainclass、classpaths等信息。实际是在客户端进程内将用户提交的作业代码打包成一个可执行程序
  7. 接着再调用ClientUtils.executeProgram(PipelineExecutorServiceLoader executorServiceLoader, Configuration configuration, PackagedProgram program),执行创建好的PackagedProgram,ClientUtils是一个单例对象,是Flink client的工具类函数

2.加载初始化PipelineExecutorServiceLoader,并生成ContextEnvironmentFactory

  1. 由步骤7得知,executeProgram方法还需要获取PipelineExecutorServiceLoader的实例。因此生成PipelineExecutorServiceLoader DefaultExecutorServiceLoader是PipelineExecutorServiceLoader的实现类,是一个单例类,采用饿汉式的方式加载。主要是用于加载PipeLineExecutor.PipelineExecutor是客户端专用用于加载应用程序代码的加载器,不同类型的集群有不同的PipelineExecutor实现类

  2. 加载ContextEnvironmentFactory,生成方法为ContextEnvironmentFactory( executorServiceLoader, configuration, userCodeClassLoader),返回ContextEnvironmentFactory

  3. 初始化ContectEnvironment,调用ContextEnvironment.setAsContext(factory)方法,该方法会初始化ContextEnvironment,同时ContextEnvironment也继承了ExcutionEnvironment,在FlinkClient中创建,专门用于通过命令行的方式提交作业

  4. 返回ContextEnvironment

  5. 在ClientUtils.ExecuteProgram方法中,最后调用PackagedProghram.invokaInteractiveModeForExecution()方法,通过反射的方式执行Application.jar应用程序中的main方法,最后使用MainMethod.invoke(null,(Object)args)方法

  6. 在我们写的flink应用程序中,一般会调用 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); 该方法会调用初始化和创建StreamExecutionEnvironment,并且基于该方法进行常规的流处理操作

参考文献

Flink设计与实现:核心原理与源码解析