Я запускаю искровое приложение на экземплярах Amazon Spot. В конце я экспортирую свои результаты в файлы паркета на S3. Задачи занимают много памяти, поэтому я должен выполнить начальные вычисления, используя большое количество разделов (сотни тысяч). В конце я хотел бы объединить разделы в несколько больших разделов и сохранить их в большие файлы паркета. И вот тут я попадаю в беду:
- Если я использую .coalesce()
, что является узким преобразованием, вся линия, предшествующая объединению, будет выполнена на небольшом количестве разделов, что приведет к OOM.
- Если я использую .repartition()
, я полагаюсь на HDFS для случайных файлов.
Это проблема при использовании точечных экземпляров, которые могут быть выведены из эксплуатации, оставляя поврежденные / отсутствующие блоки HDFS.
- контрольная точка также зависит от HDFS, поэтому я не могу ее использовать.
- преобразование в Dataframe
и обратно фактически не нарушало родословную (rdd.toDF.rdd
, я что-то упустил?).
В заключение я ищу способ объединиться с меньшим количеством разделов только для сохранения данных на S3 - я бы хотел, чтобы расчеты производились с использованием исходных разделов.