Что делать с WARN TaskSetManager: Stage содержит задачу очень большого размера?

Я использую искру 1.6.1.

Мое приложение spark читает более 10000 файлов паркета, хранящихся в s3.

val df = sqlContext.read.option("mergeSchema", "true").parquet(myPaths: _*)

myPaths — это Array[String], который содержит пути к 10000 файлам паркета. Каждый путь похож на этот s3n://bucketname/blahblah.parquet

Spark предупреждает сообщение, как показано ниже.

ПРЕДУПРЕЖДЕНИЕ TaskSetManager: Этап 4 содержит задачу очень большого размера (108 КБ). Максимальный рекомендуемый размер задачи — 100 КБ.

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

Есть ли у кого-нибудь хорошее предложение по этой проблеме?


person reapasisow    schedule 16.05.2017    source источник
comment
Пожалуйста, поделитесь своим кодом, в настоящее время нам нужно меньше информации, чтобы помочь   -  person T. Gawęda    schedule 16.05.2017
comment
Привет! Я не понимаю. Даже в небольшом наборе данных самые маленькие разделы часто намного больше 100 КБ, часто ~ 32 мес. Так как же переразметка может помочь?   -  person Boris    schedule 03.08.2017
comment
См. github.com/jaceklaskowski/mastering-apache. -spark-book/blob/   -  person Boris    schedule 03.08.2017


Ответы (1)


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

По умолчанию Spark SQL предполагает наличие 200 разделов с использованием свойства spark.sql.shuffle.partitions (см. Другие параметры конфигурации):

spark.sql.shuffle.partitions (по умолчанию: 200) Настраивает количество разделов, используемых при перемешивании данных для соединений или агрегаций.

Решение состоит в том, чтобы coalesce или repartition установить набор данных после того, как вы прочитали файлы паркета (и перед выполнением действия).

Используйте explain или веб-интерфейс для просмотра планов выполнения.


Предупреждение дает вам подсказку по оптимизации вашего запроса, чтобы использовать более эффективную выборку результатов (см. TaskSetManager).

С предупреждением TaskScheduler (который запускается на драйвере) извлечет значения результата, используя менее эффективный подход IndirectTaskResult (как вы можете видеть в код).

person Jacek Laskowski    schedule 16.05.2017