Если я храню все свои изображения в SequenceFile, как я могу разработать картограф для обработки их выбора?

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

Моя проблема в том, что мне нужно создать программу MapReduce, которая обрабатывает только выборку этих файлов, я не думаю, что это хорошая идея читать все содержимое изображений из SequenceFile, если я планирую обрабатывать только некоторые из них. их также можно добавить больше изображений, если я создам новый SequenceFile для каждой группы изображений, как я узнаю, какой SequenceFile содержит изображения, которые мне нужно обработать?. Если бы я знал, что вручную фильтровать изображения, прежде чем вводить данные в картограф, будет сложно.

Пожалуйста посоветуй. Спасибо!


person zaz    schedule 27.02.2014    source источник


Ответы (2)


Если вы можете хранить свои файлы в MapFile, который является SequenceFile с индексом, вы можете использовать MapFile.Reader для запроса некоторого файла по ключу. Например,

MapFile.Reader reader = MapFile.Reader(fs, dirName, conf);


public byte[] get(String filename) {
    TextWritable key = new TextWritable();
    BytesWritable value = new BytesWritable();
    if(reader.get(key,value) != null) {
        return value.copyBytes();
    }
    else {
        return null;
    }
}

Если файлы создаются приложением MapReduce, вы можете использовать MapFileOutputFormat для вывода MapFile.

Кроме того, поскольку вам нужно обработать всего несколько файлов, я думаю, что вам не нужно MapReduce в таком процессе.

person zsxwing    schedule 27.02.2014
comment
Большое спасибо за ваш ответ, только еще один вопрос, после запроса мне нужно обработать эти изображения и отправить их мапперам, чтобы они их обработали, так как я запрашивал нужные мне файлы, я думаю, значения будут загружены в память?, если это так, то изображения будут извлекаться из своих узлов? сможет ли Hadoop по-прежнему запускать картограф в узле, где данные изначально хранились? Спасибо еще раз!! - person zaz; 27.02.2014
comment
Почему MapReduce? Если вам нужно обработать только 2-3 файла, непосредственное манипулирование ими будет иметь высокую производительность. Если вы настаиваете на том, что вам нужно запустить его в MapReduce, вам нужно написать свой собственный InputFormat. По умолчанию будут сканироваться все данные. - person zsxwing; 28.02.2014
comment
Конечно, если вы напрямую используете MapFile.Reader, данные обычно нужно отправлять по сети. Но поскольку вы упомянули, что было всего несколько файлов, я думаю, все в порядке. - person zsxwing; 28.02.2014
comment
Большое спасибо за ваши комментарии, я думаю, что создам свой собственный InputFormat и RecordReader, чтобы иметь возможность фильтровать изображения перед отправкой на карты и попытаться избежать сетевых затрат. Когда я говорю фильтр, я имею в виду, возможно, сокращение 10000 файлов из 1000000. Спасибо!! - person zaz; 28.02.2014

Вы можете хранить файлы изображений в HBase вместе с любыми другими атрибутами изображений, которые вы можете фильтровать/запросить. Это позволит вам выборочно запрашивать изображения.

См. это:
http://apache-hbase.679495.n3.nabble.com/Storing-images-in-Hbase-td4036184.html
http://www.slideshare.net/jacque74/hug-hbase-презентация

person Jasper    schedule 27.02.2014
comment
Спасибо за ваше предложение, Джаспер. - person zaz; 28.02.2014