ベストアンサー
可能なベンチマークでは、SparkSqlはHiveよりも「はるかに」高速です。 FacebookはPrestoを思いついたが、Sparkのデザインの安価なコピーがハイブの内部に置かれ、Tezには新しいバージョンのハイブもある。DAGとの不幸はここに詳しく記載されている Tezの悲劇ですが、SQL関連のすべてのタスク(たとえば、マップ側のSQL =>フィルター、データの変更、またはサイドのSQLの削減=>並べ替え/集計/ウィンドウ関数)では、Sparkは依然として明るく輝いています。
質問では「なぜ」という質問がないため、これらの技術的な詳細についてはあまり説明しません。ただし、わかりやすくするために、各タスクが完了する前に保持しているデータセット全体(レプリケーションを含む)を書き込む必要がある分散データ処理モデルを考えてみてください。アプリケーションはそれ自体でリソース使用率を測定できず、アプリケーションはどこにありますか。タスク/実行ステージの起動におけるクラスターマネージャーの慈悲と、タスクがほとんどの時間メモリ内に存在でき、エンジンによってリソースをインテリジェントに割り当てられ、フレームワークが配置できる別の分散データ処理モデルと比較します。クラスターマネージャーの最上位にあり、コンテナーの割り当て(およびバイパスすることもできる少しのDe / Serialization)以外はクラスターマネージャーに依存していません
(簡潔にするために、しませんでしたSpark 1.6 / 2.xがTungstenまたはクエリ最適化のためのsimd実装でゲームを強化していることにも言及してください)
どのモデルがレイテンシーの戦いに勝つと思いますか?
回答
クエリから始めましょう:Hiveは、HiveおよびHadoopの機能に固有のSQLのサブセット(Hive言語( LanguageManual-Apache Hive-Apache Software Foundation ))を実装します。送信されたクエリは、操作またはステージで実装可能な断片、述語に分割されます。 SELECT col1 、 col2 、… coln は、返された各行のどの列がソリューションセットに保持されて返されるかを指定します。同様に、LEFTまたはRIGHT結合は特定の状態、おそらくMap-Reduce(M\_R)ステージで実装されます。クエリが特定の操作に一致する部分に分割されると、Cost-Based Optimizer(CBO)は収集および保存された統計を使用して、これらの各段階の実行方法についてインテリジェントな決定を行います。たとえば、WHERE句は、あまり具体的でない(カーディナリティが低い)場合、またはテーブルがパーティション化されていない場合、テーブルスキャンとして実装できます。または、テーブルがパーティション化され、WHERE句でパーティション列が指定されている場合、パーティションが削除される可能性があります。高い特異性で。クエリで複数の結合が指定されている場合、各結合はMap-Reduceステージとして実装されます。結合テーブルの1つが非常に小さい場合は、パフォーマンスを向上させるためにCBOによる実行用にMap-Joinが選択される場合があります。
CBOが実行プランをレイアウトすると、通常、ステージがスケジュールされて実行されます。複数のMRステージとして。クエリに対してEXPLAINを実行することで、CBOが特定のクエリを実行するために使用する実行プランを調べることができます。
ビデオ業界に、ユーザーの視聴習慣に関する統計を収集するクライアントがいました。これらの統計は、クライアントが希望する1つの非常に大きなテーブル(数百のTiB)に集められ、各ビデオ、ビデオの俳優、各ビデオのプロット、制作データなどに関するデータを含む約20の比較的小さなテーブルと結合されました。小さいテーブルを連続して結合するビューを作成し、最終的にビューテーブルと結果ビューに結合し、結果ビューを出力テーブルに書き込みました。結果ビューから出力テーブルに選択する簡単なクエリを送信すると(CREATE TABLE output(…)AS SELECT * FROM results\_view)Hiveは、すべての中間ビューを最終ビューにマテリアライズした25段階のクエリを作成しました。出力テーブルに。各ステージはM-Rジョブ(YARNの場合)であり、M-Rジョブのセットアップ時間はそのクラスターで約30秒であったため、M-Rセットアップ時間には約12〜14分が費やされました。ほとんどのM-Rステージは45秒未満で実行され、そのうちの2/3はM-Rセットアップ時間で、1/3は実際の実行でした。小さいテーブルのビューア統計テーブルへの最終的なマップ結合には、さらに20分かかりました。結果テーブルに連続して結合される一連のビューを作成することで、1つのクエリで20以上のテーブルを結合しようとする大規模なクエリを作成するのではなく、比較的単純なクエリの束でアセンブルされるパイプラインを作成できました。