🍕

【Python・PySpaチートシート【PySaprkのデータ処理手順Driver,Catalist,Task,Job,...を理解する!】

2025/02/26に公開

Pysaprkの内部処理

データフレームからカラム抽出までの流れ

タイトル:Spark DataFrameの処理🏠

(データがシステムに入力され、処理が始まるところからスタート)

Scene 1: データの入力

💾 データソース「トランザクションデータをロードしてください!(Job)
👨‍💻 Driverノード「かしこまりました!処理計画 (Stage) を立てます!」

→ ここで「Job」が発生!

Scene 2: Driverノードが処理計画を作成

👨‍💻 Driverノード「処理は3つのステージ (Stage) に分けるぞ!」
📜 処理計画 (Stages)

『データを読み込む (Stage 1)
『必要なカラムを選択 (Stage 2)
『結果を保存 (Stage 3)
👨‍💻 Driverノード「Masterノード各Worker にタスクを割り振るぞ!」
🖥️ Masterノード「了解です!Workerノード たちに指示を出します!」

Scene 3: データを読み込む(Stage 1)

🖥️ Masterノード「各Workerノード! データを分散して読み込め!」
💾 Worker1ノード「パーティション1のデータをロード!(Task)
💾 Worker2ノード「パーティション2のデータをロード!(Task)

📖 Catalyst Optimizer「効率的な読み込み戦略を適用中…」

💬 Driverノード「Catalystの最適化により、データロードが最適化された!」

Scene 4: 必要なカラムを選択(Stage 2)

🖥️ Masterノード「次はカラム選択処理だ!」
📊 Worker3ノード「必要なカラムをフィルタリング!(Task)
📊 Worker4ノード「計算不要なカラムを削除!(Task)

🔄 Shuffle発生! 🖥️ Worker5ノード「カラムデータを適切なパーティションに再配置!(Shuffle)」

例えば、顧客ID と 決済金額 のカラムを抽出し、適切なノードにデータを分配する工程です。
この工程が Shuffle に相当し、データ処理の負荷を均等にする役割を果たします。

Scene 5: 結果を保存(Stage 3)

🖥️ Masterノード「処理が完了したデータを保存するぞ!」
💾 Worker6ノード「データを書き出し!(Task)
💾 Worker7ノード「ストレージに保存!(Task)

💬 Driverノード「処理完了!」

🎉 Job完了! データフレームから必要なカラムを抽出し、保存しました!

まとめ

この流れは、PySparkでのデータフレーム処理を以下のように対応させたものです:

  1. Job(データ処理リクエスト) が発生すると、
  2. DriverノードがStage(処理計画)を作成し、Masterノードに指示を出す
  3. WorkerノードがTask(分散処理)を実行する
  4. Catalyst Optimizer(最適化エンジン)が効率化を行い、Shuffleでデータを適切に分配する
  5. 最終的に、選択したカラムのみを保存し、Job完了!

PySparkの内部処理をピザ屋で再現🍕!

注文から配達までの流れ ✨

タイトル:ピザ屋「Spark Pizza」の一日🏠

(お客様が入店し、ピザを注文するところからスタート)

Scene 1: 注文の受付

👩‍💼 お客様「マルゲリータのLサイズを1枚お願いします!(Job)
👨‍🍳 店長(Driver)「かしこまりました!作業計画 (Stage) を立てます!」

→ ここで「注文(Job)」が発生!

Scene 2: 店長(Driver)が作業計画を作成

👨‍🍳 店長(Driver)「ピザ作りは3つのステージ(Stage) に分けるぞ!」
📜 作業計画 (Stages)

『生地を作る (Stage 1)
『トッピングして焼く (Stage 2)
『配達する (Stage 3)
👨‍🍳 店長 (Driverノード)「バイトリーダー (Master)、作業を割り振るぞ!」
👨‍💼 バイトリーダー (Masterノード)「了解です!店員 (Worker) たちに指示を出します!」

Scene 3: 生地を作る(Stage 1)

👨‍💼 バイトリーダー (Masterノード)「厨房チーム (Core)!まずは生地を作るぞ!」
👩‍🍳 店員 (Worker1ノード)「よし、生地をこねる! (Task)
👨‍🍳 店員 (Worker2ノード)「発酵させて伸ばす! (Task)

📖 マニュアル (Catalyst) が指示を出す
「生地は15分寝かせてから伸ばと効率が良い」

💬 店長 (Driverノード) 「マニュアル通りに作業できてるな!」

Scene 4: トッピングして焼く(Stage 2)

👨‍💼 バイトリーダー (Master)「次はトッピングして焼くぞ!」
👨‍🍳 店員 (Worker3)「チーズとトマトをのせる! (Task)
👩‍🍳 店員 (Worker4)「オーブンで焼く! (Task)

🍅 材料の分け直し (Shuffle) 発生!
👨‍🍳 店員 (Worker5ノード)「材料を均等に分け直して、各ピザに必要なトッピングを配置する!(Shuffle)

例えば、各ピザに必要なチーズやトマト、ペパロニなどの材料を適切に分ける工程です。
この工程がShuffleに相当し、ピザごとの作業負荷を均等にする役割を果たします。

Scene 5: 配達する(Stage 3)

👨‍💼 バイトリーダー (Masterノード)「ピザが焼き上がった!ホールチーム (Core)、配達の準備だ!」
👨‍🍳 店員 (Worker6ノード)「箱に詰める! (Task)
👨‍🦰 店員 (Worker7)「配達に出発! (Task)

👩‍💼 お客様「ピザが届いた!おいしそう!」
🎉 注文 (Job) 完了!

まとめ

このピザ屋の流れをSparkに置き換えると:

  1. Job(注文) が発生すると、
  2. Driver(店長)がStage(作業計画)を立てて、Master(バイトリーダー)に指示し、
  3. Worker(店員)がTask(作業)を実行する
  4. Catalyst(マニュアル)に従って最適化し、Shuffle(材料の分配)も行う
  5. 最終的にピザ(データ処理の結果)をお客様に届ける!

Discussion