我有几个巨大的TIFF图像(60000x60000~60MB)。使用Hadoop,我想为每个图像创建一个分片金字塔(深度缩放格式),并将它们存储在HDFS上。理想情况下,我希望实现每个节点只处理图像的一部分。
实现这一目标的最佳方式是什么?在HDFS上存储小文件会是一个很大的开销吗?
您确定需要hadoop吗?你的图片没有那么大。我6岁的桌面可以在4分钟内对更大的图像进行深度缩放:
$ tiffinfo huge.tif
TIFF Directory at offset 0x12d095e4 (315659748)
Image Width: 91460 Image Length: 51866
Tile Width: 512 Tile Length: 512
Resolution: 10, 10 pixels/cm
Bits/Sample: 8
Compression Scheme: JPEG
...
$ time vips dzsave huge.tif x
real 3m40.841s
user 4m57.587s
sys 0m50.375s
在HDFS上存储小文件会是一个很大的开销吗?
查看Cloudera的这篇文章。有了HDFS联盟,大量文件的问题会稍微缓解一些。
http://www.cloudera.com/blog/2009/02/the-small-files-problem/
实现这一目标的最佳方式是什么?
首先检查用于创建深度缩放格式的API是否可以应用于图像文件的一部分。如果必须一次处理完整的文件,那么Hadoop就没有什么优势了。HDFS默认情况下会将文件拆分为64MB的拆分,每个拆分都可以由映射器并行处理。
如果你是Hadoop的新手,看看Hadoop中的基本字数示例是如何工作的,并尝试为你的需求做一些类似的事情。