2013-05-14 7 views
5

Vorrei memorizzare alcuni video/immagini in Hadoop HDFS, ma ho sentito che HDFS accetta solo file come testo.Archivia immagini/video in Hadoop HDFS

Per sicurezza, possiamo archiviare video/immagini in HDFS? Se sì, qual è il modo o i passi da seguire per farlo?

risposta

1

è del tutto possibile per memorizzare immagini e video su HDFS, ma è probabile che sia necessario utilizzare/scrivere il proprio personalizzato InputFormat, OutputFormat e RecordReader al fine di dividere in modo corretto.

Immagino che altri abbiano intrapreso progetti simili, quindi, se setacciate la rete, potreste essere in grado di scoprire che qualcuno ha già scritto classi personalizzate per fare esattamente ciò di cui avete bisogno.

+0

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

+0

'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

+0

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

12

È 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

+0

Bel esempio, come sai quando lavoriamo con hadoop, ciò significa una quantità enorme di dati, quindi un numero enorme di immagini, penso che possiamo scorrere su una directory per leggere tutte le immagini e archiviarle in HDFS?un'altra domanda, possiamo applicare lo stesso codice per i video ?? grazie – devosJava

+0

non so se dovrei memorizzare così com'è o no. perché vorrei applicare alcune transormazioni, cosa ne pensi? lascia che sia o no? – devosJava

+1

ti suggerirei di mettere insieme più file in 1 file Sequence e quindi di memorizzarlo. Sarebbe più efficiente, dato che Hadoop è bravo a elaborare "piccoli numeri di file grandi". e dovrebbe essere del tutto possibile fare le trasformazioni. anche se non ho mai provato i file video, ma il processo dovrebbe essere lo stesso. – Tariq