程序打包和分布式执行
如前所述,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方法。