2013-05-14 10 views
5

Chciałbym zapisać kilka filmów/obrazów w Hadoop HDFS, ale słyszałem, że HDFS akceptuje tylko pliki takie jak tekst.Przechowuj obrazy/wideo w Hadoop HDFS

Dla pewności, czy możemy przechowywać wideo/obrazy w HDFS? Jeśli tak, w jaki sposób lub jakie kroki należy wykonać, aby to zrobić?

Odpowiedz

1

Jest całkowicie możliwe do przechowywania zdjęć i filmów na HDFS, ale prawdopodobnie będziesz musiał użyć/napisać swój własny InputFormat, OutputFormat i RecordReader aby podzielić je prawidłowo.

Wyobrażam sobie, że inni podjęli podobne projekty, więc jeśli przeszukasz sieć, możesz być w stanie stwierdzić, że ktoś napisał już niestandardowe klasy, aby zrobić dokładnie to, czego potrzebujesz.

+0

ok, ale co masz na myśli mówiąc: ale trzeba napisać swój własny InputFormat, OutputFormat i RecordReader aby podzielić je prawidłowo. "podzielić co"? dziękuję – devosJava

+0

'InputFormat' jest odpowiedzialny za podział twoich plików obrazu/wideo do dystrybucji w całym klastrze do twoich maperów i reduktorów. Musisz napisać własną, ponieważ domyślne klasy 'InputFormat', takie jak' FileInputFormat', są przeznaczone dla tekstu, a nie wideo lub obrazu. – Quetzalcoatl

+0

Jeśli klikniesz na linki do javadoc ma wszystkie te informacje łatwo dostępne, szybkie google może znaleźć wszystko, co chcesz wiedzieć o nich - tak dowiedziałem się! – Quetzalcoatl

12

Jest to absolutnie możliwe bez robienia niczego dodatkowego. Hadoop zapewnia nam możliwość odczytu/zapisu plików binarnych. Tak więc praktycznie wszystko, co można przekształcić w bajty, można zapisać w HDFS (obrazy, wideo itp.). Aby to zrobić, Hadoop dostarcza coś, co nazywa się SequenceFiles. SequenceFile to płaski plik składający się z dwójkowych par klucz/wartość. Plik SequenceFile zapewnia klasy Writer, Reader i Sorter odpowiednio do pisania, czytania i sortowania. Więc możesz przekształcić swój plik obrazu/wideo w SeuenceFile i zapisać go w HDFS. Oto mały kawałek kodu, który odbędzie plik obrazu i przekształcić go w SequenceFile, gdzie nazwa pliku jest zawartość klucza i obraz jest wartość:

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....!!!!!!!!!!"); 
     } 
    } 
} 

A jeśli zamiarem jest po prostu wysypać pliki, jak to jest, można po prostu to zrobić:

bin/hadoop fs -put /src_image_file /dst_image_file 

a jeśli zamiarem jest więcej niż tylko przechowywanie plików, można znaleźć HIPI użyteczne. HIPI jest biblioteką dla platformy MapReduce firmy Hadoop, która udostępnia interfejs API do wykonywania zadań przetwarzania obrazu w rozproszonym środowisku komputerowym.

HTH

+0

Dobry przykład, jak wiesz, kiedy pracujemy z hadoop, oznacza to ogromną ilość danych, a następnie ogromną liczbę obrazów, myślę, że możemy iterować na katalogu, aby przeczytać wszystkie obrazy i przechowywać je w HDFS?kolejne pytanie, czy możemy zastosować ten sam kod do filmów? dziękuję – devosJava

+0

Nie wiem, czy powinienem przechowywać tak, jak jest, czy nie. ponieważ chciałbym zastosować jakieś transormacje, co o tym sądzisz? pozostawić tak, jak jest, czy nie? – devosJava

+1

Proponuję ci, abyś skasował wiele plików w 1 pliku sekwencji, a następnie zapamiętaj go. Byłoby to bardziej efektywne, ponieważ Hadoop dobrze radzi sobie z przetwarzaniem "małej liczby dużych plików". i powinno być całkiem możliwe przeprowadzenie transformacji. chociaż nigdy nie próbowałem plików wideo, ale proces powinien być taki sam. – Tariq