È assolutamente possibile senza fare nulla di più. Hadoop ci fornisce la possibilità di leggere/scrivere file binari. Quindi, praticamente tutto ciò che può essere convertito in byte può essere memorizzato in HDFS (immagini, video ecc.). Per farlo, Hadoop fornisce qualcosa chiamato come SequenceFiles. SequenceFile è un file flat costituito da coppie di chiavi/valori binarie. SequenceFile fornisce le classi Writer, Reader e Sorter per scrivere, leggere e ordinare rispettivamente. Quindi, è possibile convertire il file immagine/video in un SeuenceFile e memorizzarlo nell'HDFS. Ecco piccolo pezzo di codice che avrà un file immagine e convertirla in un SequenceFile, in cui il nome del file è il contenuto chiave e l'immagine è il valore:
public class ImageToSeq {
public static void main(String args[]) throws Exception {
Configuration confHadoop = new Configuration();
confHadoop.addResource(new Path("/hadoop/projects/hadoop-1.0.4/conf/core-site.xml"));
confHadoop.addResource(new Path("/hadoop/projects/hadoop-1.0.4/conf/hdfs-site.xml"));
FileSystem fs = FileSystem.get(confHadoop);
Path inPath = new Path("/mapin/1.png");
Path outPath = new Path("/mapin/11.png");
FSDataInputStream in = null;
Text key = new Text();
BytesWritable value = new BytesWritable();
SequenceFile.Writer writer = null;
try{
in = fs.open(inPath);
byte buffer[] = new byte[in.available()];
in.read(buffer);
writer = SequenceFile.createWriter(fs, confHadoop, outPath, key.getClass(),value.getClass());
writer.append(new Text(inPath.getName()), new BytesWritable(buffer));
}catch (Exception e) {
System.out.println("Exception MESSAGES = "+e.getMessage());
}
finally {
IOUtils.closeStream(writer);
System.out.println("last line of the code....!!!!!!!!!!");
}
}
}
E se la vostra intenzione è quella di scaricare solo la file come è, si potrebbe semplicemente fare questo:
bin/hadoop fs -put /src_image_file /dst_image_file
E se il vostro intento è più di una semplice archiviazione dei file, si potrebbe trovare HIPI utile. HIPI è una libreria per il framework MapReduce di Hadoop che fornisce un'API per eseguire attività di elaborazione di immagini in un ambiente di elaborazione distribuito.
HTH
ok, ma che cosa si intende quando si dice: ma è necessario scrivere il proprio InputFormat personalizzato, OutputFormat e RecordReader al fine di dividere in modo corretto. "dividere cosa" ?? grazie – devosJava
'InputFormat' è responsabile della suddivisione dei file immagine/video di input per la distribuzione attraverso il cluster ai vostri mappatori e riduttori. Dovrai scriverne uno proprio come le classi predefinite di 'InputFormat' come' FileInputFormat' sono progettate per il testo, non per il video o il contenuto dell'immagine. – Quetzalcoatl
Se si fa clic sui collegamenti attraverso la javadoc, tutte queste informazioni sono prontamente disponibili, un rapido google può trovarti qualsiasi altra cosa tu voglia sapere su di loro - è così che ho imparato! – Quetzalcoatl