Избавьтесь от стресса в Черную пятницу с помощью Spark

Как обрабатывать операцию reduceByKey для больших наборов данных в Spark

По прогнозам, к 2025 году в мире будет генерироваться 160 зеттабайт данных[1]. Кроме того, годовой доход мирового рынка аналитики больших данных, по оценкам, достигнет 68,09 млрд долларов США к 2025 году [2], а к 2025 году объем больших данных составит 229,4 млрд долларов США [3]. Объем генерируемых и обрабатываемых данных продолжает увеличиваться, становится все более важным иметь эффективные и масштабируемые методы обработки этих данных, иначе экономическая и коммерческая ценность будет потеряна.

Традиционные методы обработки данных, такие как использование одной машины, могут быстро перестать работать с большими наборами данных. Это привело к разработке сред распределенных вычислений, таких как Apache Spark, которые позволяют обрабатывать большие наборы данных на нескольких машинах.

Метод уменьшения

Сокращение данных — это метод, используемый в инженерии данных для объединения или обобщения данных таким образом, чтобы их было легче анализировать. Для этого требуется взять большой набор данных и группировать данные вместе на основе ключевого значения, например идентификатора продукта или имени клиента. После того как данные сгруппированы, они объединяются для создания сводки данных.

Например, вы можете сократить данные о продажах по категориям продуктов, чтобы получить общую сумму продаж для каждой категории. Этот метод особенно полезен при работе с большими наборами данных, поскольку он позволяет более эффективно анализировать данные и избегать проблем с производительностью.

Apache ReduceByKey()

reduceByKey — это операция, используемая в Spark для суммирования пар ключ-значение распределенным образом. Как упоминалось ранее, используя эту операцию, можно выполнять сложные преобразования данных в больших наборах данных, не перегружая ни одну машину. Это позволяет работать с наборами данных, которые было бы невозможно обработать с помощью традиционных вычислений. методы.

reduceByKeyобъединяет значения для каждого ключа, используя ассоциативную функцию редукции [4][5]. По сути, берет набор пар "ключ-значение" и применит функцию к значениям каждого ключа, чтобы получить одно выходное значение[6]. Например, если у вас есть коллекция пар ключ-значение, представляющая данные о продажах, вы можете использовать ее reduceByKey для расчета общего объема продаж для каждой категории продуктов.

Пример Черной пятницы

Давайте воспользуемся набором данных о продажах в Черную пятницу от Kaggle, чтобы продемонстрировать, как reduceByKey можно использовать для эффективного объединения данных. Набор данных содержит такую ​​информацию, как User_ID, Product_ID, Gender , Age, Occupation Purchase и другие.



Начнем с создания сеанса Spark и загрузки набора данных в PySpark DataFrame, а закончим его отображением.

from pyspark.sql import SparkSession

# Create SparkSession
spark = SparkSession.builder.appName("BlackFridaySales").getOrCreate()

# Load the dataset
sales_df = spark.read.csv("black_friday_sales.csv", header=True, inferSchema=True)

sales_df.show()

Давайте рассмотрим поля Purchase и Product_ID для этой иллюстрации. Мы используем функцию map() для сопоставления каждой строки с кортежем, содержащим Product_ID в качестве ключа и Purchase суммы в качестве значения. Этот шаг имеет решающее значение для работы операции reduceByKey, так как для нее требуется ключ- пара значений RDD (устойчивый распределенный набор данных).

Когда у нас есть пары ключ-значение, мы применяем операцию reduceByKey для агрегирования общей суммы покупки для каждого продукта. В результате создается новый RDD, в котором каждый ключ (продукт) связан с общей суммой покупки.

Наконец, мы преобразуем RDD обратно в DataFrame и сортируем продукты по общей сумме покупки в порядке убывания.

# select the necessary columns for the analysis
data = sales_df.select("Product_ID", "Purchase")

# group the data by Product_Category_1 and calculate the total purchase amount for each product id
category_totals = data.rdd.reduceByKey(lambda x, y: x + y).collect()

# print the results
for category, total_purchase in category_totals:
    print("ProductID {}: Total Purchase Amount = {}".format(category, total_purchase))

reduceByKey значительно уменьшает объем данных, которые необходимо обработать и проанализировать, что может быть важным преимуществом при работе с большими наборами данных. Во-вторых, он может повысить производительность за счет сведения к минимуму перетасовки данных между узлами в распределенной вычислительной среде. Наконец, reduceByKey очень прост в использовании и может применяться к широкому диапазону наборов данных, содержащих пары "ключ-значение". .

Проблема с reduceByKey заключается в том, что он требует перетасовки данных по сети, что может занять много времени и ресурсов. Это особенно актуально при работе с очень большими наборами данных, где объем перетасовываемых данных может быть на несколько порядков больше исходного набора данных. Это может привести к длительному времени обработки, что может вызвать стресс у разработчиков, которым необходимо быстро получать результаты.

Чтобы уменьшить нагрузку и повысить производительность reduceByKey, вы можете сделать несколько вещей. Во-первых, вы можете попытаться свести к минимуму объем перемешиваемых данных, используя более конкретные пары "ключ-значение". . Например, если у вас есть коллекция данных о продажах с ключами, представляющими категорию продукта и дату, вы можете использовать reduceByKey для расчета общего объема продаж для каждой категории продуктов на каждую дату. Это сведет к минимуму количество перемешиваемых данных, поскольку вычисления будут распределяться по каждой дате и категории продукта отдельно.

Другой вариант — использовать кэширование для хранения промежуточных результатов в памяти, что может уменьшить объем перемешиваемых данных и ускорить время обработки. Кэшируя данные, к которым часто обращаются или повторно используют в памяти, вы можете избежать их повторного вычисления каждый раз, когда это необходимо.

Кроме того, вы можете попытаться оптимизировать выполнение reduceByKey, настроив параметры конфигурации Apache Spark. Например, вы можете настроить количество разделов, используемых для распределения данных между узлами, или увеличить объем памяти, выделяемой каждому исполнителю. Экспериментируя с этими настройками, вы можете найти оптимальную конфигурацию для своего конкретного использования. случай.

В заключение, reduceByKey как операция является мощным инструментом для сокращения данных и суммирования пар ключ-значение в Apache Spark. Однако при работе с очень большими наборами данных это все равно может вызывать стресс у разработчиков.

Следуя советам и рекомендациям, изложенным в этой статье, вы сможете более эффективно справиться с операцией reduceByKey и снизить уровень стресса в процессе!

Надеемся, что эта информация поможет вам улучшить рабочие процессы! Если вы хотите глубже погрузиться в некоторые из упомянутых тем, пожалуйста, спросите в комментариях! Спасибо за ваше присутствие, хорошего дня!

Рекомендации

[1] https://www.seagate.com/files/www-content/our-story/trends/files/idc-seagate-dataage-whitepaper.pdf

[2] https://firstsiteguide.com/big-data-stats/

[3] https://financesonline.com/how-much-data-is-created-every-day

[4] https://www.infoworld.com/article/2972863/open-source-java-projects-apache-spark.html?page=2

[5] https://sparkbyexamples.com/pyspark/pyspark-reducebykey-usage-with-examples

[6] https://nikgrozev.com/2017/11/09/summary-of-spark-mooc/