Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
【PHPerKaigi2022】Mongo に溜まった約1.6億件の記事データを BigQue...
Search
kazunari.ueeda
April 28, 2022
Programming
0
450
【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 Copilot and GitHub Codespaces Hands-on
ymd65536
1
110
たった 1 枚の PHP ファイルで実装する MCP サーバ / MCP Server with Vanilla PHP
okashoi
1
170
今ならAmazon ECSのサービス間通信をどう選ぶか / Selection of ECS Interservice Communication 2025
tkikuc
18
3.3k
関数型まつりレポート for JuliaTokai #22
antimon2
0
150
CursorはMCPを使った方が良いぞ
taigakono
1
170
PHP 8.4の新機能「プロパティフック」から学ぶオブジェクト指向設計とリスコフの置換原則
kentaroutakeda
2
470
既存デザインを変更せずにタップ領域を広げる方法
tahia910
1
240
型付きアクターモデルがもたらす分散シミュレーションの未来
piyo7
0
810
Composerが「依存解決」のためにどんな工夫をしているか #phpcon
o0h
PRO
1
210
XP, Testing and ninja testing
m_seki
3
180
エンジニア向け採用ピッチ資料
inusan
0
160
『自分のデータだけ見せたい!』を叶える──Laravel × Casbin で複雑権限をスッキリ解きほぐす 25 分
akitotsukahara
1
490
Featured
See All Featured
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Java REST API Framework Comparison - PWX 2021
mraible
31
8.6k
We Have a Design System, Now What?
morganepeng
53
7.7k
Code Review Best Practice
trishagee
68
18k
Speed Design
sergeychernyshev
32
1k
Being A Developer After 40
akosma
90
590k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Writing Fast Ruby
sferik
628
61k
Documentation Writing (for coders)
carmenintech
71
4.9k
Why You Should Never Use an ORM
jnunemaker
PRO
56
9.4k
KATA
mclloyd
29
14k
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 ご清聴ありがとうございました。