#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) код. По сути, это становится вашим изображением. Я работаю над аналогичным проектом и столкнулся с этими проблемами. Надеюсь, у вас это сработает.