Работа с кластером на языке Python

Пример программы на Python (pi.py):

import sys
from random import random
from operator import add

from pyspark.sql import SparkSession


if __name__ == "__main__":
    """
        Usage: pi [partitions]
    """
    # Создание SparkSession (точка входа для приложений на Spark)
    spark = SparkSession.builder\
        .appName("PythonPi")\  # Название приложения для отображения в Spark UI
        .config("spark.jars.packages", "com.nvidia:rapids-4-spark_2.13:25.08.0")
        .getOrCreate()

    # Определение числа разделов для распараллеливания задачи
    partitions = int(sys.argv[1]) if len(sys.argv) > 1 else 2
    n = 100000 * partitions  # Общее количество точек

    # Функция для генерации случайной точки и проверки попадания в единичный круг
    def f(_: int) -> float:
        x = random() * 2 - 1  # x в диапазоне [-1, 1]
        y = random() * 2 - 1  # y в диапазоне [-1, 1]
        return 1 if x ** 2 + y ** 2 <= 1 else 0  # 1, если точка внутри круга, иначе 0

    # Распараллеливание задачи, применение функции и подсчет числа попаданий внутрь круга
    count = spark.sparkContext.parallelize(range(1, n + 1), partitions).map(f).reduce(add)
    # Вычисление приближенного значения числа Пи по формуле Монте-Карло
    print("Pi is roughly %f" % (4.0 * count / n))

    spark.stop()  # Завершение сессии Spark

Запуск программы на кластере:

spark-runner.sh pi.py 100

Основные моменты:

  • SparkSession создаёт контекст для работы с PySpark и подключает необходимые библиотеки, например RAPIDS для ускорения вычислений на GPU.
  • Параметр partitions регулирует, сколько подзадач создаст Spark для распределённых вычислений, что упрощает масштабирование.
  • Функция f реализует логику Монте-Карло: случайные точки проверяются, попали ли они в круг радиусом 1 внутри квадрата 2х2.
  • parallelize(range(...), partitions) создаёт распределённую коллекцию (RDD) с заданным числом разделов для параллельных вычислений.
  • reduce(add) суммирует количество попаданий в круг и позволяет вычислить приближённое значение числа π по формуле Монте-Карло.