DataFrame.show () PySpark работает медленно - PullRequest
0 голосов
/ 13 февраля 2020

Newb ie здесь я читаю таблицу (около 2 миллионов строк) как DataFrame Spark через JDB C из MySQL в PySpark и пытаюсь показать первые 10 строк:

from pyspark.sql import SparkSession

spark_session = SparkSession.builder.master("local[4]").appName("test_log_processing").getOrCreate()
url = "jdbc:mysql://localhost:3306"
table = "test.fakelog"
properties = {"user": "myUser", "password": "********"}
df = spark_session.read.jdbc(url, table, properties=properties)
df.cache()
df.show(10)  # can't get the printed results, and runs pretty slow and consumes 90%+ CPU resources
spark_session.stop()

И вот журнал консоли:

Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
[Stage 0:>                                                          (0 + 1) / 1]

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

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Поскольку вы вызываете spark.read.jdbc для некоторой таблицы, спарк попытается собрать всю таблицу из базы данных в искру. После этого искры кешируют данные и печатают 10 результатов из кеша. Если вы запустите приведенный ниже код, вы заметите некоторые различия.

spark_session = SparkSession.builder.master("local[4]").appName("test_log_processing").getOrCreate()
url = "jdbc:mysql://localhost:3306"
table = "(SELECT * FROM test.fakelog LIMIT 10) temp"
properties = {"user": "myUser", "password": "********"}
df = spark_session.read.jdbc(url, table, properties=properties)
df.cache()
df.show()
spark_session.stop()

0 голосов
/ 13 февраля 2020
  • Возможно, ваш кеш в память заполняется, по умолчанию для кеша используется только память (более старые версии spark).
  • Поэтому вместо кеша вы можете попробовать df.persist (StorageLevel .MEMORY_AND_DISK). Он будет разливаться на диск при переполнении памяти.
  • Попробуйте .take (10), он даст набор строк, он может быть не быстрее, но его стоит попробовать
  • Try df .coalece (50) вам может понадобиться уменьшить масштаб.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...