2011-09-07 50 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