Upgrade to Pro — share decks privately, control downloads, hide ads and more …

【PHPerKaigi2022】Mongo に溜まった約1.6億件の記事データを BigQuery へ …

【PHPerKaigi2022】Mongo に溜まった約1.6億件の記事データを BigQuery へ …

2022/04/09 ~ 11 に開催された PHPerKaigi 2022 の発表時の資料です。

C9206c01d92fe6141158122f2c6e95fa?s=128

kazunari.ueeda

April 28, 2022
Tweet

Transcript

  1. MongoDB に溜まった約1.6億件の 記事データを BigQuery へ … ! 植江田 和成

  2. 自己紹介 • 植江田 和成 (ウエエダ カズナリ) • 2020年 ハッカソン新卒入社 •

    2021年8月上旬頃より WebClipping 開発リーダー • Swift、SwiftUI、Goも書きます! • 好きなもの - ゲーム - 去年FF7をやって感動しました。 - エルデンリングがめっちゃやりたい - アニメ, 映画, ドラマ鑑賞 - ブルーピリオド - マイ・インターン - イカゲーム
  3. 何を話すの? • MongoDB に溜まった約1.6億件、データ量約1TBの記事データを BigQuery へ 移行した件について • WebClipping とは?

    ◦ どのようなサービスかざっくりと紹介 ◦ どこに MongoDB が使われているのか ? どのような構成か? • そもそもなぜこの作業をやることに? • どのように移行する? • 今後の進展 • 学べたこと
  4. PR TIMESってご存知ですか?

  5. WebClippingとは? • 様々なサイトから記事をクロールし、その記事にユーザーが設定した キーワードが含まれていればクリップしたりなど、 メディア露出の調査・分析などがおこえるサービスです。 • 現時点で1日のクロール数は10万件ほど

  6. • どこに MongoDB が使われているのか? どのような構成か? ◦ クロールしてきた記事データを保持する目的で使われている。

  7. なぜこの作業をすることに? • あるインシデント対応の際に実装が間違っていることに気づい た。 ◦ 「MongoDBには、2年以上昔の記事を削除する」 この仕様があったはずだが、 実際には5年以上の記事が残っていた。 ◦ データ量は合計で1TBほど(メモリに乗らない!)。

  8. この仕様を実現したい!

  9. • インシデント対応時にインスタンスタイプを r4.8xlarge(vCPU:32, メモリ:244GB) に変更し、 かなりの維持費を消費していた 😱 早めにサーバースペックダウンさせたい …

  10. BigQuery に移行することで、 Mongo から消しつつも データは残して活用したい。 誰かが活用して くれたらいいな …

  11. どのように移行する? • 少量の件数を BigQuery へ転送して極力エラーが出ない形で、 csvファイルを作成。 • s3 へアップロードする。 •

    s3 から BigQuery へ転送する。 • ひたすらファイルを作成する。
  12. 1. BigQuery へ転送するcsvファイルを作成 • まずは少ない件数で bq load コマンドを実行し、BigQuery へ データを入れていく。

    しかし、ここで問題が起こりました 🚨
  13. MongoDB は動的なスキーマなのでスキーマに揺れがあった。結 果、静的スキーマの BigQuery に投入できなかった。 カラム順も数も型も バラバラじゃないか! 受け付けないよ❌ カラム順とかバラバラだ けどよろしく

    ~
  14. BigQueryへ投入できなかった原因その1 • 謎のURLが格納されていた。 *スキーマレスなのとは関係ない壊れ方 ▪ https://~/path/</p>random_string ▪ URLのなかに</p>があれば捨てる処理を追加。

  15. BigQueryへ投入できなかった原因その2 • 昔のデータと最近のデータでカラム数が違った。 ▪ ある時期からカラムが増えていた。 ▪ 全てのキーで存在チェックを行い、ない場合は null とした。

  16. BigQuery へ投入できなかった原因その3 • カラムの順番が固定されていなかった。 ▪ bq load した時に、例えば int 型の

    field に string を入れようとしているエ ラーがでたので、気づいた。 ▪ 配列の構造を固定した。
  17. 2. ひたすらファイルを作り続ける • 少量の件数は入るようになった! 次 はひたすらファイルを作成していく。

  18. None
  19. None
  20. None
  21. 4. s3 から BigQuery へ転送する • あとは転送するだけ。 • BigQuery のデータ転送画面から諸々設定して、実行する。

    転送実行!!!! ⚡
  22. エラーがでた。 全件ファイル作ったあとなのに … 😢😢😢

  23. そのエラー内容は? • Cannot return an invalid timestamp value of 1552896131000000000

    microseconds relative to the Unix epoch. The range of valid timestamp values is [0001-01-01 00:00:00, 9999-12-31 23:59:59.999999]; ◦ タイムスタンプの範囲が無効になっていました。 つまり、この範囲を超えた1万年後のデータがいたのでは? ◦ 最大値は、253402300799999999
  24. どのようにエラーを探したのか? • s3オブジェクトをディレクトリ分けして転送を何度も実行する。 もう少し具体的な対応方法を次のスライドで紹介します 👉

  25. s3オブジェクトを分割して転送しまくろう。

  26. とりあえず完了! • 壊れていたデータ(特定のカラムが存在しないなど) に関しては、 破棄するようにしていたので全件は入らなかったですが、 合計166,047,656件(1.6億)が入りました。 • 2年分のデータは残しそれ以外のデータは Mongo から削除して、

    サーバースペックダウンも終了! 🎉👏
  27. 今後の進展 • 定時実行できるようにしたい。 ◦ 今もなお Mongo にはデータが増え続けている。 ◦ 1日約10万件のペースで …

    • もっと速さを追い求めたい 🔥 ◦ ファイル作成処理を早くする方法はないかな?
  28. 学べたこと • ファイル操作 • PHPの Stream Wrapper が便利。 ◦ 圧縮や拡張など

    Wrapper を付与するだけで行える。 https://www.php.net/manual/ja/wrappers.compression.php
  29. • BigQuery に関しての知識 ◦ s3は2020/12/3に「強い書き込み後の読み込み整合性」がサポートされ、待たず とも転送ができるようになったはずですが、転送できない場合がありました。なの でs3から転送するには10分ほど待ってから実行が望ましい? ▪ AWS s3

    整合性モデル https://docs.aws.amazon.com/AmazonS3/latest/dev/Introduction.ht ml#ConsistencyModel ◦ bq コマンドの使い方 ▪ bq コマンドラインツールの使用 https://cloud.google.com/bigquery/docs/bq-command-line-tool?hl=ja • ちゃんとステップを踏めば、難しい作業ではない。
  30. 参考文献 • BigQuery に関して ◦ https://cloud.google.com/bigquery/docs?hl=ja • php:// さまざまな入出力ストリームへのアクセス ◦

    https://www.php.net/manual/ja/wrappers.php.php • タイムスタンプの許容範囲 ◦ https://stackoverflow.com/questions/51648970/bigquery-error-cannot -return-an-invalid-timestamp-value-of-6328502092800000000 • AWS SDK for PHP ◦ https://aws.amazon.com/jp/sdk-for-php/
  31. 最後にPR TIMESの紹介 • プレスリリース配信件数で国内最多(自社調べ) • 月間PV数約5,800万 • 主にPHPで構築されています! https://prtimes.jp/ •

    PR TIMESでは今回発表したWebClippingやプレスリリース配信 などのサービスを主にPHPで開発しています! PHPエンジニア募集中です!! 「PR TIMES 採用情報」で検索! https://herp.careers/v1/prtimes/ePCFEMomxCoA ご清聴ありがとうございました。