Работа с кластером на языке Python
reysand - 3 июля, 2025 - 13:48
Пример программы на 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) суммирует количество попаданий в круг и позволяет вычислить приближённое значение числа π по формуле Монте-Карло.
- 82 просмотра