HDFSには約1ギガの画像.pngファイルがあります。誰かが私にこれらの画像のインデックス値をHBaseに保存し、HBaseにクエリを実行して画像を取得する方法を提案できますか?または、HDFS/HBaseを使用して画像を提供するにはどうすればよいですか。pls返信。
緊急の要件:(
前もって感謝します
次のコードが役立ちます。
//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;
}
画像ファイルを提供する基本的な方法は2つあります。1つは画像をHBase自体に保存する方法、もう1つは画像へのパスを保存する方法です。HBaseは、大規模な商用写真共有サイトで画像の保存と取得に使用されていますが、システムを注意深く調整および監視する必要があります(詳細については、HBaseメーリングリストを参照してください)。
画像をHDFSに保存し、HBaseにパスのみを保持する場合、HDFSは多くのファイルを適切に処理しないため、画像が多すぎないことを確認する必要があります(ネームノードに割り当てられたRAMのサイズによって異なります。ただし、まだ上限があります)。
各画像と一緒にメタデータを保存する予定がない限り、データまたは画像へのパスを保存するための非常に単純なスキーマを使用できない場合があります。データとタイプの2つの列修飾子を持つ単一の列ファミリーのようなものを想像しています。データ列には、パスまたは実際の画像バイトのいずれかを格納できます。タイプは画像タイプ(png、jpg、tiffなど)を格納します。これは、画像を返すときに正しいmimeタイプをネットワーク経由で送信する場合に役立ちます。
セットアップが完了したら、必要なのは、データをアセンブルしてクライアントに返すためのサーブレット(または倹約に相当するもの)だけです。