Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

自己紹介 ● 植江田 和成 (ウエエダ カズナリ) ● 2020年 ハッカソン新卒入社 ● 2021年8月上旬頃より WebClipping 開発リーダー ● Swift、SwiftUI、Goも書きます! ● 好きなもの - ゲーム - 去年FF7をやって感動しました。 - エルデンリングがめっちゃやりたい - アニメ, 映画, ドラマ鑑賞 - ブルーピリオド - マイ・インターン - イカゲーム

Slide 3

Slide 3 text

何を話すの? ● MongoDB に溜まった約1.6億件、データ量約1TBの記事データを BigQuery へ 移行した件について ● WebClipping とは? ○ どのようなサービスかざっくりと紹介 ○ どこに MongoDB が使われているのか ? どのような構成か? ● そもそもなぜこの作業をやることに? ● どのように移行する? ● 今後の進展 ● 学べたこと

Slide 4

Slide 4 text

PR TIMESってご存知ですか?

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

この仕様を実現したい!

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

1. BigQuery へ転送するcsvファイルを作成 ● まずは少ない件数で bq load コマンドを実行し、BigQuery へ データを入れていく。 しかし、ここで問題が起こりました 🚨

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

BigQuery へ投入できなかった原因その3 ● カラムの順番が固定されていなかった。 ■ bq load した時に、例えば int 型の field に string を入れようとしているエ ラーがでたので、気づいた。 ■ 配列の構造を固定した。

Slide 17

Slide 17 text

2. ひたすらファイルを作り続ける ● 少量の件数は入るようになった! 次 はひたすらファイルを作成していく。

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

4. s3 から BigQuery へ転送する ● あとは転送するだけ。 ● BigQuery のデータ転送画面から諸々設定して、実行する。 転送実行!!!! ⚡

Slide 22

Slide 22 text

エラーがでた。 全件ファイル作ったあとなのに … 😢😢😢

Slide 23

Slide 23 text

そのエラー内容は? ● 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

Slide 24

Slide 24 text

どのようにエラーを探したのか? ● s3オブジェクトをディレクトリ分けして転送を何度も実行する。 もう少し具体的な対応方法を次のスライドで紹介します 👉

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

とりあえず完了! ● 壊れていたデータ(特定のカラムが存在しないなど) に関しては、 破棄するようにしていたので全件は入らなかったですが、 合計166,047,656件(1.6億)が入りました。 ● 2年分のデータは残しそれ以外のデータは Mongo から削除して、 サーバースペックダウンも終了! 🎉👏

Slide 27

Slide 27 text

今後の進展 ● 定時実行できるようにしたい。 ○ 今もなお Mongo にはデータが増え続けている。 ○ 1日約10万件のペースで … ● もっと速さを追い求めたい 🔥 ○ ファイル作成処理を早くする方法はないかな?

Slide 28

Slide 28 text

学べたこと ● ファイル操作 ● PHPの Stream Wrapper が便利。 ○ 圧縮や拡張など Wrapper を付与するだけで行える。 https://www.php.net/manual/ja/wrappers.compression.php

Slide 29

Slide 29 text

● 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 ● ちゃんとステップを踏めば、難しい作業ではない。

Slide 30

Slide 30 text

参考文献 ● 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/

Slide 31

Slide 31 text

最後にPR TIMESの紹介 ● プレスリリース配信件数で国内最多(自社調べ) ● 月間PV数約5,800万 ● 主にPHPで構築されています! https://prtimes.jp/ ● PR TIMESでは今回発表したWebClippingやプレスリリース配信 などのサービスを主にPHPで開発しています! PHPエンジニア募集中です!! 「PR TIMES 採用情報」で検索! https://herp.careers/v1/prtimes/ePCFEMomxCoA ご清聴ありがとうございました。