私は最近、Hive と Impala を使用して、HDFS にある大量の CSV データのセットを照会することを検討し始めました。予想通り、これまで使用してきたクエリでは、Hive と比較して Impala の方が応答時間が短縮されています。
まだHiveが必要で、Impalaが適していないクエリ/ユースケースのタイプがあるかどうか疑問に思っています.
HDFS 上の同じデータに対して、Impala はどのようにして Hive よりも高速なクエリ応答を提供しますか?
私見、HDFS上のSQLとHadoop上のSQLは同じです。結局、Hadoop は HDFS (および MapReduce) です。したがって、HDFS 上の SQL と言うとき、それは Hadoop 上の SQL であることが理解されます (MapReduce の有無にかかわらず)。
実際の質問に戻ると、Impala は、MPP
内部で MapReduce を使用する Hive とは異なり、(Charles sir が指定したように) いくつかの初期オーバーヘッドを伴う (超並列処理) を使用するため、より高速な応答を提供します。超並列処理は、並列に実行される多数の個別の CPU を使用して、各 CPU が独自の専用メモリを持つ単一のプログラムを実行するコンピューティングの一種です。Impala は MPP ベースであり、MapReduce ジョブのオーバーヘッドを伴わないという事実そのものです。ジョブのセットアップと作成、スロットの割り当て、スプリットの作成、マップの生成などにより、非常に高速になります。
しかし、それは Impala がすべての問題の解決策であるという意味ではありません。非常にメモリ集約型 (MPP) であるため、すべてをメモリに収めることができないため、結合などの大量のデータ操作を必要とするタスクには適していません。これは、Hive が適しているところです。
そのため、リアルタイムが必要な場合、データのサブセットに対するアドホック クエリは Impala を使用します。また、ビッグデータに対してバッチ処理が必要な場合は、Hive を選択してください。
HTH
impala には、高速化を実現する重要な機能がいくつかあります。
別々の jvm で fork するのに非常にコストがかかる map/reduce を使用しません。クエリを分割して並列に実行し、最後に結果セットをマージする別の Impala Daemon を実行します。
ほとんどの操作はメモリ内で実行されます。
ストレージには、大きなファイルに対して高速な hdfs を使用します。クエリから結果、データまで可能な限りキャッシュします。
列形式のファイル形式である寄木細工のような新しいファイル形式をサポートしています。したがって、この形式を使用すると、ほとんどの場合少数の列のみにアクセスするクエリで高速になります。