近年、分散型SQLクエリエンジンとして注目を集めている「Hive」と「Presto」
それらの性質の違いに目を向けて、白黒つけてやろうじゃないかという記事です
#そもそもHiveって?
簡単に言ってしまえば、MapReduce処理を可能にする分散型SQLクエリエンジンです
MapReduce処理とは大量のデータを高速に処理するための分散処理フレームワークで、HiveQLというSQLライクな言語を用いてHadoop上で実行できるという優れものでした
とまあその辺りで、Hiveに関する詳細は諸事情により割愛させていただきます(書き出したらキリがないので…)
そんなんじゃ理解できねえよ!という方は、「Hadoop Hive MapReduce」などのキーワードで検索して頂けるとご納得いくかと思います
Hiveはそもそもバッチ処理を目的としており、クエリを実行してからのレスポンスの遅さがネックとなっていました
そこで登場するのが、Prestoなのです
#そもそもPrestoって?
Presto is an open source distributed SQL query engine for running interactive analytic queries against data sources of all sizes ranging from gigabytes to petabytes.
Presto was designed and written from the ground up for interactive analytics and approaches the speed of commercial data warehouses while scaling to the size of organizations like Facebook.
公式サイト(http://prestodb.github.io/) より
(-"-;)ムム…英語…
要約すると、
- Facebookが開発している分散型SQLクエリエンジン
- あらゆる大きさのデータサイズに対しても、インタラクティブ(対話的)な処理が可能
インタラクティブというだけあってクエリ処理が高速で行われ、実行結果をリアルタイムに取得できるという点で優れているとのこと(Facebookすげぇ)
じゃあ、なぜそんな高速処理ができるのか
っていう疑問になりますよね
それは、Hiveと計算の仕組みが根本的に異なるからです
上で述べたように、Hiveはクエリが実行された際にMapReduce処理がなされるのに対し、
Prestoはクエリが実行された際、ジョブをタスクに分割し、タスクが並行して処理されるのです
また、中間データをメモリに持つことでデータのやりとりが高速になり、素早いレスポンスを得ることが可能となっているのです
(※しかし、これは裏を返せば、中間データがメモリ上に乗り切らない場合は処理が失敗する可能性もあるということになります)
(トレジャーデータのブログより引用: https://tug.red/entry/2014/07/10/150250/)
どっちが優れてるって訳じゃない!
それなら、HiveではなくPrestoだけ使えばいいじゃん!
と結論づけてしまってはいけません
PrestoとHiveの使い分けを簡単に説明している方がいたので引用させていただきました
(引用: https://www.slideshare.net/y-ken/bullet-hadoop-query-engine-presto)
- Presto
- 長くても2~3分で終わる集計に最適
- コンパクトな処理をすばやく実行したい時- Hive
- 数分以上〜数時間掛かるバッチクエリ
- メモリに乗り切らないオーダーの処理
- JOIN数が多い時ないし、JOINの条件が文字列である時
- 結果セットが数百万行、文字列型カラム多数の時
処理時間だけではなく、メモリに乗り切る処理かどうかも判断基準になりますね
中間データが大きくなる並列処理の場合はHive、小さくて済む並列処理の場合はPrestoといった辺りでしょうか
補完しあうHiveとPresto
とまあ、簡単ではありますが、HiveとPrestoはどちらが優れているというわけではなく、お互いが補完しあっているということがお分り頂けたでしょうか
その時々に応じた使い分けが求められますね
めでたしめでたし