我的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