Treasure Data - Support Engineering Team blog

トレジャーデータのサポートエンジニアリングチームのブログです。

Data ConnectorのJobでskipped lineがでる理由

トレジャーデータサポートの橘です。

最初のエントリーを書くことになりやや緊張しております。
このエントリーではよくお問い合わせを受ける想定よりも件数が少ない、または1件もデータがインポートされていないという事象についてお話をしたいと思います。

なお本記事に出てくるData ConnectorとはSourceの裏で動いているシステムの事を指します。

tl;dr

どういったJobか:

  • Successなのにインポート件数が少ない、または0件となっているJob

skipped lineが起きる理由:

  • 事前のデータ定義と不整合が起きるとData Connectorはインポートをスキップする
    • longと定義されているのに実際のデータにstringやnullが含まれていた
    • カラム数が多いまたは少ない
    • 等々

解消方法:

  • 事前定義の情報との不整合をなくす
    • 一旦全部stringで取り込んでしまう
    • カラム数の数をあわせる
    • 等々

何が起きているのか

文字だけですと実際のJobのイメージがつきにくいかと思いますので、実際の画面を確認してみましょう。 以下は実際のJobの画像です。
f:id:td-support:20200518151840j:plain (StatusがSuccessなのに0件インポート)

トラブルシューティングの基本であるログを確認しましょう。

 Skipped line gcs://hogehoge/flights/flights_raw_201501.csv:2 (Too few columns): 2015-01-01,"AA",19805,"AA","363",12953,1295302,31703,"LGA",13930,1393003,30977,"ORD","1950","1944",-6.00,11.00,"1955","2058",10.00,"2130","2108",-22.00,0.00,"",0.00,733.00

どうやらToo few columnsという理由にて、flights_raw_201501.csvの2行目の取り込みがSkipされてしまっています。 カラム数が少ないと指摘されています。

skipped lineがでる理由

カラム数が少ないという理由で取り込みがSkipされた事はわかりましたが、何に対して少ないかという事はまだ分かっていません。
とりあえず、Sourceの設定を確認することにします。

f:id:td-support:20200520110045j:plain

Souceの設定では28カラムあることを想定しているようです。
一方元データのカラム数は27カラムです。

$ head -n 1 flights_raw_201501.csv | awk -F ',' '{print NF}'  
27

Too few columnsというのはData Settingsで設定されたカラム数に対して実際のカラム数が少ないという事を意味しているという事がわかりました。 原因がようやくわかりました。あとは修正するだけです。

Data ConnectorはSourceの設定情報を正として動作します。そのため、その設定に合わないデータの取り込みは行いません。今回はカラム数の不一致でしたが、Data Typeの不一致も同様です。

試しにStringのData Typeをlongに変更して取り込みを行ってみましょう。 f:id:td-support:20200520112334j:plain

そうすると以下のようにNumberFormatExceptionという例外がでて、skipされてしまいました。

2020-05-20 02:21:09.689 +0000 [WARN] (0036:task-0001): Skipped line gcs://hogehoge/flights/flights_raw_201501.csv:3 (java.lang.NumberFormatException: For input string: "AA"): 2015-01-01,"AA",19805,"AA","364",13930,1393003,30977,"ORD",12953,1295302,31703,"LGA","1500","1456",-4.00,11.00,"1507","1743",6.00,"1800","1749",-11.00,0.00,"",0.00,733.00

Treasure Data自体はスキーマレスなのですが、Data Connectorはスキーマをきっちり管理しているのです。

Skipped lineの解消方法

Skipped lineをさせないためにはData Settingsと実際のデータを一致させることが必要です。
今回の件で言えば、元データに存在しないtestというカラムをData Settingsから削除したり、typeをstringに戻したりといった事が当てはまります。

f:id:td-support:20200520115040j:plain

不要なテストカラムをData Settingsから削除すると以下のように無事全件取り込む事ができました。

f:id:td-support:20200520115105j:plain

Skipped lineがあったら通知をしてほしい

Skipped lineがあったときに通知をしてほしいと思うかと思います。
デフォルトの設定だとSkipped lineが発生してもData ConnectorのJobはエラーとならずSuccessとなります。これではSkipped lineが発生しても気づかず、気づいたら全然データが入っていなかったという事になりかねません。 そういうときは以下のオプションを有効にしましょう。

Stop on invalid record?:

f:id:td-support:20200520115149j:plain

この項目にチェックをいれるとSkipped lineが発生するような場合にはJobがErrorになります。
Treasure Workflowの_errorやmailオペレーターと組み合わせて頂くことで柔軟に通知を送信することが可能となります。

まとめ

インポートされた件数が想定より少ないときは、Data ConnectorがSkipしてしまっていることが殆どです。 ログをみてどこがおかしかったのかを確認しながら、Data Settingsを修正することで解消することができます。もし詰まってしまう事があればその際はTreasure Dataのサポートまでお問い合わせ下さい。