如何在Hadoop中随机写

来源:互联网 发布:javascript结尾怎么写 编辑:程序博客网 时间:2024/06/09 16:44

题目有点忽悠人,希望被忽悠进来的筒子接着看,会有收获的

 

最近 由于 项目 中 遇到了TIFF(我们的TIFF文件是 GeoTiff)批量处理的问题,并且由于HDFS读写 图像文件功能的缺失,所以我们就自定义了Hadoop ImageInputFormat ImageRecordReader等类, 将 文件的 名称封装在 Key中 ,将 文件的 内容 放入FSDataInputStream ,封装在 Value中 , 完成了读取的工作,但是  key value  map函数中进行处理 之后,例如 加 logo等 操作 ,获取 图像  元数据等  tiff文件的写 如到 HDFS中 成为了新的问题,根据我们已有的知识 我们判断 Hadoop 是不支持随机写的,FSDataOutputStream是不允许定位的

(我们使用的版本是 0.19.1

 

 

由于 tiff的写 不能按照顺序流的 方式 写  , 这是由于 tiff文件编码方式决定的

,必然会用到随机写的方法 如 seek 或者是 position , 而目前 hdfs  不支持 随机写

仅仅支持顺序写, 所以我们经过判断认为,要想达到要求 ,必须 在  本地文件系统  建立 临时 文件  , 然后 通过 流的 方式 拷贝到HDFS中 (我们也做了一些其他的工作,例如 转换成 jpegpng等图像文件格式,图像缩小等 ,直接存入 HDFS, 结果 可以明显比较出来  , 转换成jpeg 大小 降低很多 ) ,

我们的处理过程主要包括以下几个步骤:

1,Map函数中创建本地临时缓存文于Mapper所在节点上

 

2Map函数中创建HDFS中输出的TIFF文件返回输出流对象

 

 

3, 调用GeoTiffWriterGeoTiffWriter WorldWind中的代码,我们拿出来重写了部分代码,因为之前的代码不支持我们这种调用方式),输入参数是临时文件名 和 输出流对象 

 

3,在GeoTiffWriter中 , 先将处理后的TIFF数据 即 保存在BufferedImage对象中的数据保存到 临时文件中,并且为临时文件开一个缓冲区(channel), 然后 将临时文件  拷贝到  hdfs输出流中 ,

 

4,调用write方法写 临时文件    先在临时文件中定位到 0位置, 从中 建立 64k缓冲区,

用 私有变量 记录 传入的 hdfs输出流,

,从临时 文件中 读出来  写入  hdfs输出流中 。

原创粉丝点击