首页 > 解决方案 > 如何在 Hadoop SequenceFile 中找到值?

问题描述

我已经将一些二进制图像数据写入 Hadoop 序列文件,并希望在 Hadoop 之外将其写为 PNG,如果可能的话,使用 Java。

[已编辑] 数据流概述:输入文件 → 从输入生成 BufferedImages → 将 BufferedImages 转换为二进制数组 → 在 HDFS 中存储为 SequenceFile → 尝试将 SequenceFile 移出 HDFS 并将其转换为 PNG。

但是,我不确定如何定位数据在 SequenceFile 中的起始位置。从我看到的SequenceFile文档来看,我可以使用同步标记来定位 SequenceFile 标头的结尾,然后使用记录长度和键长度信息来查找值的开头。

但是,我不确定如何找到同步标记的位置。我如何找到标头的元数据停止的位置以及同步标记的开始和结束位置?我可以计算同步标记的值并以这种方式查找吗?另外,如何找出记录长度和密钥长度占用的字节数?

如果有其他方法可以找到 SequenceFile 值,请告诉我。如果有帮助,这里有一些我用来写入 SequenceFile 的代码。

baos = new ByteArrayOutputStream(); 
ImageIO.write(img, "png", baos); //img is a BufferedImage
byte[] imBytes = baos.toByteArray();
baos.write(imBytes);
writer = SequenceFile.createWriter(conf, writer.file(new Path(imgPath)), writer.keyClass(Text.class),writer.valueClass(BytesWritable.class));
writer.append(new Text(imgPath), new BytesWritable(imBytes));

本质上,我获取了程序生成的 BufferedImage,将其作为 PNG 写入字节数组,然后将其写入 SequenceFile。

[编辑] 我查看了SequenceFile 源代码,有一个函数叫做getSync()? 我认为它是私人的,所以我不确定我会如何使用它。

标签: javahadoop

解决方案


推荐阅读