Size: a a a

2021 September 10

DT

Danz The Deadly in Data Engineers
Так сделай join через case
источник

A

Aleksandr in Data Engineers
это как?
источник

A

Aleksandr in Data Engineers
понял, надо попробовать
источник

Д

Дмитрий in Data Engineers
DE есть вопрос. При работе приложения на spark, требуется конфигурация толстых экзекуторов 64Gbx16VCPU, но есть джоба у которой всего 10 тасков, на каждую таску по 1 партиции, но партиции жирные порезать не могу. И вот spark садит эти таски на 2 экзеутора, выбирая те которые меньше всего выполняли тасков. И все уходит в тормоза, так как один экзекутор тащит все шафлы к себе и записывает на диск. Есть патерн как сделать так что бы, таски раскидывались на разные экзекуторы ?
источник

DT

Danz The Deadly in Data Engineers
Если выходной файл один, то и экзекьютор будет один
источник

Д

Дмитрий in Data Engineers
Врайтер свой, на каждую партицию.
источник

Д

Дмитрий in Data Engineers
Поэтому и екзекутор пишет сразу 5 фйлов и тормозит ....
источник

DT

Danz The Deadly in Data Engineers
Можно перед записью сделать репартишен
источник

DT

Danz The Deadly in Data Engineers
По идее разницы никакой нет, что эти потоки на одном экзекьюторе, что на разных, один поток = 1 ядро
источник

Д

Дмитрий in Data Engineers
Репартишн сделан, 100 партиций, но он их все посадил на 2 экзекутора. Я уже нашел причину, у меня стоит мин экзекуторов 2 шт, он просто перед распределегием остальных убил.
источник

Д

Дмитрий in Data Engineers
У меня толстые экщекуторы по 16 ядер.
источник

ИК

Иван Калининский... in Data Engineers
Накидываю варианты:
1. Поставить minExecutors побольше
2. spark.task.cpus / spark.task.resource.{resourceName}.amount может выкружить больше ресурсов на жирные таски, но не знаю, с какой версии, и поможет ли в этом кейсе. Раскидывание тасков по разным экзекуторам, скорее всего, произойдёт, но не уверен, будет ли лучше! Может, разумнее экзекуторы на эту джобу дать небольшие по одному core?
3. Делать другой репартишен, и делать его сразу перед экшеном, чтобы ресурс менеджер не убивал экзекуторов
Вообще, мне непонятно, сколько же там партиций/тасков? Десять или сто? Если там десять значений, то сто партиций просто так не получится, нужно солить. А если их нельзя посолить и порезать, то этот варик не подойдёт
источник

Д

Дмитрий in Data Engineers
Спасибо. Там 100 партиций, но в них 10 жирных, разделить нельзя. А как экзекуторы именно к джобе изменить ?
источник

Д

Дмитрий in Data Engineers
Они сделаны из 30000, убрана соль и собранно в 100.
источник

ИК

Иван Калининский... in Data Engineers
Эмм, убить сессию и поднять заново на том же контексте, но с другими executor.cores и .memory. Контест тоже можно переподнять. Не вариант, если необходимо переиспользование датасетов
источник

Д

Дмитрий in Data Engineers
Не не тема, дата сет нужен.
источник

ИК

Иван Калининский... in Data Engineers
таки это data skew, нужно его внутри резать. Предлагаю склеивать исходные партиции по уму:
1. выбрать жирные  с помощью предварительной джобы, определить, на сколько можно побить каждую, сделать HashMap
2. простой udf добавить поле с солью: functions.ceil(functions.rand()*hashMap.getOrElse(key, 0))
источник

Д

Дмитрий in Data Engineers
Я их как раз собрал, так как они мне нужны для записи в файл. А так я их порезал до массовой обработки. Чуть позже буду изучать поблочную запичь в hdfs.
источник

Д

Дмитрий in Data Engineers
Сейчас пока стрим.
источник

Д

Дмитрий in Data Engineers
И у меня не дата сет на этом этапе, а rdd
источник