【问题标题】:Store images/videos into Hadoop HDFS将图像/视频存储到 Hadoop HDFS
【发布时间】:2013-05-08 21:40:12
【问题描述】:

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

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

【问题讨论】:

    标签: image video hadoop hdfs


    【解决方案1】:

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

    我想其他人也进行过类似的项目,所以如果你在网上搜索一下,你可能会发现有人已经编写了自定义类来完全满足你的需要。

    【讨论】:

    • 好的,但是你说的是什么意思:但是你需要编写自己的自定义 InputFormat、OutputFormat 和 RecordReader 才能正确拆分它们。 “分裂什么”??谢谢
    • InputFormat 负责将您的输入图像/视频文件拆分为跨集群分发到您的映射器和缩减器。您需要自己编写一个,因为默认的 InputFormat 类(例如 FileInputFormat)是为文本设计的,而不是视频或图像内容。
    • 如果您单击指向 javadoc 的链接,它会立即获得所有这些信息,快速的 google 可以找到您想了解的任何其他信息 - 这就是我学到的!
    • 我认为不需要自定义 InputFormat 来将文件存储到 HDFS 中。即使是简单的“bin/hadoop fs -put /src_image_file /dst_image_file”也可以解决问题。
    • @Tariq 当然可以,但是二进制文件实际上毫无意义。它是一个文件系统,如果您将其视为二进制文件,则可以在其上存储任何内容,但如果您想以任何方式处理它,则需要自定义类。这仅取决于 OP 是否打算仅将它们存储在那里或以任何方式处理它们。
    【解决方案2】:

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

    【讨论】:

    • 很好的例子,正如你所知,当我们使用 hadoop 时,这意味着大量的数据,然后是大量的图像,我认为我们可以迭代一个目录来读取所有图像并存储它们在 HDFS 中?另一个问题,我们可以为视频应用相同的代码吗?谢谢
    • 我不知道我是否应该按原样存储。因为我想应用一些转换,你怎么看?顺其自然?
    • 我建议您将多个文件合并到 1 个序列文件中,然后将其存储。这会更有效率,因为 Hadoop 擅长处理“少量的大文件”。并且应该很有可能进行转换。虽然我从未尝试过视频文件,但过程应该是一样的。
    • 我应该将许多图像组合在一个序列文件中,例如,对于 1 000 000,我需要多少个序列文件?
    • 这取决于您的特定用例以及其他一些因素,例如每个文件的大小等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 2014-04-06
    相关资源
    最近更新 更多