Как объединить файлы результатов 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 (он повторно реализует ее).