65535バイトの制限に起因するコード生成時のエラーを防ぐ方法
Talend Studioの場合、一部のジョブがコードコンパイルで失敗し、65535バイト制限のエラーが表示されることがあります。この記事では、このエラーの原因を説明し、トラブルシューティングのアイデアと解決策をお伝えします。
たとえばサブジョブのコンポーネント数やスキーマのカラム数が多すぎる場合、Talendジョブのコンパイルが失敗し、以下の例外が発生することがあります。
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The code of method tFileInputDelimited_1Process(Map) is exceeding the 65535 bytes limit
これは、Talend Studioがコードジェネレーターであり、それぞれのTalendジョブに対してJavaコードを作成することが理由です。サブジョブはそれぞれ、ジョブクラスにあるメソッドです。サブジョブが大きすぎると、最終的に生成されるコードのサイズが65536バイトを超えてしまいます。Javaの仕様によると、この非ネイティブかつ非抽象メソッドのコード量は65536バイトのサイズに制限されているため、サブジョブの生成コードがこの制限を超えることはできません。
このエラーを防ぐため、Talend Studioインストールディレクトリーのconfigurationフォルダーにあるconfig.iniファイルに次のパラメーターを追加してみます。
deactivate_extended_component_log=true
このオプションを設定すると、ジョブの依存項目もアップデートされます。継続的インテグレーションを使用している場合は、プロジェクト内のPOMをすべて再生成することをお勧めします。これを行うには、[Project Settings] (プロジェクト設定)に移動し、 ノードを開いて[Force full re-synchronize poms] (POMの全再同期を強制)をクリックします。
上記のパラメーターを追加しても問題が解決しない場合は、回避策として、ジョブを最適化し、サブジョブの最終生成コードのサイズが小さくなるよう、次の方法を試してみてください。
- サブジョブ内のコンポーネント数(特にtLogRowなどのデバッグ用コンポーネント)を最小限にする。
- サブジョブを複数のサブジョブに分割する。
サブジョブのサイズを小さくするリデザイン例
次の図はサブジョブを1つだけ持つ非常にシンプルなジョブで、サブジョブにあるコンポーネントは3つのみです。このジョブがビルドプロセス中に65535バイト制限のエラーを発生させた場合、それはこのジョブの唯一のサブジョブのエラーとなります。そのサブジョブにあるコンポーネントの数を減らしたいと思います。
このエラーは次のように表示されます。
At least Job "HelloWorld" has a compile errors, please fix and export again.
Error Line: 23424
Detail Message: The code of method tRowGenerator_1Process() is exceeding the 65535 bytes limit
サブジョブはそれぞれ、サブジョブの開始に使われる最初のコンポーネントに従って名前が付けられます。エラーメッセージで指定されたメソッド名であるtRowGenerator_1Process()
を見ると、tRowGenerator_1Process()
コンポーネントで開始されたサブジョブでエラーが発生していることがわかります。この場合、ジョブの中にはサブジョブが1つしかないので、問題があるのはこのサブジョブということになりますが、サブジョブは複数持つことも可能です。
このサブジョブを2つのサブジョブに分割し、コンポーネントを2つ持つサブジョブと、コンポーネントを1つだけ持つサブジョブを作成できます。
問題のあるサブジョブを2つのサブジョブに分割して小さくすることで解決が期待できます。