Twitterで「早く今流行のMPPの大まかな使い方の違い書けよ!」というプレッシャーが半端ないのでてきとうに書きます.この記事は俺の経験と勉強会などでユーザから聞いた話をもとに書いているので,すべてが俺の経験ではありません(特にBigQuery).各社のSAの人とかに聞けば,もっと良いアプローチとか詳細を教えてくれるかもしれません.
オンプレミスの商用MPPは使ったことないのでノーコメントです.
MPP on HadoopでPrestoがメインなのは今一番使っているからで,Impalaなど他のMPP on Hadoop的なものも似たような感じかなと思っています. もちろん実装の違いなどがあるので,その辺は適宜自分で補間してください.
前提
アプリケーションを開発していて,そのための解析基盤を一から作る.
簡単なまとめ
- データを貯める所が作れるのであれば,そこに直接クエリを投げられるPrestoなどのMPPクエリエンジンを立てるのが楽
- 特にHadoopとかすでにある場合には,まずこれ
- データマートが必要であれば,RedshiftやBigQueryの方が向いている
- ストレージもスキーマも運用も何も考えずにやりたいのであれば,BigQueryにFluentdとかでとりあえずJSONでぶち込むのが,多分この候補の中では一番初期コストが掛からない
- もちろん要求によるので気をつける
- Presto + Redshiftというケースも有り(アドホックなクエリはPresto,BIからガリガリつなぐのにRedshiftなど)
以下つらつらとリスト形式で書いてます.
Presto/Impala/Drill
PrestoやImpalaやApache Drillは,Redshift/BigQueryと違ってMPPデータベースではなくてMPPクエリエンジンなので,そこに違いがある. Prestoそのものについては,@frsyuki がHCJ 2014で発表したスライドがあるので,そっちも参考に.
- PrestoやImpalaはそもそもサービスじゃないので,自分ですべて運用する必要がある.
- 死活監視とか,もう少しワーカーが欲しかったら追加でデプロイみたいなのをする人が必要
- 外部にストレージが必要
- すでにある場合には,RedshiftやBigQueryじゃなくて,まずこれで十分かどうか試すという流れになりつつある
- PrestoならS3とかにもクエリが投げられるので,FluentdでS3にJSONで貯めて,とかで構築コストはかなり軽減出来る
- ストレージ側にスキーマを要求せず,直接クエリが投げられる
- MapReduceとかとデータソースを共有出来る
- データ量が増えてくると,ストレージからMPPデータベースにimportするだけでコストになるので,アドホックにクエリが投げにくくなる
- PrestoやApache Drillは一つのクエリで複数のデータソースにアクセス出来るので.マスターテーブルとのjoinとかが楽に出来る
- 速さに関しては,やはりスキーマありでチューニングされたMPPにはまだ基本勝てない.状況によっては勝てる時もある
- それでも数秒 - 数十秒で返ってきたりするので,どこまでパフォーマンスを求めるかによる
- クエリ同時実行制御に関しては,まだ商用のものに迫っているのはない印象
- ここの改善に取り組んでいる人たちがいるので,いずれデータマート的にも使えるようになる可能性は高い
- オープンソースなので,問題があったら自分で修正可能,処理傾向も把握しやすい
Redshift
- スキーマが必須なので,アドホックに解析するためのデータベースとしては少し不向き
- やるならデータをJSON文字列で保存,クエリ時に分解する.効率は落ちる
- MPPデータベース(ParAccel)がAWSカスタマイズされて載っているので,その辺の知識がないと嵌まりやすい
- AWS Casualで青木さんが話したふつうのRedshiftパフォーマンスチューニングが参考になる
- データ量がすくないとそれでもパワーでなんとかなる
- マネージドサービスとはいえ,リーダーノードの挙動がおかしい時など,面倒を見ないと行けないケースはある
- カラムを弄る場合は基本テーブルを作り直すのがベター.クラスタ再配置中はREAD ONLYになるので,その辺含めて運用を考える必要がある
- 数時間READ ONLYの場合,貯めようとしていたログはどうするか,など
- 今時はMPPデータベース単体で運用している所は少ない.RedshiftでもEMRなどからデータを整形して一気にガツンと入れるのが多い
- クエリの同時実行制御周りはそれなりに頑張っている
- データマートして使いやすい.バッチを投げると厳しいとのこと.
- ストレージと演算パワーが分離してないので,ユースケースによってはコストが割に合わない
- 特に周りだとSSDインスタンスを使っている人は
いないほとんどいない(この辺の話). - 某ふっふはっほ社が「たべみる」でSSDをつかってました(AWS Summitでのスライド).が,これはかなり特殊なケースな気も.横に並べることによるメリットが大きいようです.
- 特に周りだとSSDインスタンスを使っている人は
BigQuery
- Redshiftと同じく,アドホックに色々とデータをぶち込んで解析するには,JSON文字列(record型?)で保存する必要がある
- 既存のMPPデータベースとかで考えないと行けない問題(distkeyとか)を,Googleパワーで強引に解決
- 運用は完全Google任せ
- Redshiftと違いGoogleの環境を共有するので,細かなことは出来ない
- Googleの制約を受ける
- 負荷が極端に上がるようなクエリとかは望み薄(FULL OUTER JOIN, 数億同士のjoin,count(distinct))
- Redshift同様,でかいバッチ向けにHDFSとかオブジェクトストレージに生のデータを置いておくのがベター
- BigQueryもスキーマがあり,alter column的なものがないので,変更する時は適宜テーブルを作り直すのがベター
- Redshiftと違いクエリ単位の課金なので,どれだけ掛かるか把握するのが難しい
- Streaming Importが結構パフォーマンスが出るので,importして即クエリがやりやすい(参考記事)
- リミットがあるので,大量に入れる時には気をつける.2015年から有料.
- 同時実行制御周りは基本よく動く
- リソースはGoogle側が管理しているので,バッチ投げたら詰まるとかは起きにくい
- リソースを占有しているわけではないので,勝手にクエリが死んだり,いきなり遅くなったりすることもある
- 日本時間の21時当たりで起きやすいらしい.でかいバッチを投げまくっているユーザが海外にいる?
まとめ
基本的にこれらの裏にはHadoopなどの基盤が前提になりつつある(オブジェクトストレージ + 演算リソースでも可).上のリストを眺めれば,なんとなく使い分けが分かるんじゃないでしょうか! MPPと一纏めにするにはユースケースや得意なものが違うので,ちゃんと使い分けましょう.基本的にどれもBIツールと接続する方法があり,苦労はそんなにしないはず.
各プロダクトは常に改善されているので,ここに書いてある制約などは,いずれ緩和される可能性があります.常に最新情報をチェックしましょう.
今回はMPPクエリエンジンプロダクトの話なので上のリストでは省きましたが,Treasure Dataが提供しているTQAというMPPサービスは「Prestoで運用とかストレージを考えなくていい版」に近い感じになります.TDはさまざまな外部ストレージと連携出来るので,Treasure Dataを中心に使い分ける感じになります.
最後に宣伝!
P.S
Twitterに流したさらに要約したtweet.
Presto on Storage/BigQuery/Redshiftはユースケースがバラバラなので,適宜使い分ければ良いという単純な話.ただ,HDFSやオブジェクトストレージみたいなのにデータが永続化されている前提なので,Prestoは入りには楽だよね,というのはあります.
— Mr. Fiber (@repeatedly) July 23, 2014
Redshiftは同時実行制御頑張っているし,distkeyとかをちゃんと設計してあげればかなりパフォーマンスが出るので,データマートとして優秀.特に8XLとかであれば,RDSとかでは頑張れない領域になる.ただ,スキーマの変更に弱いので,適宜ロードしてあげないと行けないのがネック
— Mr. Fiber (@repeatedly) July 23, 2014
BigQueryは逆に,その辺のMPPの知識ないけど楽に処理したい,という時には便利.ストレージと密結合しているRedshiftと違ってストレージとしては安価なので,ガンガンデータを入れられる.スキーマの変更に弱いのと,G社の都合でクエリに制限が掛かったり不安定になるのがネック
— Mr. Fiber (@repeatedly) July 23, 2014
Prestoは単体だとストレージがないので,裏側に何を使うかによってかなり左右される.ちゃんとしたHadoopクラスタやオブジェクトストレージがあれば,同時実行制御の部分に難はあるが,低レイテンシクエリーとしては十分優秀.データのインポートの手間がないのが大きい.
— Mr. Fiber (@repeatedly) July 23, 2014
まぁHadoopとかあるならとりあえずPresto入れとくか,という流れにはなりつつある気がする.それでも同時にたくさんのクエリが飛んでくるとか,ある程度スキーマ固まったのでガッツリ使いたい,になるとRedshiftとかBigQueryにバッチでinsert,がよくあるパターン
— Mr. Fiber (@repeatedly) July 23, 2014
やっぱり他のMPPデータベースにデータ入れるの面倒だからPrestoでがんばりたい,というユーザ結構いてその人たちが色々とPrestoをデータマート的に使えるようにと頑張っているようなので,いずれHadoop上ですべて完結する世界は来るかもしれない
— Mr. Fiber (@repeatedly) July 23, 2014
トレジャーデータというサービス,自分でインフラ管理する必要ないですし,Fluentd/JS/iOS/Androidなどからデータを入れるだけで,即バッチや低レイテンシクエリを投げられる,便利なサービスらしいですよ > http://t.co/gSg9ZTNjKt
— Mr. Fiber (@repeatedly) July 23, 2014
社会人の勤めを果たした
— Mr. Fiber (@repeatedly) July 23, 2014