私は最近、HiveとImpalaを使用して、HDFSにある大量のCSVデータのクエリを検討し始めました。私が期待していたように、Impalaの応答時間は、これまでに使用したクエリのHiveと比較して向上しています。
まだHiveを必要とするクエリ/ユースケースの種類があり、Impalaが適していない場所があります。
Impalaは、HDFS上の同じデータに対してHiveと比較して、より高速なクエリ応答をどのように提供しますか?
Impalaは「SQL on HDFS」と表示されるはずですが、Hiveはより「SQL on Hadoop」です。
つまり、ImpalaはHadoopをまったく使用していません。 HDFSにあるデータの一部をキャッシュするすべてのノードでデーモンが実行されているため、これらのデーモンはMap/Reduceジョブ全体を実行することなくデータを迅速に返すことができます。
この理由は、Map/Reduceジョブの実行に特定のオーバーヘッドが伴うため、Map/Reduceを完全に短絡させることで、実行時にかなり大きな利益を得ることができるからです。
とはいえ、ImpalaはHiveに代わるものではなく、非常に異なるユースケースに適しています。 Impalaは、Hiveと比較してフォールトトレランスを提供しないため、クエリ中に問題が発生した場合、その問題は解消されます。間違いなく、1つのジョブの失敗に費用がかかるETLタイプのジョブの場合、Hiveをお勧めしますが、Impalaは、小規模なアドホッククエリ、たとえば、データサイエンティストやビジネスアナリストを見て、一部のデータを分析したい場合に最適です堅牢なジョブを構築することなく。また、個人的な経験から、Impalaはまだそれほど成熟しておらず、データの量が使用可能なメモリよりも大きい場合にクラッシュすることがあります。
私見、HDFSのSQLとHadoopのSQLは同じです。結局のところ、HadoopはHDFS(およびMapReduce)です。したがって、HDFSでSQLと言うとき、それはHadoop上のSQLであると理解されます(MapReduceの有無にかかわらず)。
実際の質問に戻ると、ImpalaはMPP
(大規模並列処理)を使用するため、初期のオーバーヘッドを伴うHive(Charles sirが指定した)を使用するHiveとは異なり、応答が速くなります。超並列処理は、並行して実行される多数の個別のCPUを使用して、各CPUが専用のメモリを持つ単一のプログラムを実行するコンピューティングの一種です。 MPPベースのImpalaがMapReduceジョブのオーバーヘッドを含まないというまさにその事実viz。ジョブのセットアップと作成、スロット割り当て、分割作成、マップ生成などにより、非常に高速になります。
しかし、それはImpalaがすべての問題の解決策であることを意味するものではありません。非常にメモリ集約型(MPP)であるため、結合などの大量のデータ操作を必要とするタスクには適していません。すべてをメモリに収めることができないからです。これは、Hiveがより適している場所です。
したがって、リアルタイムが必要な場合は、データのサブセットに対するアドホッククエリがImpalaに送信されます。また、バッチ処理が必要な場合は、ビッグデータを介してHiveを使用してください。
HTH
Impalaには、高速化する重要な機能がいくつかあります。
別のjvmでforkするのに非常に高価なmap/reduceを使用しません。クエリを分割して並行して実行し、最後に結果セットをマージする別個のImpalaデーモンを実行します。
ほとんどの操作をメモリ内で実行します。
ストレージにはhdfsを使用し、大きなファイルを高速に処理します。クエリから結果、データまで可能な限りキャッシュします。
寄木細工のような新しいファイル形式をサポートします。これは円柱状のファイル形式です。そのため、この形式を使用すると、ほとんどの場合、少数の列のみにアクセスするクエリの方が高速になります。