はじめに
troccoを使ってデータ転送を行う際、発生したエラーの解決法がパッとは出てこなかったので、誰かの役に立ったら嬉しいなと思い書いておきます。
あと、サポート担当の方が丁寧に教えてくれたので、ググって出てくるようになったら恩返しになるかなと。あとtroccoのサポート良いよ。ってことも付け加えておきます。
環境情報
- Source
- MongoDB
- Dest
- BigQuery
起こったことと対処方法
概要
MongoDBからBQにデータを転送するジョブを設定。
また、日次でデータが更新されるようスケジュールも設定。
公式では incremental_field
はシーケンシャルなユニークなキーを使うことを推奨していますが、_id
はこれに該当しないため代替として更新日時を利用するよう設定しました。
発生したエラー
上記のジョブを設定後、実行してみたところ以下のエラーが発生しました。
Query failed with error code 292 and error message 'Executor error during find command :: caused by :: Sort exceeded memory limit of 104857600 bytes, but did not opt in to external sorting.' on server [server address]
サポートにヘルプを依頼
色々と試行錯誤しましたが解決の糸口が見つからなかったので、サポートに確認したところ以下の回答でした。
初回の転送データが大きいことが原因となりますので、初回のみ転送するデータをクエリで分割していただけますと幸いです。
差分転送に切り替える際は、転送済みのMAX(id)やMAX(date)の値を最後に転送されたレコードに入力いただければ積み上げで転送されていきます。
(以下略)
なるほど。そういうことね。
じゃあ転送設定のクエリでフィルタ設定をしよう。ということで以下を設定してみました。
{ "create_datetime": {"$lte": ISODate("2022-09-01T00:00:00.000Z")} }
しかし、設定後に「接続を確認」を行ったところ以下のエラーが表示されました。
認証時にエラーが発生しました。設定をご確認ください。
invalid format
うーん。
実データのタイムスタンプのフォーマットは間違っていない。
MongoDB compassで構文を確認してみましたが、それも問題は無い。
再度サポートにヘルプを依頼したところ、
拡張JSON形式であればクエリできることを確認いたしました。
ということで、最終的に以下を設定することで対応できました。
{"create_datetime": {"$lte":{"$date":"2022-09-01T00:00:00.000Z"}}}
まとめ
- 以下のエラーが出たら転送量を制限して初期データを投入しましょう
Query failed with error code 292 and error message 'Executor error during find command :: caused by :: Sort exceeded memory limit of 104857600 bytes, but did not opt in to external sorting.' on server [server address]
- クエリでフィルタする場合は拡張JSON形式で設定しましょう
- troccoサポートは丁寧で素晴らしい