2011-09-07 79 views
2

我的HDFS中有大约1G的图像.png文件。任何人都可以向我推荐一种方法,将这些图像的索引值存储在HBase中,并通过查询HBase来检索图像。或者我如何使用HDFS/HBase来为图像提供服务。请回复。如何从HBase获取图像

迫切要求:(

在此先感谢

+0

这是一个非常宽泛的问题。你有什么要求?图像有多大?你会做什么类型的查询? – cftarnas

+0

图像大小为1到2 MB,我想使用HDFS来存储这些图像,然后通过查询存储在HBase中的索引在网络浏览器上显示它们...请建议如何完成 – Siddharth

回答

3

有服务的图像文件的两种基本方式:在HBase的本身存储图像,或者存储到图像的路径HBase的成功使用过一个用于存储和检索图像的大型商业照片共享网站 - 尽管它们必须仔细调整和监视系统(详情请参阅HBase邮件列表)。

如果您将图像存储在HDFS上并只保留在HBase中你必须确保你不会有像HDFS那样的太多映像s处理不了很多文件(取决于分配给你的namenode的RAM的大小,但仍然有一个上限)。除非您打算将元数据与每个图像一起存储,否则您可能能够以非常简单的模式逃避存储数据或图像的路径。我想象的是具有两列限定符的单列家族:数据和类型。数据列可以存储路径或实际图像字节。该类型将存储图像类型(PNG,JPG,TIFF等)。这对于在返回图像时通过电线发送正确的MIME类型很有用。

完成设置后,您只需要一个servlet(或者相当于节俭的)来组装数据并将其返回给客户端。

+1

伟大的解释Dravid那么,哪种方法最适合,我应该尝试在HBase中使用ByteArray格式存储图像还是使用HDFS。如果可能的话,你可以给我一些启动器吗? – Siddharth

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; 
} 
+0

您可能需要添加ImageIO库 – Shafiq