如何将图像文件从 HDFS 目录移动到 HBase?
How to move image files from HDFS directory to HBase?
我有 Cloudera CDH 5.3.0
我在 HDFS 中有一个目录,其中包含几千兆字节的图像文件。
这些文件有多种类型(jpg、png、gif)。
对于每个文件 picturename.jpg
,我想要在 HBase 中以 picturename
作为行键的行,以及包含图像数据的列。
谁能解释一下我将如何完成这样的事情?
对于后台,HBase 将所有内容存储为二进制。你会 Put
和 Get
二进制数据。
将图像作为二进制文件读取
如您所述,HBase table 看起来像
rowkey <image-name>
cf:data <binary-image-data>
有多种方法可以将数据提取到 HBase。
- 使用或不使用 mapreduce。
- 使用
put
或 bulkload
。
由于您有几千兆字节的数据,最快的方法是使用 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.
}
有点老套,但我希望你能理解。
另请阅读评论。如果您要基于此设计系统,需要考虑几个设计注意事项。
希望对您有所帮助。
我有 Cloudera CDH 5.3.0
我在 HDFS 中有一个目录,其中包含几千兆字节的图像文件。
这些文件有多种类型(jpg、png、gif)。
对于每个文件 picturename.jpg
,我想要在 HBase 中以 picturename
作为行键的行,以及包含图像数据的列。
谁能解释一下我将如何完成这样的事情?
对于后台,HBase 将所有内容存储为二进制。你会 Put
和 Get
二进制数据。
将图像作为二进制文件读取
如您所述,HBase table 看起来像
rowkey
<image-name>
cf:data
<binary-image-data>
有多种方法可以将数据提取到 HBase。
- 使用或不使用 mapreduce。
- 使用
put
或bulkload
。
由于您有几千兆字节的数据,最快的方法是使用 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.
}
有点老套,但我希望你能理解。
另请阅读评论。如果您要基于此设计系统,需要考虑几个设计注意事项。
希望对您有所帮助。