Потоковый доступ Hadoop к файлам в каталоге

#python #hadoop #hadoop-streaming

#python #hadoop #потоковая передача hadoop

Вопрос:

Я хочу получить доступ к каталогу в Hadoop (через потоковую передачу Python) и перебирать его файлы изображений, вычисляя хэши каждого из них в моем mapper. Имеет ли смысл следующая логика (и могу ли я вместо жесткого кодирования передать каталог в Hadoop, например, как -input)?

 lotsdir= 'hdfs://localhost:54310/user/hduser/randomimages/' 
import glob
path = lotsdir   '*.*'
files = glob.glob(path)
files.sort()

imagehashes={}
for fname in files:
    imagehashes[fname]=pHash.imagehash( fname )
  

Комментарии:

1. Используйте -cmdenv name=value для передачи параметров

Ответ №1:

Да, логика имеет смысл.

Но у вас, скорее всего, возникнет проблема с производительностью, поскольку ваши входные файлы не в текстовом формате, поэтому они не будут должным образом разделены на HDFS.

Надеюсь, Hadoop предоставляет несколько способов исправить эту проблему. Например, вы могли бы либо:

  • преобразуйте ваши файлы изображений в SequenceFile и сохраните их в HDFS
  • напишите свои собственные InputFormat, OutputFormat и RecordReader, чтобы правильно разделить их

Ответ №2:

Вы также можете попробовать распечатать содержимое файла изображения в виде закодированной символьной строки, что-то вроде этого: [[1, 2, 3], [4, 5, 6]] становится 1:2:3:4:5:6 в стандартном интерфейсе. Затем ваш mapper может считывать из стандартного интерфейса и декодировать (поскольку вы будете знать размеры изображения) его обратно в массив numpy (всего несколько строк для number-extarction-ndarray-reshape) код. По сути, это становится вашим изображением. Я работаю над аналогичным проектом и столкнулся с этими проблемами. Надеюсь, у вас это сработает.