Spark ステージの高 I/O
次に、最も長いステージの I/O 統計をもう一度見てみましょう。
高I/Oとは?
I/O 列にどれだけのデータが含まれていると高いと見なされるか。 これを理解するには、まず、指定された列のいずれかで最も高い番号から始めます。 次に、すべてのワーカーで持っている CPU コアの合計数を考えてみましょう。 通常、各コアは毎秒約3MBの読み取りと書き込みが可能です。
最大の I/O 列をクラスターワーカー コアの数で除算し、それを duration 秒数で除算します。 結果が約 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 が見つからない場合は、さらに詳しく調べる必要があります。I/O が少ない Slow Spark ステージを参照してください。