我的HDFS中有大约1 Gig的图像.png文件。任何人都可以建议我在HBase中存储索引值到这些图像的方法,并通过查询HBase检索图像。或者我如何使用HDFS / HBase来提供图像。请回复。
紧急要求:(
提前致谢
答案 0 :(得分:3)
提供图像文件有两种基本方法:将图像存储在HBase本身中,或存储图像的路径。 HBase已成功用于大型商业照片共享网站,用于存储和检索图像 - 尽管他们必须仔细调整和监控他们的系统(有关详细信息,请参阅HBase邮件列表)。
如果您将图像存储在HDFS上并且仅在HBase中保留路径,则必须确保不会有太多图像,因为HDFS不能很好地处理大量文件(取决于分配给的大小的RAM)你的名字节点,但仍然有一个上限。)
除非您计划将元数据与每个图像一起存储,否则您可以使用非常简单的模式来存储数据或图像的路径。我想象的是具有两个列限定符的单列族:数据和类型。数据列可以存储路径或实际图像字节。该类型将存储图像类型(png,jpg,tiff等)。这对于在返回图像时在线上发送正确的mime类型非常有用。
一旦你完成了这个设置,你需要的只是一个servlet(或者在thrift中的等价物)来组装数据并将其返回给客户端。
答案 1 :(得分:3)
以下代码将有所帮助。
//to store image file to hbase
Configuration conf = HBaseConfiguration.create();
HTable table = new HTable(conf, "test".getBytes());
Put put = new Put("row1".getBytes());
put.add("C".getBytes(), "image".getBytes(),
extractBytes("/path/to/image/input.jpg"));
table.put(put);
//to retrieve the image
Get get = new Get("row1".getBytes());
Result result = table.get(get);
byte[] arr = result.getValue("C".getBytes(), "image".getBytes());
OutputStream out = new BufferedOutputStream(new FileOutputStream(
"/path/to/image/output.jpg"));
out.write(arr);
//function to convert image file to bytes.
public static byte[] extractBytes(String ImageName) throws IOException {
File file = new File(ImageName);
BufferedImage originalImage = ImageIO.read(file);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(originalImage, "jpg", baos);
byte[] imageInByte = baos.toByteArray();
return imageInByte;
}