Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
【PHPerKaigi2022】Mongo に溜まった約1.6億件の記事データを BigQuery へ …
kazunari.ueeda
April 28, 2022
Programming
0
130
【PHPerKaigi2022】Mongo に溜まった約1.6億件の記事データを BigQuery へ …
2022/04/09 ~ 11 に開催された PHPerKaigi 2022 の発表時の資料です。
kazunari.ueeda
April 28, 2022
Tweet
Share
Other Decks in Programming
See All in Programming
GitHubのユーザー名を変更した後のあれこれ
tahia910
0
120
はじめてのプルリク - BLEA 編
watany
0
140
Gitlab CIでMRを自動生成する
forcia_dev_pr
0
110
競プロのすすめ
uya116
0
650
PythonユーザによるRust入門
rmizuta3
9
3k
Beyond Micro Frontends: Frontend Moduliths for the Enterprise @wad2022
manfredsteyer
PRO
0
120
IE Graduation Certificate
jxck
6
4.7k
VisualProgramming_GoogleHome_LINE
nearmugi
1
140
Vite でお手軽 Vue.js の環境構築
azuki
1
170
Node.jsデザインパターンを読んで
mmmommm
0
790
Cross Deviceチームにおけるスマートテレビアプリ開発ってどんな感じ?
cokaholic
0
120
Power Automateドリブンのチームマネジメント
hanaseleb
0
180
Featured
See All Featured
Support Driven Design
roundedbygravity
86
8.5k
Gamification - CAS2011
davidbonilla
75
3.9k
Design by the Numbers
sachag
271
17k
The Web Native Designer (August 2011)
paulrobertlloyd
74
1.9k
Why You Should Never Use an ORM
jnunemaker
PRO
47
7k
Happy Clients
brianwarren
89
5.6k
Optimizing for Happiness
mojombo
365
63k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
236
1M
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
19
1.4k
Designing for Performance
lara
597
63k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
269
11k
Become a Pro
speakerdeck
PRO
3
830
Transcript
MongoDB に溜まった約1.6億件の 記事データを BigQuery へ … ! 植江田 和成
自己紹介 • 植江田 和成 (ウエエダ カズナリ) • 2020年 ハッカソン新卒入社 •
2021年8月上旬頃より WebClipping 開発リーダー • Swift、SwiftUI、Goも書きます! • 好きなもの - ゲーム - 去年FF7をやって感動しました。 - エルデンリングがめっちゃやりたい - アニメ, 映画, ドラマ鑑賞 - ブルーピリオド - マイ・インターン - イカゲーム
何を話すの? • MongoDB に溜まった約1.6億件、データ量約1TBの記事データを BigQuery へ 移行した件について • WebClipping とは?
◦ どのようなサービスかざっくりと紹介 ◦ どこに MongoDB が使われているのか ? どのような構成か? • そもそもなぜこの作業をやることに? • どのように移行する? • 今後の進展 • 学べたこと
PR TIMESってご存知ですか?
WebClippingとは? • 様々なサイトから記事をクロールし、その記事にユーザーが設定した キーワードが含まれていればクリップしたりなど、 メディア露出の調査・分析などがおこえるサービスです。 • 現時点で1日のクロール数は10万件ほど
• どこに MongoDB が使われているのか? どのような構成か? ◦ クロールしてきた記事データを保持する目的で使われている。
なぜこの作業をすることに? • あるインシデント対応の際に実装が間違っていることに気づい た。 ◦ 「MongoDBには、2年以上昔の記事を削除する」 この仕様があったはずだが、 実際には5年以上の記事が残っていた。 ◦ データ量は合計で1TBほど(メモリに乗らない!)。
この仕様を実現したい!
• インシデント対応時にインスタンスタイプを r4.8xlarge(vCPU:32, メモリ:244GB) に変更し、 かなりの維持費を消費していた 😱 早めにサーバースペックダウンさせたい …
BigQuery に移行することで、 Mongo から消しつつも データは残して活用したい。 誰かが活用して くれたらいいな …
どのように移行する? • 少量の件数を BigQuery へ転送して極力エラーが出ない形で、 csvファイルを作成。 • s3 へアップロードする。 •
s3 から BigQuery へ転送する。 • ひたすらファイルを作成する。
1. BigQuery へ転送するcsvファイルを作成 • まずは少ない件数で bq load コマンドを実行し、BigQuery へ データを入れていく。
しかし、ここで問題が起こりました 🚨
MongoDB は動的なスキーマなのでスキーマに揺れがあった。結 果、静的スキーマの BigQuery に投入できなかった。 カラム順も数も型も バラバラじゃないか! 受け付けないよ❌ カラム順とかバラバラだ けどよろしく
~
BigQueryへ投入できなかった原因その1 • 謎のURLが格納されていた。 *スキーマレスなのとは関係ない壊れ方 ▪ https://~/path/</p>random_string ▪ URLのなかに</p>があれば捨てる処理を追加。
BigQueryへ投入できなかった原因その2 • 昔のデータと最近のデータでカラム数が違った。 ▪ ある時期からカラムが増えていた。 ▪ 全てのキーで存在チェックを行い、ない場合は null とした。
BigQuery へ投入できなかった原因その3 • カラムの順番が固定されていなかった。 ▪ bq load した時に、例えば int 型の
field に string を入れようとしているエ ラーがでたので、気づいた。 ▪ 配列の構造を固定した。
2. ひたすらファイルを作り続ける • 少量の件数は入るようになった! 次 はひたすらファイルを作成していく。
None
None
None
4. s3 から BigQuery へ転送する • あとは転送するだけ。 • BigQuery のデータ転送画面から諸々設定して、実行する。
転送実行!!!! ⚡
エラーがでた。 全件ファイル作ったあとなのに … 😢😢😢
そのエラー内容は? • 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
どのようにエラーを探したのか? • s3オブジェクトをディレクトリ分けして転送を何度も実行する。 もう少し具体的な対応方法を次のスライドで紹介します 👉
s3オブジェクトを分割して転送しまくろう。
とりあえず完了! • 壊れていたデータ(特定のカラムが存在しないなど) に関しては、 破棄するようにしていたので全件は入らなかったですが、 合計166,047,656件(1.6億)が入りました。 • 2年分のデータは残しそれ以外のデータは Mongo から削除して、
サーバースペックダウンも終了! 🎉👏
今後の進展 • 定時実行できるようにしたい。 ◦ 今もなお Mongo にはデータが増え続けている。 ◦ 1日約10万件のペースで …
• もっと速さを追い求めたい 🔥 ◦ ファイル作成処理を早くする方法はないかな?
学べたこと • ファイル操作 • PHPの Stream Wrapper が便利。 ◦ 圧縮や拡張など
Wrapper を付与するだけで行える。 https://www.php.net/manual/ja/wrappers.compression.php
• 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 • ちゃんとステップを踏めば、難しい作業ではない。
参考文献 • 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/
最後にPR TIMESの紹介 • プレスリリース配信件数で国内最多(自社調べ) • 月間PV数約5,800万 • 主にPHPで構築されています! https://prtimes.jp/ •
PR TIMESでは今回発表したWebClippingやプレスリリース配信 などのサービスを主にPHPで開発しています! PHPエンジニア募集中です!! 「PR TIMES 採用情報」で検索! https://herp.careers/v1/prtimes/ePCFEMomxCoA ご清聴ありがとうございました。