程序打包和分布式执行
如前所述,Flink程序可以使用a在集群上执行remote environment
。或者,可以将程序打包到JAR文件(Java Archives)中以供执行。打包程序是通过命令行界面执行它们的先决条件。
打包程序
要通过命令行或Web界面支持从打包的JAR文件执行,程序必须使用通过其获取的环境StreamExecutionEnvironment.getExecutionEnvironment()
。当JAR提交到命令行或Web界面时,此环境将充当集群的环境。如果通过这些接口调用Flink程序的方式不同,则环境将像本地环境一样运行。
要打包程序,只需将所有涉及的类导出为JAR文件即可。JAR文件的清单必须指向包含程序入口点的类(具有public main
方法的类)。最简单的方法是将main-class条目放入清单(例如main-class: org.apache.flinkexample.MyProgram
)。在主类属性是通过命令执行JAR文件时所使用的Java虚拟机发现的主要方法相同的一个java -jar pathToTheJarFile
。大多数IDE都提供在导出JAR文件时自动包含该属性。
通过计划打包程序
此外,我们支持打包程序作为计划。execute()
计划打包不是在主方法中定义程序并调用环境,而是返回程序计划,程序计划是程序数据流的描述。为此,程序必须实现org.apache.flink.api.common.Program
接口,定义getPlan(String…)
方法。传递给该方法的字符串是命令行参数。可以通过该ExecutionEnvironment#createProgramPlan()
方法从环境创建程序的计划。打包程序的计划时,JAR清单必须指向实现org.apache.flink.api.common.Program
接口的类,而不是使用main方法的类。
概要
调用打包程序的整个过程如下:
搜索JAR的清单以查找主类或程序类属性。如果找到这两个属性,则program-class属性优先于main-class属性。对于JAR清单既不包含属性的情况,命令行和Web界面都支持手动传递入口点类名的参数。
如果入口点类实现了
org.apache.flink.api.common.Program
,则系统调用该getPlan(String…)
方法以获取要执行的程序计划。如果入口点类没有实现
org.apache.flink.api.common.Program
接口,系统将调用该类的main方法。