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億件の記事データを BigQuery へ …
Search
kazunari.ueeda
April 28, 2022
Programming
0
380
【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
WebComponentsで フレームワークを1ページに共存させる
webuilder240
0
150
htmx is fun!
codehex
2
190
DocC Tutorial と TCA におけるテスト機能の紹介
kalupas226
1
330
15分間でふんわり理解するDocker @ Matsuriba MAX
ukwhatn
PRO
1
340
C# 大統一理論推進委員会 会員のための Unity Package Manager プロジェクト構成案
monry
PRO
0
580
incrementalモデルの理解を深める
ikkimiyazaki
2
640
設計の知識と技能で駆動するソフトウェア開発
masuda220
PRO
18
11k
ファイル先頭の use の意味、説明できますか? 〜PHP の namespace と autoloading の関係を正しく理解しよう〜 / namespace and autoloading in php
okashoi
2
470
Dockerで始めるAWS Lambda開発
stutkhd0709
14
2.5k
オブジェクト指向は必要なのか / Is object-oriented needed?
kishida
27
19k
Deep Dive 大規模システムアーキテクチャ/開発組織エンジニアリング / Deep Dive Large-Scale System Architecture, Development Organization Engineering
nrslib
15
2.9k
もうすぐ新年度、Babylon.jsがお勧めな3個の理由
hideg
0
170
Featured
See All Featured
Why You Should Never Use an ORM
jnunemaker
PRO
50
8.6k
A Philosophy of Restraint
colly
195
15k
Embracing the Ebb and Flow
colly
78
4.1k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
39
4.3k
The Brand Is Dead. Long Live the Brand.
mthomps
48
22k
YesSQL, Process and Tooling at Scale
rocio
160
13k
Into the Great Unknown - MozCon
thekraken
10
830
Optimizing for Happiness
mojombo
369
69k
VelocityConf: Rendering Performance Case Studies
addyosmani
319
23k
A Tale of Four Properties
chriscoyier
150
22k
WebSockets: Embracing the real-time Web
robhawkes
59
6.9k
Reflections from 52 weeks, 52 projects
jeffersonlam
343
19k
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 ご清聴ありがとうございました。