65535バイトの制限に起因するコード生成時のエラーを防ぐ方法 - 8.0

Version
8.0
Language
日本語
Product
Talend Big Data
Talend Big Data Platform
Talend Data Fabric
Talend Data Integration
Talend Data Management Platform
Talend Data Services Platform
Talend ESB
Talend MDM Platform
Talend Open Studio for Big Data
Talend Open Studio for Data Integration
Talend Open Studio for ESB
Talend Real-Time Big Data Platform
Module
Talend Studio
Content
ジョブデザインと開発

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] (プロジェクト設定)に移動し、[Build] (ビルド) > Mavenノードを開いて[Force full re-synchronize poms] (POMの全再同期を強制)をクリックします。

上記のパラメーターを追加しても問題が解決しない場合は、回避策として、ジョブを最適化し、サブジョブの最終生成コードのサイズが小さくなるよう、次の方法を試してみてください。

  • サブジョブ内のコンポーネント数(特にtLogRowなどのデバッグ用コンポーネント)を最小限にする。
  • サブジョブを複数のサブジョブに分割する。

サブジョブのサイズを小さくするリデザイン例

ジョブは1つまたは複数のサブジョブで構成されています。サブジョブは1つまたは複数のコンポーネントで構成されています。

次の図はサブジョブを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つのサブジョブに分割して小さくすることで解決が期待できます。