我的HDFS中有大約1G的圖像.png文件。任何人都可以向我推薦一種方法,將這些圖像的索引值存儲在HBase中,並通過查詢HBase來檢索圖像。或者我如何使用HDFS/HBase來爲圖像提供服務。請回復。如何從HBase獲取圖像
迫切要求:(
在此先感謝
我的HDFS中有大約1G的圖像.png文件。任何人都可以向我推薦一種方法,將這些圖像的索引值存儲在HBase中,並通過查詢HBase來檢索圖像。或者我如何使用HDFS/HBase來爲圖像提供服務。請回復。如何從HBase獲取圖像
迫切要求:(
在此先感謝
有服務的圖像文件的兩種基本方式:在HBase的本身存儲圖像,或者存儲到圖像的路徑HBase的成功使用過一個用於存儲和檢索圖像的大型商業照片共享網站 - 儘管它們必須仔細調整和監視系統(詳情請參閱HBase郵件列表)。
如果您將圖像存儲在HDFS上並只保留在HBase中你必須確保你不會有像HDFS那樣的太多映像s處理不了很多文件(取決於分配給你的namenode的RAM的大小,但仍然有一個上限)。除非您打算將元數據與每個圖像一起存儲,否則您可能能夠以非常簡單的模式逃避存儲數據或圖像的路徑。我想象的是具有兩列限定符的單列家族:數據和類型。數據列可以存儲路徑或實際圖像字節。該類型將存儲圖像類型(PNG,JPG,TIFF等)。這對於在返回圖像時通過電線發送正確的MIME類型很有用。
完成設置後,您只需要一個servlet(或者相當於節儉的)來組裝數據並將其返回給客戶端。
偉大的解釋Dravid那麼,哪種方法最適合,我應該嘗試在HBase中使用ByteArray格式存儲圖像還是使用HDFS。如果可能的話,你可以給我一些啓動器嗎? – Siddharth
以下代碼將有所幫助。
//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;
}
您可能需要添加ImageIO庫 – Shafiq
這是一個非常寬泛的問題。你有什麼要求?圖像有多大?你會做什麼類型的查詢? – cftarnas
圖像大小爲1到2 MB,我想使用HDFS來存儲這些圖像,然後通過查詢存儲在HBase中的索引在網絡瀏覽器上顯示它們...請建議如何完成 – Siddharth