Избавьтесь от стресса в Черную пятницу с помощью 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