SPARK: идентичные этапы, генерируемые несмотря на кэширование - PullRequest
0 голосов
/ 02 ноября 2018

Мне интересно, как у меня может быть два абсолютно одинаковых этапа, несмотря на то, что я кеширую свои данные перед каждым действием в Spark. Можете ли вы посмотреть на скриншот ниже, это выглядит странно для меня. Значит ли это, что я выполняю задачи на этапах дважды?

К сожалению, привести пример кода довольно сложно, но я постараюсь объяснить, что я делаю.

  1. Чтение данных из CSV
  2. Выполнить некоторые преобразования в определенных столбцах.
  3. Применить схему -> spark.Session.createDataFrame(df.rdd,schema)
  4. Создание 7 новых фреймов данных с использованием различных фильтров в DF, созданном в точке 3)
  5. Возьмите два кадра данных из пункта 4 и передайте их другому методу для сравнения.

Я сохраняю после пункта 2) и после пункта 4) только два кадра данных, которые будут сравниваться. И неперспективно после сравнения. Сравнение это долгий и сложный процесс.

enter image description here

1 Ответ

0 голосов
/ 06 ноября 2018

Вы можете увидеть, был ли DataFrame кэширован в вашем физическом плане, используя оператор объяснения (где сущности InMemoryRelation отражают кэшированные наборы данных с их уровнем хранения):

== Physical Plan ==
*Project [id#0L, id#0L AS newId#16L]
+- InMemoryTableScan [id#0L]
      +- InMemoryRelation [id#0L], true, 10000, StorageLevel(disk, memory, deserialized, 1 replicas)
            +- *Range (0, 1, step=1, splits=Some(8))

После того, как вы кэшируете (или сохраняете) свой DataFrame, первый запрос может стать медленнее, но он окупится за следующие запросы.

Вы можете проверить, был ли кеширован набор данных или нет, используя следующий код:

scala> :type q2
org.apache.spark.sql.Dataset[org.apache.spark.sql.Row]

val cache = spark.sharedState.cacheManager
scala> cache.lookupCachedData(q2.queryExecution.logical).isDefined
res0: Boolean = false

Есть один сюрприз с кэшированием в Spark SQL. Кэширование лениво, и поэтому вы платите дополнительную цену за кэширование строк при самом первом действии, но это происходит только с API DataFrame. В SQL кэширование требует больших усилий, что сильно влияет на производительность запросов, поскольку вы не вызываете действие для запуска кэширования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...