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
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
'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
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