我有Cloudera CDH 5.3.0
我在HDFS中有一个带有几千兆字节图像文件的目录。
这些文件有各种类型(jpg,png,gif)。
对于每个文件picturename.jpg
,我想在HBase中添加一行picturename
作为行键,以及一列包含图像数据。
有人可以解释我将如何完成这样的事情吗?
答案 0 :(得分:2)
对于后台,HBase将所有内容存储为二进制文件。你会Put
和Get
二进制数据。
只需将图像作为二进制文件读取
正如您所描述的,HBase表看起来像
rowkey
<image-name>
cf:data
<binary-image-data>
有几种方法可以将数据摄入HBase。
put
或bulkload
。由于您有几千兆字节的数据,最快的方法是使用mapreduce和bulkload
。
cloudera对bulkloads的有用教程:
http://blog.cloudera.com/blog/2013/09/how-to-use-hbase-bulk-loading-and-why/
你如何阅读图像并将其提供给hadoop?
你可以通过多种方式做到这一点。我将使用mapreduce描述方法,因为它更具可扩展性。
实现的方法之一是编写自己的hadoop recordreader
,它将向map
提供二进制数据。
但在你的情况下,我认为我们可以使用快捷方式,提供图像路径列表作为输入。
在map
,
setup(..){
//prep FileSystem fs = ..
}
map(...) {
String path = key.toString
FSDataInputStream in = fs.open(new Path(val))
//Using in.read() read as bytes. Optionally custom encoding.
//Set the binary value to key value if using bulkload, else to the Put object.
context.write(key, kv)
}
cleanup(..) {
//close fs. misc.
}
有点hacky,但我希望你明白这个想法。
同时阅读评论。如果要基于此设计系统,需要考虑几个设计注意事项。
希望它有所帮助。