【问题标题】:How to move image files from HDFS directory to HBase?如何将图像文件从 HDFS 目录移动到 HBase?
【发布时间】:2015-07-07 15:54:07
【问题描述】:

我有 Cloudera CDH 5.3.0

我在 HDFS 中有一个目录,其中包含几 GB 的图像文件。

这些文件有多种类型(jpg、png、gif)。

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

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

【问题讨论】:

  • 为什么需要这些文件在 HBase 中? HBase 不能很好地处理大单元(单元值甚至有默认的 10Mb 大小限制),在这种情况下,从 HDFS 提供文件可能比使用 HBase 更快。
  • @kostya 使用 Hbase 减轻了 NameNode 的压力,尤其是当您有大量小文件时。同样,有效性取决于用例。我猜很少有人使用 Hbase 来提供图像(yfrog),但他们已经针对他们的情况进行了很好的调整。 Hbase 有一些发展可以解决限制 (MOB)。 blog.cloudera.com/blog/2015/06/…
  • @Shyam,这很好。一种可能仍然有效的解决方案(取决于用例)是将多个图像放入单个 HAR 文件中。我同意这一切都取决于用例,我只是想提出最简单的方法来解决仍然可能有效的问题;)
  • @kostya:Ryan 没有提到 Image 的大小大于 10 MB。
  • @AnilGupta,他没有另外提及。显然,这个问题没有包含足够的信息来推荐最佳解决方案。我只是想提供帮助,并警告 Ryan HBase 存在潜在问题。

标签: hadoop hbase cloudera-cdh


【解决方案1】:

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

如您所述,HBase 表看起来像

行键<image-name>

cf:数据<binary-image-data>

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

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

由于您有数 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.
}

这有点老套,但我希望你能明白。

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

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-10
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    相关资源
    最近更新 更多