【Talend】ジョブ実行時エラーのデバッグ方法(実行時エラー編)

今回は、無事Talendジョブ実行⇒コンパイル通った!⇒いけいけーっ!⇒エラー…
となった場合に、どのようにデバッグしていくかをまとめていきます。

コンパイルでエラーとなった場合の対処はこちら

この記事の対象とするエラー

今回対象とするエラーというのは、下記のような画面のものです。

talend_blg_err_1

無事にコンパイルまで通って、実際にジョブが動き出している最中に、コンソール画面に赤字エラーが表示された場合が本記事の対象となります。

Talend起動時のエラーについては⇒【Talend Open Studio 入門01】開発環境の構築。Talendをインストールしよう

Talendコンパイル時エラーについては⇒【Talend】ジョブ実行時エラーのデバッグ方法(コンパイルエラー編)

実行時エラーが出た!どうすれば…

それでは、ここから具体的なデバッグを行っていきます。

デバッグ実行する

Talendには、2種類のデバッグ機能が用意されています。
トレースデバッグとJavaデバッグです。

ですが、正直なところ、トレースデバッグは意味ないです。あんまり有益な情報が得られないので、Javaデバッグします。

talend_blg_err_2

Javaデバッグの実行方法は、いつもTalendジョブ実行する「実行」タブの左側2項目目、「デバッグ実行(Debug Run)」を選択し、
Debugの中の「Trace Debug」の右にある下矢印ボタンをクリックして「Java Debug」に切り替え、「Java Debug」ボタンを押下することで起動できます。

ボタンを押下すると、パースペクティブビューで開きますか?みたいなポップアップが出ますが、とりあえずYesを選んでおきます。

すると、ゴリゴリのJavaデバッグ画面が開きます。

talend_blg_err_3

この画面で、該当エラーを吐く箇所を見つけます。
ちなみに、元のデザイナ画面に戻るためには、右上の「>>」ボタンを押下して、「Integration」ボタンを押せばokです。

talend_blg_err_4

エラーコンポーネントの物理名を確認する

一旦デザイナ画面に戻ります。
一度エラーを出すと、デザイナ画面でコンポーネントが赤く表示されているはずです。
今回の場合は、一番最初の画像のtMap(編集)が赤枠表示されていますので、このコンポーネントを選択し、コンポーネントの物理名を確認しておきます。

talend_blg_err_5

エラーを吐いているtMapの物理名は、”tMap_2″と分かりました。

エラーコンポーネントのコードを探す

エラーコンポーネントの物理名が特定できたら、デバッグ実行してJavaデバッグ画面に移動します。

そして、先程のエラーコンポーネント物理名でコードを検索します。

talend_blg_err_6

コンポーネント名で検索すると、そのコンポーネントの挙動開始っぽいコード部が見つかると思います。
今回の例ですと、上記画像のように、”tMap_2 begin | start”とのコメントがある部分にヒットしました。

ブレークポイントを張る

このあたりでブレークポイントを張ります。

talend_blg_err_7

ブレークポイントの張り方は、上記画像の赤線部の所にマウスカーソルを持って行って右クリック⇒ブレークポイントの切り替え(Toggle Breakpoint)をします。

ジョブを再開してブレークポイントまで実行

ブレークポイントを張ったら、ジョブを再開、というか、実行します。
下図の右上にある、再開ボタン(緑再生ボタンと黄色い縦線みたいなアイコン)を押下します。

talend_blg_err_8

仕掛けたブレークポイントが見当はずれでなければ、無事さっきのコードまで実行されます。
この段階でもうエラー落ちしてしまう場合は、仕掛けたブレークポイントの場所が悪いので、もう一度探し直します。

ここからは頑張りが必要です。
1行ずつエラーで落ちる箇所まで実行していきます。
明らかに落ちないだろうな…というコード部分までスクロールして、ブレークポイントを張って実行していってももちろんokです。

1行ずつ実行はF5(ステップイン)又はAlt+F6(ステップオーバー)です。
基本はAlt+F6でいいかと。

慣れてきたら、1行ずつ実行では一生終わらないので、経験勘でブレークポイント張る⇒一度に実行⇒次のブレークポイントを見つけて…と実行していきます。

エラー箇所、特定される

という感じで、頑張ってエラー行を特定します。
その行を踏んだらExceptionルートに入る箇所がエラー行です(当たり前か)。
今回はこのコードを踏むとエラールートに入りました。

talend_blg_err_9

tMapのout1側に値をセットするための一時変数の計算を行う部分です。

row1.SUURYO * row1.TANKA

で落ちるようです。

talend_blg_err_10

という訳で、値を見てみると、SUURYOがNULLとのことでした。

ま、まさか…入力データが悪いパターンの奴では!

talend_blg_err_11

はい。数値が入ってくると想定した部分が空欄だったのでNULLとなってNULL Pointer Exceptionということだったのでしょうね。はいはい。

再実行してエラーにならないことを確認

本来は、null判定を入れておくか、stringで受け取ってparse失敗しないか、とかを確認するように修正するべきでしょうが、今回はサンプルなんでデータを直して終了です。

talend_blg_err_12

正常にジョブ実行されることが確認できました。

おわりに

エラーメッセージとエラーコンポーネントから、「あぁ、たぶんここが悪いだろうな」と一発で分かる場合は良いんですが、全く見当が付かずに落ちてしまった場合は、Javaデバッガで頑張って探していくしか…ないという残念な結果となりました。

後で記事を書く予定ですが、エラーキャッチの処理をTalendで組んでおけば、エラー箇所の特定がより分かり易くなりますので、そういったジョブを作ることを心がけましょう。はい。

今回は以上です!

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です