2016-05-19 3 views
3

Работы Spark (я думаю) создают файл для каждого раздела, чтобы он мог обрабатывать сбои и т. Д. ..., поэтому в конце задания вы остаетесь с папкой, в которой может быть много папок, оставшихся в них , Они автоматически загружаются на S3, так что есть способ объединить их в один сжатый файл, который готов для загрузки в Redshift?Как эффективно объединить выходные файлы Spark в EMR?

ответ

1

Вместо следующего, который будет писать один несжатый файл на перегородке в «my_rdd» ...

my_rdd.saveAsTextFile(destination) 

Можно сделать ...

my_rdd.repartition(1).saveAsTextFile(destination, compressionCodecClass=“org.apache.hadoop.io.compress.GzipCodec”) 

Это посылает данные во всех разделяет один конкретный рабочий узел в кластере, который должен быть объединен в один массивный раздел, который затем будет выписан в один сжатый файл gzip.

Однако я не считаю это желательным решением проблемы. Только один поток записывает и сжимает единственный файл результата. Если этот файл огромен, это может занять «навсегда». Каждое ядро ​​в кластере сидит без дела, но одно. Redshift не нуждается в том, чтобы все было в одном файле. Redshift легко справляется с загрузкой набора файлов - используйте COPY с «файлом манифеста» или «префиксом»: Using the COPY Command to Load from S3.

Смежные вопросы