データ解析基盤を構築する前に考慮すべきポイント
概要
ここしばらく某社でデータの解析基盤を構築する仕事に携わっています。一からの構築になるので打てる手が多く楽しい一方で、適切な判断を下すのは難しいと実感しています。
解析基盤というのはもちろん解析を行うためのものですので、どう解析を行うかによってどういう基盤を構築していけばよいかが決まります。
ところで、データ(構造や収めているDBなども含めて)というのは寿命の長いもので、初期の設計を間違えてしまうと、その時点で戦略的な敗北は決まってしまいます。その後は運用しながら変更可能なところでゲリラ的に対応していくしか手を打てません。
そのため、実際に構築を行う前に、求められている解析がどのようなものかを十分に吟味した上で、適切なハードウェア、ミドルウェア、データ構造を選択し基盤を構築していくことが大変重要です。
着目すべき点
では解析のどのような点に着目すればよいかというと、私は次の5点を考えています。
- 対象のデータ量
- 解析可能になるまでのリードタイム
- 解析内容はアドホックか固定か
- 解析処理の内容
- 処理の再実行は必要か
完全に直交しているわけではないですが。
もちろんコストや運用面など他にも考慮すべき点は多いですが、解析内容に基盤を最適化させるという観点においては上記ポイントを挙げています。
実際に検討する際には、優先すべきは何かということを判断しながら手持ちのカードから選択していく形になります。家を探す時のようですね。
以下、個々のポイントについて簡単に思うところを書いていきます。
1. 対象のデータ量
オンメモリで処理できるかディスクに落とすか、更に大きくなれば分散処理が必要になってきます。
昨今のHadoop全盛な状況ですとまず分散させてとなるかもしれませんが、総データ量は多くても個々の解析に必要なデータは少ないようなケースでは、データのみ分散させて処理はシングルノードでという選択も十分にありえます。
2. 解析可能になるまでのリードタイム
どれ位前のデータまで解析の対象となっている必要があるか、ということです。
バッチ処理であればデータの配送から処理が完了し結果を表示できるまで、アドホックであればデータの配送から中間データ作成までに必要な時間でしょうか。
数分、数秒ということになれば処理はストリーミングでということになります。
3. 解析内容はアドホックか固定か
固定の場合は継続して同じ結果を取得したいという場合が多いでしょうから、定時のバッチ処理に最適化させることになります。
アドホックな解析であれば、解析が要求されてからのレイテンシーも重要なポイントになります。あり得る解析の全てに応えられるだけの情報を保ちつつ、できる限り短時間で応答できる中間データを作成することになるでしょう。
4. 解析処理の内容
ここ一つに大分色々なものを詰め込んでしまいました。
簡単な例では、ある項目でのフィルタや集約が多いのであればパーティショニングが非常に有効、などが挙げられると思います。
機械学習のような更に複雑な処理が必要となると、選択肢ははかなり狭まるでしょう。負荷もCPUインテンシブに近づくのでHWの選定も変わってくると思います。
5. 処理の再実行は必要か
大規模な基盤になれば365日ミスなく運用していくことは困難になります。解析結果に正確さが求められるのであれば、最悪のケースでも元データを基に再実行可能である必要があります。
もちろんそうでないケースも多いので、その場合は再実行可能であるという制約を外すことでことで打てる手を広げることができます。
まとめ
解析基盤を作る人間はそこで行われる解析について理解しているべき ということです。
さらにどのような選択肢があって各々の選択肢はどのような解析に向いているかを知っている必要があります。大変ですね。