次に、最も長いステージの I/O 統計をもう一度見てください。
高い I/Oとは何ですか
高いと見なされるためには、I/O 列にどのくらいのデータが必要ですか? これを理解するには、まず、指定された列の中で最も大きい数値から始めます。 次に、すべてのワーカーに対して持っている CPU コアの合計数を検討します。 通常、各コアは 1 秒あたり約 3 MB の読み取りと書き込みを行うことができます。
最大の I/O 列をクラスター ワーカー コアの数で除算し、それを期間 (秒) で除算します。 結果が約 3 MB の場合は、おそらく I/O 処理によって制約を受けています。 これが高い I/O になります。
高入力
ステージに多くの入力が表示される場合は、データの読み取りに多くの時間を費やしていることを意味します。 まず、このステージで読み取っているデータを特定します。 Spark の DAG での高価な読み取りの識別を参照してください。
特定のデータを特定した後、読み取りを高速化するための方法をいくつか次に示します。
- Delta を使用します。
- データのスキップを改善するために、液体クラスタリングを使用します。 表に液体クラスタリングを使用するを参照してください。
- Photonを試してみてください。 これは、特に広いテーブルの場合、読み取り速度に大いに役立ちます。
- クエリの選択性を高め、できるだけ多くのデータを読み取る必要がないようにします。
- データのスキップがより効果的になるように、データ レイアウトを再考します。
- 同じデータを複数回読み取る場合は、 Delta キャッシュを使用します。
- 参加する場合は、DFP を動作させることを検討してください。
- クラスターのサイズを大きくするか、サーバーレス コンピューティングを使用します。
高出力
ステージからの出力が多い場合は、データの書き込みに多くの時間が費やされていることを意味します。 これを解決するためのいくつかの方法を次に示します。
- 大量のデータを書き直していますか? 「Spark がデータ を書き換えて確認しているかどうかを確認する方法」を参照してください。 大量のデータを書き直す場合:
- 最適化が必要なマージがあるかどうかを確認します。
- 削除ベクトル を使用して、Parquet ファイルを書き換えずに既存の行を削除または変更済みとしてマークします。
- Photon がまだ有効になっていない場合は有効にします。 Photonは書き込み速度に大いに役立ちます。
- クラスターのサイズを大きくするか、サーバーレス コンピューティングを使用します。
高シャッフル
Databricks では、spark が最適なシャッフル パーティションの数を自動的に選択できるように、 spark.sql.shuffle.partitions=auto を設定することをお勧めします。 シャッフルに慣れていない場合は、ここで 学習します。
高い入出力はありません
どの列にも高い I/O が表示されない場合は、さらに詳しく調べる必要があります。 I/O が少ない低速 Spark ステージの説明を参照してください。