データは、量が増えると「別の生き物」になる

2021年から1年ちょっと、データウェアハウス構築の案件に参加していた。

大手スーパーの売上情報、いわゆるPOSデータを集約する仕事である。

全店舗の売上データが、定期的にS3に送られてくる。

それをPythonとAirflowの仕組みで分解・再構成して、Redshiftに格納する。

構成としては、それだけの話である。

パイプラインの絵を描けば、矢印3本で終わる。

だが、この案件は私のキャリアの中で、最大のデータ量を扱う仕事になった。

そして思い知った。

データというのは、量が増えると、別の生き物になる。

「行」が「流量」に変わる

普段のWEB開発で、データは「行」である。

ユーザーが1人登録すれば、1行増える。

注文が1件入れば、1行増える。

1行ずつ、顔が見える世界だ。

POSデータは違った。

全国の店舗から、毎日、何百万行という単位で降ってくる。

もはや行ではない。

流量である。

川の水を、コップではなくダムで受ける感覚だ。

この世界に入ると、いろいろな常識が変わる。

たとえば、ローカルで1秒で動いたスクリプト。

本番データに向けると、数時間返ってこない。

計算量のオーダーというものを、私は教科書ではなく、深夜の処理待ちで学び直した。

ループの中に置いた、たった1回の無駄なAPI呼び出し。

100万回繰り返されれば、それは立派な障害である。

小さな雑さが、量に掛け算されて、事故になる。

大規模データの世界では、コードの品質が「量」で拡大されるのだ。

エラーは「起きるもの」だった

もう一つ、哲学が変わったのがエラー処理である。

WEB開発では、エラーは「潰すもの」だった。

エラーが出たら調べて、直して、ゼロにする。

POSデータの世界では、この考え方が通用しなかった。

毎日数百万行も受けていると、必ず変なデータが混ざってくる。

仕様書にないコード値。

文字化けした商品名。

未来の日付で打刻されたレコード。

割合にすれば、0.1%にも満たない。

しかし0.1%でも、毎日数千行である。

1行ずつ調べて潰すことは、物理的にできない。

だから設計が変わる。

エラーは潰すものではなく、受け流すものになる。

変なデータは弾いて、退避場所に置いておく。

正常なデータの流れは、止めない。

弾いた分は、あとで集計して、傾向だけ見る。

完璧主義を捨てて、統計で考える。

几帳面な人ほど、この切り替えに苦しむと思う。

私も最初は、退避場所に溜まっていくデータを見るたびに、胃のあたりがざわざわした。

そのうち慣れた。

人間は慣れる。

バッチは「必ず失敗する」前提で組む

夜間バッチというのは、必ず失敗する。

30年やってきて、これは断言できる。

ネットワークが瞬断する。

送られてくるはずのファイルが、来ない。

いつもの倍のデータが、予告なく来る。

問題は、失敗するかどうかではない。

失敗した翌朝、どれだけ楽に復旧できるかである。

この案件でAirflowを使い込んで、一番鍛えられたのはそこだった。

途中でコケたら、コケたところから再開できるか。

同じ処理をもう一度流しても、データが二重にならないか。

いわゆる冪等性というやつである。

処理を最初から全部流し直せば済む、という規模ではない。

数時間かかる処理を頭からやり直すのは、翌朝の業務に間に合わないことを意味する。

だから、パイプラインは細かく区切る。

各区間は、何度流しても同じ結果になるように作る。

地味である。

華やかな機能は何一つない。

でも、深夜3時の障害通知に叩き起こされた朝、この地味さが自分を救う。

データ量は、請求書にも現れる

もう一つ、この案件で財布の感覚が変わった。

データ量とは、お金である。

ストレージの容量も、クエリのスキャン量も、全部AWSの請求書に載ってくる。

ファイルの圧縮形式を変えるだけで、目に見えて金額が変わる。

列指向フォーマットの意味を、私は本で読んで知っていたが、請求書で理解した。

技術の意味は、財布を通すと一番よく分かる。

それ以来の職業病

案件は2名体制で、泥臭く、しかし無事に回り続けた。

大規模データの知見は、その後のIoT案件やLLM案件でも、そのまま効いている。

そして、一つ職業病が残った。

新しいシステムでテーブル設計をするとき、必ずこう考えてしまうのである。

このテーブル、10年後には何行になっているだろう。

たいていの場合、答えは「大した行数にならない」である。

世の中のシステムの大半は、ビッグデータとは無縁のまま、平和に一生を終える。

それでも、考えずにはいられない。

一度ダムで水を受けた人間は、コップを見ても、つい水量を計算してしまうのである。