我想将一些视频/图像存储到 Hadoop HDFS中,但我听说 HDFS 只接受像文本这样的文件。
可以肯定的是,我们可以将视频/图像存储到 HDFS 中吗?如果是,这样做的方法或步骤是什么?
完全可以不用做任何额外的事情。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。
高温高压
完全可以在 HDFS 上存储图像和视频,但您可能需要使用/编写自己的 custom ,InputFormat
以便正确拆分它们。OutputFormat
RecordReader
我想其他人已经进行了类似的项目,所以如果你搜索网络,你可能会发现有人已经编写了自定义类来完全满足你的需要。