如何将图像文件从hdfs目录移动到hbase?

noj0wjuj  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(405)

我有cloudera cdh 5.3.0
我在hdfs中有一个目录,里面有几GB的图像文件。
这些文件有各种类型(jpg、png、gif)。
对于每个文件 picturename.jpg ,我想在hbase中与 picturename 作为行键,以及包含图像数据的列。
有人能解释一下我是如何做到这一点的吗?

m3eecexj

m3eecexj1#

在后台,hbase将所有内容存储为二进制文件。你会的 Put 以及 Get 二进制数据。只需将图像作为二进制文件读取即可
如您所述,hbase表如下所示
行键 <image-name> cf:数据 <binary-image-data> 有几种方法可以将数据摄取到hbase中。
使用或不使用mapreduce。
使用 put 或者 bulkload .
因为您有几GB的数据,所以最快的方法是使用mapreduce和 bulkload . cloudera提供的有关批量加载的有用教程: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.
}

有点老套,但我希望你能理解。
同时阅读评论。如果要基于此设计系统,则需要考虑几个设计因素。
希望有帮助。

相关问题