mcpField
S
spark-optimization

spark-optimization

github.com/wshobsonデータ・データベース41.9k10.8k 回インストール2 週間前に更新
リポジトリ

spark-optimization について

Apache Sparkのジョブを最適化するスキルです。パーティション、メモリ、シャッフル、性能調査に関する本番向けの指針を提供し、Sparkデータパイプラインの調整や拡張に役立ちます。

主な機能

  1. 01パーティションサイズの戦略
  2. 02メモリとExecutorの調整
  3. 03シャッフル削減手法
  4. 04データスキューの緩和
  5. 05Spark性能問題の調査

活用シーン

  1. 01遅いSparkジョブの高速化
  2. 02Executorメモリ設定の調整
  3. 03大規模データセット向けパイプラインの拡張
  4. 04データスキューやシャッフル負荷の調査

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/wshobson/agents --skill spark-optimization

インストール後、Claude Code で/spark-optimizationを入力して読み込まれたか確認します。

同梱ファイルreferences/details.md

詳細

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() を使用する

コメント