spark-optimization について
Apache Spark ジョブのチューニングとトラブルシューティングに役立つ実践パターンをまとめたスキルです。性能、メモリ、パーティション、shuffle、データ偏りに取り組む技術者向けです。
主な機能
- 01パーティションサイズの戦略
- 02メモリと executor の調整
- 03shuffle とデータ偏りの軽減
- 04Spark 実行モデルの概要
- 05references/details.md の実践例
活用シーン
- 01遅い Spark ジョブの原因調査
- 02executor のメモリと設定の調整
- 03大規模データセット向けパイプラインの拡張
- 04shuffle とデータ偏りの低減
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ full-stack-skills/ devops-skills --skill spark-optimizationインストール後、Claude Code で/spark-optimizationを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSE.txtagents/openai.yamlexamples/advanced-usage.mdbasic-usage.mdintegration.mdreferences/details.md詳細
出典の声明:wshobson/agents を基にしたスキルの内容です
(MIT License、Copyright (c) 2024 Seth Hobson。ライセンス全文は同じディレクトリのLICENSE.txtをご覧ください)。
使用、変更、再配布にあたっては、この MIT ライセンスの条項に従い、著作権表示を保持する必要があります。
Apache Spark の最適化
パーティショニング戦略、メモリ管理、シャッフルの最適化、パフォーマンスチューニングなど、Apache Spark ジョブを最適化するための本番環境向けパターンです。
このスキルを使う場面
- 遅い Spark ジョブを最適化する
- メモリとエグゼキューターの構成を調整する
- 効率的なパーティショニング戦略を実装する
- Spark のパフォーマンス問題をデバッグする
- 大規模データセット向けに Spark パイプラインをスケールする
- シャッフルとデータスキューを減らす
主要な概念
1. Spark の実行モデル
Driver Program
↓
Job (triggered by action)
↓
Stages (separated by shuffles)
↓
Tasks (one per partition)
2. 主なパフォーマンス要因
| 要因 | 影響 | 解決策 |
|---|---|---|
| シャッフル | ネットワーク I/O、ディスク I/O | ワイド変換を最小限に抑える |
| データスキュー | タスク実行時間のばらつき | ソルティング、ブロードキャスト結合 |
| シリアライズ | CPU オーバーヘッド | Kryo、列指向フォーマットを使用する |
| メモリ | GC 負荷、スピル | エグゼキューターのメモリを調整する |
| パーティション | 並列処理 | パーティションのサイズを適切に調整する |
クイックスタート
from pyspark.sql import SparkSession
from pyspark.sql import functions as F
# Create optimized Spark session
spark = (SparkSession.builder
.appName("OptimizedJob")
.config("spark.sql.adaptive.enabled", "true")
.config("spark.sql.adaptive.coalescePartitions.enabled", "true")
.config("spark.sql.adaptive.skewJoin.enabled", "true")
.config("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
.config("spark.sql.shuffle.partitions", "200")
.getOrCreate())
# Read with optimized settings
df = (spark.read
.format("parquet")
.option("mergeSchema", "false")
.load("s3://bucket/data/"))
# Efficient transformations
result = (df
.filter(F.col("date") >= "2024-01-01")
.select("id", "amount", "category")
.groupBy("category")
.agg(F.sum("amount").alias("total")))
result.write.mode("overwrite").parquet("s3://bucket/output/")
詳細なパターンと実例
詳細なパターンのドキュメントは references/details.md にあります。上記のナビゲーションだけでは不十分な場合は、このファイルをお読みください。
ベストプラクティス
推奨事項
- AQE を有効にする - 適応型クエリ実行により、多くの問題に対処できます
- Parquet/Delta を使用する - 圧縮に対応した列指向フォーマットです
- 小さなテーブルをブロードキャストする - 小規模な結合でのシャッフルを回避できます
- Spark UI を監視する - スキュー、スピル、GC を確認します
- パーティションのサイズを適切に調整する - パーティションあたり 128MB ~ 256MB
非推奨事項
- 大きなデータを collect しない - データは分散したままにします
- 不要な UDF を使わない - 組み込み関数を使用します
- キャッシュしすぎない - メモリには限りがあります
- データスキューを無視しない - ジョブの実行時間を大きく左右します
- 存在確認に
.count()を使わない -.take(1)または.isEmpty()を使用します
コメント
Markdown 対応