将图像/视频存储到Hadoop HDFS中

时间:2013-05-14 14:35:36

标签: image video hadoop hdfs

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

可以肯定的是,我们可以将视频/图像存储到HDFS中吗?如果是,那么这样做的方式或步骤是什么?

2 个答案:

答案 0 :(得分:17)

绝对可以不做任何额外的事情。 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

答案 1 :(得分:2)

完全可以在HDFS上存储图像和视频,但您可能需要使用/编写自己的自定义InputFormatOutputFormatRecordReader才能正确分割它们

我想其他人已经开展了类似的项目,所以如果你在网上搜索,你可能会发现有人已经编写了自定义类来完成你所需要的。