以前説明したように、Flinkのプログラムはリモート環境
を使ってクラスタ上で実行することができます。別のやり方として、プログラムは実行のためにJARファイル(Java書庫)にパッケージすることができます。プログラムのパッケージ化はコマンドライン インタフェースを使ってそれらを実行する必須条件です。
コマンドラインあるいはwebインタフェースを使ってパッケージ化されたJARファイルからの実行をサポートするには、プログラムは StreamExecutionEnvironment.getExecutionEnvironment()
によって取得された環境を使う必要があります。。この環境はJARがコマンドラインあるいはwebインタフェースにサブミットされた時に、クラスタの環境として振舞うでしょう。もしFlinkのプログラムがこれらのインタフェースと異なる起動をされた場合、その環境はローカル環境のように振舞うでしょう。
プログラムをパッケージ化するためには、単純に全ての起動されるクラスをJARファイルとしてexportします。JAR ファイルの manifest はプログラムのentry point (public main
メソッドを持つクラス)を含むクラスを示す必要があります。これを行う最も簡単な方法はmain-class エントリを(main-class: org.apache.flinkexample.MyProgram
のように)manifestに入れることです。main-class 属性は、コマンドjava -jar pathToTheJarFile
を使ってJARファイルを実行する時にmainメソッドを見つけるためにJava仮想マシーンで使われるものと同じです。ほとんどのIDEはJARファイルをexportする時に自動的にその属性を含むことを提供します。
更に、Plansとしてプログラムのパッケージ化をサポートします。mainメソッド内でプログラムを定義し、環境上でexecute()
を呼ぶ代わりに、planのパッケージ化はProgram Planを返します。これはプログラムのデータフローの説明です。そうするためには、プログラムはgetPlan(String...)
メソッドを実装してorg.apache.flink.api.common.Program
インタフェースを実装しなければなりません。メソッドに渡される文字列はコマンドラインの引数です。プログラムのplanはExecutionEnvironment#createProgramPlan()
メソッドを使って環境から作成することができます。プログラムのplanをパッケージ化する時に、JARの manifest はmainメソッドを持つクラスの代わりに、org.apache.flink.api.common.Program
インタフェースを実装するクラスを指し示さなければなりません。
パッケージ化されたプログラムを起動する全般的な手順は以下のようなものです:
JARの manifest は main-class あるいは program-class 属性のために検索されます。両方の属性が見つかった場合、program-class 属性は main-class属性よりも優先されます。JARのmanifestがどちらの属性も含まない場合のために、コマンドラインおよびwebインタフェースの両方とも手動でエントリ ポイントクラス名を渡すためのパラメータをサポートします。
もしエントリポイントクラスがorg.apache.flink.api.common.Program
を実装する場合、システムは実行するためのプログラム planを取得するためにgetPlan(String...)
メソッドを呼びます。
もしエントリポイントクラスがorg.apache.flink.api.common.Program
インタフェースを実装しない場合、システムはクラスのmainメソッドを起動するでしょう。