Как мне увеличить количество задач, чтобы уменьшить объем памяти на одну задачу?

Следующий очень простой пример терпит неудачу:

df = (
    spark
    .read
    .format('delta')
    .load(input_path)
)
df = df.orderBy("contigName", "start", "end")

# write ordered dataset back to disk:
(
    df
    .write
    .format("delta")
    .save(output_path)
)

Однако независимо от того, что я делаю, пользовательский интерфейс Spark показывает мне ровно 1300 задач и вылетает после 168 задач с Job aborted due to stage failure: Total size of serialized results of 168 tasks [...] is bigger than spark.driver.maxResultSize [...].

Далее я попробовал следующие команды:

  • df.orderBy("contigName", "start", "end").limit(5).toPandas() работает
  • df.orderBy("contigName", "start", "end").write.format("delta").save(output_path) завершается с общим размером из сериализованных результатов 118 задач (4,0 ГБ) больше spark.driver.maxResultSize (4,0 ГБ)
  • {{Х0}} также не удается

< Сильный > EDIT : Благодаря @ raphael-roth я смог попробовать следующую конфигурацию свечей:

spark = (
    SparkSession.builder
    .appName('abc')
    .config("spark.local.dir", os.environ.get("TMP"))
    .config("spark.sql.execution.arrow.enabled", "true")
    .config("spark.sql.shuffle.partitions", "2001")
    .config("spark.driver.maxResultSize", "4G")
    .getOrCreate()
)
glow.register(spark)
spark

Тем не менее, это по-прежнему не влияет на количество задач.

0
Hoeze 20 Дек 2019 в 16:39

1 ответ

orderBy будет генерировать spark.sql.shuffle.partitions разделов / тактов (по умолчанию = 200), независимо от того, сколько разделов имеет входной DataFrame. Поэтому увеличение этого числа должно решить вашу проблему (к сожалению, это не может быть указано в вызове метода)

В качестве альтернативы подумайте об использовании чего-то вроде repartition(key).sortWithinPartitions(key,attr1,attr2,...), при этом будет генерироваться только 1 случайное перемешивание вместо 2

1
Raphael Roth 20 Дек 2019 в 18:19