Как объединить файлы результатов spark без перераспределения и copyMerge?

Я использую следующий код:

csv.saveAsTextFile(pathToResults, classOf[GzipCodec])

каталог pathToResults имеет много файлов, таких как part-0000, part-0001 и т. д. Я могу использовать FileUtil.copyMerge (), но это очень медленно, он загружает все файлы в программу драйвера, а затем загружает их в hadoop. Но FileUtil.copyMerge() быстрее, чем:

csv.repartition(1).saveAsTextFile(pathToResults, classOf[GzipCodec])

Как объединить файлы результатов spark без перераспределения и FileUtil.copyMerge()?

2 ответов


к сожалению, нет другой возможности получить один выходной файл в Spark. Вместо repartition(1) можно использовать coalesce(1), а параметр 1 их поведение будет одинаковым. Spark будет собирать ваши данные в одном разделе в памяти, что может вызвать ошибку OOM, если ваши данные слишком велики.

другой вариант слияния файлов в HDFS может заключаться в написании простого задания MapReduce (или задания Pig или потокового задания Hadoop), которое получит весь каталог в качестве входных данных и используя один редуктор, создайте один выходной файл. Но имейте в виду, что при подходе MapReduce все данные будут сначала скопированы в локальную файловую систему reducer, что может вызвать ошибку "из пространства".

вот некоторые полезные ссылки на ту же тему:


имел точно такой же вопрос и должен был написать код pySpark (с вызовами Hadoop API), который реализует copyMerge:

https://github.com/Tagar/stuff/blob/master/copyMerge.py

к сожалению, copyMerge как автономный вызов API Hadoop будет устаревшим и удален в Hadoop 3.0. Таким образом, эта реализация не зависит от copyMerge Hadoop (он повторно реализует ее).