ユーザー定義関数 (UDF) を使用する MaxCompute ジョブの実行中に、エラー ODPS-0123144: kInstanceMonitorTimeout が発生することがあります。このエラーは、UDF が単一のデータバッチを処理するためのデフォルトの時間制限を超えたために発生します。この制限は、無限ループやパフォーマンスの低いコードがリソースを独占するのを防ぐための安全策です。このガイドでは、UDF のパフォーマンスボトルネックを診断し、計算量の多いタスクの実行パラメーターを調整することで、この問題を解決する方法について説明します。
エラーメッセージ
ODPS-0123144: Fuxi job failed - kInstanceMonitorTimeout(errCode:252) at Odps/xxx/xxx. Detail error msg: CRASH_EXIT, usually caused by bad udf performance.エラーの説明
このエラーは、ユーザー定義関数 (UDF) が単一のデータバッチの処理に時間がかかりすぎたことを示します。MaxCompute はデータをバッチで処理します。デフォルトでは 1 バッチあたり 1,024 レコードです。デフォルトでは、各バッチは 1,800 秒 (30 分) 以内に処理される必要があります。このタイムアウトは、無限ループのようなパフォーマンスの低いコードがクラスターリソースを独占することを防ぐための安全策です。これは、ジョブの総実行時間ではなく、単一のバッチに適用されます。
ソリューション
主な解決策は、ログ記録を追加して UDF をデバッグし、パフォーマンスボトルネックや無限ループを特定することです。タイムスタンプを出力して処理時間を計測します。ジョブの実行後、Logview で StdOut ログを検査して出力を分析します。
Java UDF については、「パフォーマンスの問題」をご参照ください。
Python 2 環境
sys.stdout.write('your log') sys.stdout.flush()Python 3 環境
print('your log', flush=True)
計算量が多く、MaxCompute UDF の実行に長時間がかかると予想される場合は、以下のパラメーターを調整してタイムアウトエラーを防ぐことができます。
set odps.function.timeout=xxx;
このパラメーターは、UDF のランタイムタイムアウト期間を指定します。デフォルト値は 1800 秒です。必要に応じて値を増やすことができます。値は 1 秒から 3600 秒の間でなければなりません。
set odps.sql.executionengine.batch.rowcount=xxx;
MaxCompute UDF が一度に処理できるデータ行数です。デフォルト値:1024。必要に応じて、パラメーターをより小さい値に設定できます。