This documentation is for an unreleased version of Apache Flink. We recommend you use the latest stable version.
実行モード #
Python APIは、ユースケースの要件やジョブの特性に応じて選択できる様々な実行モードをサポートします。Pythonランタイムの実行モードは、Pythonのユーザ定義関数がどのように実行されるかを定義します。
リリース 1.15より前には、PROCESS
実行モードと呼ばれる実行モードだけがありました。PROCESS
モードは、Pythonのユーザ定義関数が別のPythonプロセスで実行されることを意味します。
リリース 1.15で、THREAD
実行モードと呼ばれる新しい実行モードが導入されました。THREAD
モードは、Pythonのユーザ定義関数がJVMで実行されることを意味します。
注意E: 同じJVMで実行される複数のPythonユーザ定義関数は、依然としてGILの影響を受けます。
いつTHREAD実行モードを使用できるか、使うべきですか? #
THREAD
モードの導入の目的は、PROCESS
モードでのプロセス間通信に導入されるシリアル化/逆シリアル化とネットワーク通信のオーバーヘッドを克服することです。
したがって、パフォーマンスが気にならない場合やPythonのユーザ定義関数の計算ロジックがジョブのパフォーマンスのボトルネックである場合は、 PROCESS
モードはTHREAD
モードと比較して最良の分離を提供するため、PROCESS
モードが最適な選択となります。
Python実行モードの設定 #
実行モードはpython.execution-mode
設定を介して設定できます。
可能な値は2つあります:
PROCESS
: Pythonのユーザ定義関数は、別のPythonプロセスで実行されます。(デフォルト)THREAD
: Pythonのユーザ定義関数はJVMで実行されます。
以下のようにして、Python Table APIやPython DataStream APIジョブで実行モードを指定できます:
## Python Table API
# Specify `PROCESS` mode
table_env.get_config().set("python.execution-mode", "process")
# Specify `THREAD` mode
table_env.get_config().set("python.execution-mode", "thread")
## Python DataStream API
config = Configuration()
# Specify `PROCESS` mode
config.set_string("python.execution-mode", "process")
# Specify `THREAD` mode
config.set_string("python.execution-mode", "thread")
# Create the corresponding StreamExecutionEnvironment
env = StreamExecutionEnvironment.get_execution_environment(config)
サポートされるケース #
Python Table API #
以下の表は、THREAD
実行モードがPython Table APIでサポートされる場所を示しています。
UDFs | PROCESS |
THREAD |
---|---|---|
Python UDF | Yes | Yes |
Python UDTF | Yes | Yes |
Python UDAF | Yes | いいえ |
Pandas UDF & Pandas UDAF | Yes | いいえ |
Python DataStream API #
以下の表は、PROCESS
実行モードとTHREAD
時刻モードがPythonでサポートされる場所を示しています。
オペレータ | PROCESS |
THREAD |
---|---|---|
マップ | Yes | Yes |
FlatMap | Yes | Yes |
フィルター | Yes | Yes |
Reduce | Yes | Yes |
和集合 | Yes | Yes |
Connect | Yes | Yes |
CoMap | Yes | Yes |
CoFlatMap | Yes | Yes |
処理関数 | Yes | Yes |
Window Apply | Yes | Yes |
Window Aggregate | Yes | Yes |
Window Reduce | Yes | Yes |
Window Process | Yes | Yes |
Side Output | Yes | Yes |
状態 | Yes | Yes |
Iterate | いいえ | いいえ |
Window CoGroup | いいえ | いいえ |
ウィンドウ結合 | いいえ | いいえ |
インターバル結合 | いいえ | いいえ |
非同期 I/O | いいえ | いいえ |
現時点では、全ての場所でTHREAD
実行モードでPython UDFを実行することはサポートされていません。 このような場合は、PROCESS
実行モードに戻ります。そのため、THREAD
実行モードで実行するようにジョブを設定しても、実際にはPROCESS
実行モードで時刻される場合があります。
THREAD
実行モードは、Python 3.8+でのみサポートされます。
Executionの挙動 #
このセクションでは、THREAD
実行モードの実行動作の概要を説明し、PROCESS
実行モードと対比します。詳細については、この機能を紹介したFLIPを参照してください: FLIP-206。
PROCESS実行モード #
PROCESS
実行モードでは、Pythonのユーザ定義関数は別のPythonワーカープロセスで実行されます。
Javaオペレータプロセスでは、様々なGrpcサービスを使ってPythonワーカープロセスと通信します。
THREAD実行モード #
THREAD
実行モードでは、Pythonのユーザ定義関数はJavaオペレータと同じプロセスで実行されます。PyFlinkは、サードパーティライブラリPEMJAを使ってJavaアプリケーションにPythonを埋め込みます。