如何将图像文件从HDFS目录移动到HBase?

时间:2015-07-07 15:54:08

标签: hadoop hbase cloudera-cdh

我有Cloudera CDH 5.3.0

我在HDFS中有一个带有几千兆字节图像文件的目录。

这些文件有各种类型(jpg,png,gif)。

对于每个文件picturename.jpg,我想在HBase中添加一行picturename作为行键,以及一列包含图像数据。

有人可以解释我将如何完成这样的事情吗?

1 个答案:

答案 0 :(得分:2)

对于后台,HBase将所有内容存储为二进制文件。你会PutGet二进制数据。 只需将图像作为二进制文件读取

正如您所描述的,HBase表看起来像

  

rowkey <image-name>

     

cf:data <binary-image-data>

有几种方法可以将数据摄入HBase。

  • 使用或不使用mapreduce。
  • 使用putbulkload

由于您有几千兆字节的数据,最快的方法是使用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,但我希望你明白这个想法。

同时阅读评论。如果要基于此设计系统,需要考虑几个设计注意事项。

希望它有所帮助。