Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
40_алгоритмов_Python.pdf
Скачиваний:
9
Добавлен:
07.04.2024
Размер:
13.02 Mб
Скачать

Разработка стратегии мультипроцессорной обработки

343

1. Прежде всего импортируем необходимые библиотеки Python:

import numpy as np import cupy as cp import time

2.Создадим многомерный массив в NumPy, традиционной библиотеке Python, использующей CPU .

3.Затем создадим многомерный массив, задействуя массив CuPy, который использует уже GPU. Теперь сравним время выполнения:

###Запуск на CPU с помощью Numpy start_time = time.time() myvar_cpu = np.ones((800,800,800)) end_time = time.time() print(end_time - start_time)

###Запуск на GPU с помощью CuPy start_time = time.time() myvar_gpu = cp.ones((800,800,800)) cp.cuda.Stream.null.synchronize() end_time = time.time() print(end_time - start_time)

Если запустить этот код, он сгенерирует следующий вывод (рис. 13.7).

Рис. 13.7

Обратите внимание, что для создания массива в NumPy потребовалось около 1.13 секунды, а в CuPy — около 0.012 секунды, что ускоряет инициализацию этого массива на GPU в 92 раза.

Кластерные вычисления

Кластерные вычисления — один из способов реализации параллельной обра­ ботки для крупномасштабных алгоритмов. В кластерных вычислениях ис­ пользуется несколько нод, соединенных посредством высокоскоростной сети. Крупномасштабные алгоритмы представляются в виде заданий. Отдельное задание разделено на различные задачи, каждая из которых выполняется на отдельной ноде.

344

Глава 13. Крупномасштабные алгоритмы

Apache Spark — одна из самых популярных платформ для реализации кластер­ ных вычислений. В Apache Spark данные преобразуются в устойчивые распре­ деленные наборы данных, которые называются RDD (resilient distributed datasets). RDD являются ключевой абстракцией Apache Spark и представляют собой неизменяемые наборы элементов, которыми можно управлять параллель­ но. Они разбиты на разделы и распределены по нодам следующим образом (рис. 13.8).

= •

RDD, Dataset . .

, HDFS, NoSQL . .

C 0

C 1

••

C N

JVM = Š ‹ Java

Рис. 13.8

Благодаря такой структуре данных мы можем запускать алгоритмы парал­ лельно.

Реализация обработки данных в Apache Spark

Давайте узнаем, как создать RDD в Apache Spark и запустить распределенную обработку по всему кластеру.

1. Сначала необходимо создать новый сеанс Spark:

from pyspark.sql import SparkSession

spark = SparkSession.builder.appName('cloudanum').getOrCreate()

2.Далее используем CSV-файл в качестве источника RDD. Запустим следую­ щую функцию с именем df — она создаст RDD, который преобразуется

Разработка стратегии мультипроцессорной обработки

345

в DataFrame. Возможность преобразовать RDD в DataFrame была добавле­ на в Spark 2.0; это упрощает обработку данных:

df = spark.read.csv('taxi2.csv',inferSchema=True,header=True)

Посмотрим на столбцы DataFrame (рис. 13.9).

Рис. 13.9

3. Создадим временную таблицу из DataFrame:

df.createOrReplaceTempView("main")

4.Как только временная таблица создана, можно запустить SQL-операторы для обработки данных (рис. 13.10).

Рис. 13.10

Важно отметить, что, хотя это выглядит как обычный DataFrame, это всего лишь высокоуровневая структура данных. На самом деле это RDD, который распре­ деляет данные по кластеру. Подобным образом при запуске SQL-функций они преобразуются в параллельные трансформеры и редьюсеры и всецело исполь­ зуют мощности кластера для обработки кода.