Вопрос по java – Как читать несколько файлов изображений в качестве ввода из hdfs в Map-Reduce?

2
private static String[] testFiles = new String[]     {"img01.JPG","img02.JPG","img03.JPG","img04.JPG","img06.JPG","img07.JPG","img05.JPG"};
 // private static String testFilespath = "/home/student/Desktop/images";
private static String testFilespath ="hdfs://localhost:54310/user/root/images";
//private static String indexpath = "/home/student/Desktop/indexDemo";
private static  String testExtensive="/home/student/Desktop/images";

public static class MapClass extends MapReduceBase
implements Mapper<Text, Text, Text, Text> {
private Text input_image = new Text();
private Text input_vector = new Text();
    @Override
public void map(Text key, Text value,OutputCollector<Text, Text> output,Reporter       reporter) throws IOException {

 System.out.println("CorrelogramIndex Method:");  
       String featureString;
int MAXIMUM_DISTANCE = 16;
AutoColorCorrelogram.Mode mode = AutoColorCorrelogram.Mode.FullNeighbourhood;
for (String identifier : testFiles) {
            try (FileInputStream fis = new FileInputStream(testFilespath + "/" +    identifier)) {
  //Document doc = builder.createDocument(fis, identifier);
//FileInputStream imageStream = new FileInputStream(testFilespath + "/" + identifier);
BufferedImage bimg = ImageIO.read(fis);
 AutoColorCorrelogram vd = new AutoColorCorrelogram(MAXIMUM_DISTANCE, mode);
                 vd.extract(bimg);
               featureString = vd.getStringRepresentation();
               double[] bytearray=vd.getDoubleHistogram();
              System.out.println("image: "+ identifier + " " + featureString );

        }
             System.out.println(" ------------- ");
input_image.set(identifier);
input_vector.set(featureString);
   output.collect(input_image, input_vector);
              }

     }
   }

  public static class Reduce extends MapReduceBase
  implements Reducer<Text, Text, Text, Text> {

    @Override
public void reduce(Text key, Iterator<Text> values,
                   OutputCollector<Text, Text> output, 
                   Reporter reporter) throws IOException {
  String out_vector="";

  while (values.hasNext()) {
   out_vector.concat(values.next().toString());
 }
  output.collect(key, new Text(out_vector));
  }
}

static int printUsage() {
System.out.println("image_mapreduce [-m <maps>] [-r <reduces>] <input> <output>");
ToolRunner.printGenericCommandUsage(System.out);
return -1;
}


@Override
  public int run(String[] args) throws Exception {
JobConf conf = new JobConf(getConf(), image_mapreduce.class);
conf.setJobName("image_mapreduce");

// the keys are words (strings)
conf.setOutputKeyClass(Text.class);
// the values are counts (ints)
conf.setOutputValueClass(Text.class);

conf.setMapperClass(MapClass.class);        
//  conf.setCombinerClass(Reduce.class);
conf.setReducerClass(Reduce.class);

List<String> other_args = new ArrayList<String>();
for(int i=0; i < args.length; ++i) {
  try {
    if ("-m".equals(args[i])) {
      conf.setNumMapTasks(Integer.parseInt(args[++i]));
    } else if ("-r".equals(args[i])) {
      conf.setNumReduceTasks(Integer.parseInt(args[++i]));
    } else {
      other_args.add(args[i]);
    }
  } catch (NumberFormatException except) {
    System.out.println("ERROR: Integer expected instead of " + args[i]);
    return printUsage();
  } catch (ArrayIndexOutOfBoundsException except) {
    System.out.println("ERROR: Required parameter missing from " +
                       args[i-1]);
    return printUsage();
  }
}



   FileInputFormat.setInputPaths(conf, other_args.get(0));
    //FileInputFormat.setInputPaths(conf,new    Path("hdfs://localhost:54310/user/root/images"));
FileOutputFormat.setOutputPath(conf, new Path(other_args.get(1)));

JobClient.runJob(conf);
return 0;
}


 public static void main(String[] args) throws Exception {
int res = ToolRunner.run(new Configuration(), new image_mapreduce(), args);
System.exit(res);
 }

}

`Я пишу программу, которая принимает на вход несколько файлов изображений, сохраненных в hdfs & amp; извлечь функции в функции карты. Как я могу указать путь для чтения изображения в FileInputStream (некоторые параметры)? Или есть ли способ прочитать несколько файлов изображений?

Что я хочу сделать, это: - Возьмите несколько файлов изображений в формате hdf в качестве входных данных - извлекать особенности в функции карты. - сокращать итеративно. Пожалуйста, помогите мне в коде или лучшие способы сделать это.

Ваш Ответ

2   ответа
0

задачи MR, просто установите conf.setFileInputPath () в каталог ввода Если вы хотите отправлять выборочные изображения в определенную папку, вы можете добавить несколько путей при настройке conf.setFileInputPath ();

Одним из способов является создание Path [] по одному для каждого изображения. или просто установите его как разделенную запятыми строку со всеми путями. Просмотрите следующую документацию

http://hadoop.apache.org/docs/current/api/org/apache/hadoop/mapred/FileInputFormat.html

И еще одна вещь, которую вы должны установить форматы ввода карты как текст, ByteArray получить функции изображения из этого ввода ByteArray вместо создания нового fileinputstream.

1

Библиотека HIPI - он сохраняет коллекцию изображений в ImageBundle (что более эффективно, чем хранение отдельных файлов изображений в HDFS). У них тоже есть пара примеров.

Что касается вашего кода, вам нужно указать, какие форматы ввода и вывода вы планируете использовать. Не существует текущего формата ввода, который передает весь файл, но вы можете просто расширить FileInputFormat и создать RecordReader, который испускает<Text, BytesWritable> пары, где ключ - это имя файла, а значение - байты файла изображения.

по фактуHadoop - полное руководство есть пример этого точного формата ввода:

Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededFileInputFormat.setInputPaths(conf, "hdfs://localhost:54310/user/root/images/*.JPG")Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Amnesiac
Error: User Rate Limit Exceeded Amnesiac
Error: User Rate Limit Exceeded Amnesiac

Похожие вопросы