2016-06-22 4 views
4

Я запускаю работу Spark, которая работает очень хорошо, насколько логика идет. Однако имя моих выходных файлов находится в формате part-00000, part-00001 и т. Д., Когда я использую saveAsTextFile для сохранения файлов в ведро s3. Есть ли способ изменить имя выходного файла?Изменение имени выходного файла в Spark Streaming

спасибо.

+2

Возможный дубликат [Переименование файлов частей в Hadoop Map Reduce] (http://stackoverflow.com/questions/14555313/renaming-part-files-in-hadoop-map-reduce) –

+0

Лучше всего это сделать, используя вместо Spark. Например, вы могли бы собрать все в 1 файл, используя 'coalesce', но это накладывает нагрузку на память. Кроме того, hdfs работает немного иначе, чем обычная файловая система, и Spark всегда создает другую папку назначения/папки для каждого вывода. – GameOfThrows

+0

разве это не ... https://gist.github.com/mlehman/df9546f6be2e362bbad2 –

ответ

4

В Спарк, вы можете использовать saveAsNewAPIHadoopFile и установить mapreduce.output.basename параметр конфигурации Hadoop, чтобы изменить префикс (Просто «часть» префикс)

val hadoopConf = new Configuration() 
hadoopConf.set("mapreduce.output.basename", "yourPrefix") 

yourRDD.map(str => (null, str)) 
     .saveAsNewAPIHadoopFile(s"$outputPath/$dirName", classOf[NullWritable], classOf[String], 
      classOf[TextOutputFormat[NullWritable, String]], hadoopConf) 

Ваши файлы будут по имени как: yourPrefix-т-00001

В Hadoop и Спарк, вы можете иметь более одного файла на выходе, так как вы можете иметь более одного редуктора (Hadoop) или более одного раздела (искры) , Затем вам нужно гарантировать уникальные имена для каждого из них, поэтому невозможно переопределить порядковый номер в последней части имени файла.

Но если вы хотите иметь больше контроля над вашим именем файла, вы можете продлить TextOutputFormat или FileOutputFormat и переопределить методgetUniqueFile.

+0

Благодарим вас за комментарий. Можем ли мы сохранить файлы в ведро s3 вместо hdf? – Bharath

+0

Да, вы можете, Amazon S3 совместим с API Hadoop. –

+1

Hadoop FileSystem реализует несколько протоколов/файловых систем, включая S3: https://wiki.apache.org/hadoop/AmazonS3. Вы можете использовать любой из этих почти прозрачных (вам просто нужно указать конкретные параметры для каждого типа подключения). Если вы думаете, что мой ответ помог вам с вашим оригинальным вопросом, пожалуйста, примите его. – RojoSam

0

[Решение в Java]

Допустим, у вас есть:

JavaRDD<Text> rows; 

И вы хотите, чтобы записать его в файл как customPrefix-r-00000.

Configuration hadoopConf = new Configuration(); 
hadoopConf.set("mapreduce.output.basename", "customPrefix"); 

rows.mapToPair(row -> new Tuple2(null, row)).saveAsNewAPIHadoopFile(outputPath, NullWritable.class, Text.class, TextOutputFormat.class, hadoopConf); 

Tada !!

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