Talend Enterpriseでジョブ実行時に外部ライブラリのクラスが見つからない問題を解決する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、たごまさゆきです。
Talend Enterpriseでジョブを実行しようとしたときに、必要なライブラリ(Jarファイル)が参照できず、実行ができないという問題に突き当たりました。 今回はその解決方法を報告します。
使用したバージョンは、Talend for Data Integration 5.6.2です。

Talend Enterpriseについて

本題に入る前に、Talend Enterpriseについて簡単に補足しておきます。

Talend社が提供するデータ管理ツールTalendの有償版製品がTalend Enterpriseです。
オープンソース版(Talend Open Studio:TOS)との大きな違いは、開発環境で作成したジョブの実行・運用監視などのサーバー機能が提供されている事です。

  • ジョブ開発リソースのリポジトリ機能(SVN)
  • リポジトリで管理されているジョブのビルド・デプロイ機能
  • ジョブの実行管理機能(スケジュール定義など)
  • ジョブ実行結果の管理機能
  • ジョブのモニタリング・通知機能

これらの機能は、Webアプリケーションベースの統合管理ツールTalend Administration Center(TAC)から利用する事ができます。

また実行環境だけでなく、開発環境(Talend Studio)もTOSに対して以下の機能が追加されています。

  • TACに統合されたリポジトリとの接続機能
  • TACで実行されたジョブのモニタリングビュー

ジョブが利用する外部ライブラリがみつからない?

さて、本題です。

Talendでのジョブ開発は、Studioに用意されているコンポーネントを組み合わせて作成します。
コンポーネントが外部ライブラリを使用している場合、そのライブラリのライセンスの関係でTalendに同梱できないものは、開発時にダウンロード・インストールを行う必要があります。
Studioでは、必要に応じて自動的に外部ライブラリのダウンロード・インストールを行うダイアログが開きますので、「必要なときにライブラリが無い」ということはほとんどありません。

作業用のPCにインストールしたStudio上でのテストもできたところで、実際に実行サーバーにデプロイ・実行してみることにしました。

Studioで開発したジョブはすでにリポジトリに登録してあるので、TACを使用して目的の実行サーバーに対してデプロイを行ってみたとろこ、実行時にClassNotFoundExceptionが発生してしまいました。
今回はMySQLに対してクエリを実行する「tMysqlRow」コンポーネントを使用していたのですが、MySQL接続に使用するJDBCドライバが見つからないと怒られているようです。
Studioではすでに前述のダイアログでインストール済みでしたので、そこでの実行は問題ありませんでした。

ここで一つ勘違いをしていたのは、TACでデプロイをするときにも、Studioでジョブをビルドするときと同様に必要なライブラリはダウンロードされるだろうと思ってしまっていたことでした。
製品マニュアルを再確認してみたところ、インストールガイド(TalendEnterprise_DataIntegration_IG_5.6.2_JA.pdf)のp47に以下の記述がありました。

StudioとCommandLineを異なるマシンで使用する場合、ダウンロードした .jarファイルを取得し、CommandLineに追加する必要があります。

ここで出てくるCommandLineとはTalendの機能の一つで(機能名が一般的すぎてちょっと混乱しそうですね)、TACでジョブをデプロイするときのコンパイルの実行を担っています。
つまり、Studioで追加インストールした外部ライブラリは、別途サーバー側のCommandLineにもインストールする必要があったということです。ではどこにインストールするのかというと、インストールガイドに以下の記述があります。

ダウンロードした.jarファイルを<StudioPath>/lib/javaからコピーし、<CommandLinePath>/lib/javaに貼り付けます。ここで<StudioPath>と<CommandLinePath>はそれぞれStudioとCommandLineのインストールディレクトリを指します。 <CommandLinePath>/lib/java フォルダーはデフォルトでは作成されず、CommandLineアプリケーションの初回起動時に作成されることに注意してください。

我々の環境では以下のパスになります。

/opt/TalendTools-5.6.2/cmdline/studio/configuration/lib/java

ドキュメントの説明どおりだと/opt/TalendTools-5.6.2/cmdline/lib/javaになりそうなんですが、ここではなく上記のパスが正しいようです。

こちらにMySQLのJDBCドライバのjarファイル(mysql-connector-java-5.1.30-bin.jar)を配置して、もう一度ジョブをデプロイしたところ、ジョブを正常に実行する事ができました!
今回はMySQL接続のコンポーネントでしたが、その他のコンポーネントの外部ライブラリも同ディレクトリに配置すれば、問題なく実行できます。

CommandLineについての補足

インストールガイドのp49には次の記述がありました。

Talend Administration Centerを使用してリモートリポジトリに初めて接続する際に、一部のコンポーネントで必要な外部ライブラリと接続メタデータが、Talend Administration Centerの[Configuration] (設定)で定義されているSVNディレクトリから取得されます。 そのため、CommandLineを起動する前にTalend Administration Centerをインストールして設定し、Studioをリモートリポジトリに接続することが重要です。これにより、必須外部ライブラリに関連するエラーがジョブのコード生成中に発生しなくなります。

CommandLineの初回起動の前にリポジトリにジョブを登録しておいてね、ということなんでしょうか。

またユーザーガイド(Talend_AdministrationCenter_UG_5.6.2_JA.pdf)の付録AのCommandLineの説明には冒頭に次の記述があります。

CommandLineはGUIのない Talend Studioに相当します。

CommandLineのインストールでつかうモジュール自体もStudioと同じなので、実質的に同じものと考えて良いようです。
StudioとCommandLineの関係がわかりにくかったので混乱してしまいました。

最後に

今日が仕事納めの方も多かったと思います。一年間お疲れさまでした。
来年もどうぞ宜しくお願いします。