2013-05-14 249 views
5

我想将一些视频/图像存储到Hadoop HDFS,但我听说HDFS只接受像文本一样的文件。将图像/视频存储到Hadoop HDFS中

可以肯定的是,我们可以将视频/图像存储到HDFS吗?如果是,那么执行该操作的方式或步骤是什么?

回答

1

这是完全有可能存储在HDFS的图像和视频,但你可能会需要使用/写自己的自定义InputFormatOutputFormatRecordReader为了正确分割。

我想其他人已经承担过类似的项目,所以如果你在网上搜索,你可能会发现有人已经写了自定义类来做你需要的东西。

+0

还算可以,但你是什么意思时,你说:但你需要编写自己的自定义InputFormat,OUTPUTFORMAT和RecordReader为了正确分割。 “分割什么”?谢谢 – devosJava 2013-05-14 14:53:26

+0

'InputFormat'负责将您的输入图像/视频文件分散到整个群集中分发给您的映射器和缩减器。您需要编写自己的文件,因为默认的'InputFormat'类,例如'FileInputFormat'是为文本而非视频或图像内容设计的。 – Quetzalcoatl 2013-05-14 14:55:42

+0

如果你点击链接到javadoc,它可以获得所有这些信息,快速谷歌可以找到你想知道的任何其他信息 - 这就是我学到的东西! – Quetzalcoatl 2013-05-14 14:58:06

12

绝对有可能不做任何额外的事情。 Hadoop为我们提供了读取/写入二进制文件的工具。所以,实际上任何可以转换为字节的东西都可以存储到HDFS(图像,视频等)中。为此,Hadoop提供了一个名为SequenceFiles的东西。 SequenceFile是一个由二进制键/值对组成的平面文件。 SequenceFile提供了一个Writer,Reader和Sorter类,分别用于写入,读取和排序。因此,您可以将图像/视频文件转换为SeuenceFile并将其存储到HDFS中。下面是一小段代码,将拍摄图像文件,并将其转换成SequenceFile,其中文件的名称是关键和图像内容的价值:

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

如果你的意图是刚刚倾倒文件,因为它是,你可以简单地这样做:

bin/hadoop fs -put /src_image_file /dst_image_file 

如果你的目的是不是仅仅存储文件的更多,你可能会发现HIPI有用。 HIPI是Hadoop的MapReduce框架的一个库,它提供了一个用于在分布式计算环境中执行图像处理任务的API。

HTH

+0

很好的例子,正如你知道我们使用hadoop时,这意味着大量的数据,然后是大量的图像,我认为我们可以在目录上迭代以读取所有图像并将它们存储在HDFS中?另一个问题是,我们可以将相同的代码应用于视频吗?谢谢 – devosJava 2013-05-14 15:03:48

+0

我不知道我是否应该保存它是否存在。因为我想申请一些转换,你觉得怎么样?让它保持原样或不变? – devosJava 2013-05-14 15:06:56

+1

我建议你将多个文件分成1个序列文件,然后存储它。由于Hadoop擅长处理“少量大文件”,因此效率更高。并且应该很有可能进行转换。虽然我从来没有尝试过视频文件,但过程应该是一样的。 – Tariq 2013-05-14 15:10:33