Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
【PHPerKaigi2022】Mongo に溜まった約1.6億件の記事データを BigQue...
Search
kazunari.ueeda
April 28, 2022
Programming
500
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
【PHPerKaigi2022】Mongo に溜まった約1.6億件の記事データを BigQuery へ …
2022/04/09 ~ 11 に開催された PHPerKaigi 2022 の発表時の資料です。
kazunari.ueeda
April 28, 2022
Other Decks in Programming
See All in Programming
Vibes Containers 〜AIで変わるコンテナ設計と運用〜
tkikuc
3
540
手動確認はもう限界 〜XCUITestでCustom URL Schemeの遷移を起動種別ごとに自動テストする〜 / Testing Custom URL Schemes with XCUITest
otouto
0
260
Claude Codeを組織的に動かして月400PRを実現した話
happy_ryo
0
270
DroidKaigi 2026 「個人開発という実験場: Android エンジニアが手にする4つの自由」
slashnephy
0
230
モバイル交通系ICへのチャージ実例から考える、クロスプラットフォーム開発におけるiOS実機テスト設計とCI運用
yusuga
1
460
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
670
LL言語やWebフレームワークのPostgreSQL対応 〜DBの機能がユーザーに届くまで〜
kentaroutakeda
1
150
JPUG勉強会 OSSデータベースの内部構造を理解しよう(第2回)
oga5
0
210
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
0
270
iOSDC Japan 2026 - Swiftで作って学ぼう!データベース自作入門
kaseken
2
160
VueプロジェクトをTypeScript7に対応させる- Side-by-Side戦略による一部高速化 -
koukimiura
0
110
Are APIs Still Relevant in the AI Era?
soyuka
0
150
Featured
See All Featured
Documentation Writing (for coders)
carmenintech
77
5.5k
Leo the Paperboy
mayatellez
9
2.3k
How GitHub (no longer) Works
holman
316
150k
Are puppies a ranking factor?
jonoalderson
2
3.9k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
540
Darren the Foodie - Storyboard
khoart
PRO
3
3.9k
WENDY [Excerpt]
tessaabrams
13
39k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
460
What does AI have to do with Human Rights?
axbom
PRO
1
2.4k
Claude Code のすすめ
schroneko
67
230k
Become a Pro
speakerdeck
PRO
31
6.2k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3k
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 ご清聴ありがとうございました。