如何在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中 (我们也做了一些其他的工作,例如 转换成 jpeg,png等图像文件格式,图像缩小等 ,直接存入 HDFS, 结果 可以明显比较出来 , 转换成jpeg 大小 降低很多 ) ,
我们的处理过程主要包括以下几个步骤:
1,Map函数中创建本地临时缓存文于Mapper所在节点上
2,Map函数中创建HDFS中输出的TIFF文件返回输出流对象
3, 调用GeoTiffWriter(GeoTiffWriter是 WorldWind中的代码,我们拿出来重写了部分代码,因为之前的代码不支持我们这种调用方式),输入参数是临时文件名 和 输出流对象
3,在GeoTiffWriter中 , 先将处理后的TIFF数据 即 保存在BufferedImage对象中的数据保存到 临时文件中,并且为临时文件开一个缓冲区(channel), 然后 将临时文件 拷贝到 hdfs输出流中 ,
4,调用write方法写 临时文件 , 先在临时文件中定位到 0位置, 从中 建立 64k缓冲区,
用 私有变量 记录 传入的 hdfs输出流,
,从临时 文件中 读出来 写入 hdfs输出流中 。
- 如何在Hadoop中随机写
- 在hadoop MapReduce 中写日志消息
- 如何在数据库中获取随机的记录
- 如何在自定义函数中使用随机函数
- 在游戏中如何让随机更加智能
- HTML技术:如何在网页中图片的随机显示
- 如何在 Linux 中产生、加密或解密随机密码
- 如何在Linux内核中写文件
- 在Qt中如何写控制台程序
- 如何在Office中写英语音标
- 如何在sqlserver中写存储过程
- 如何在网页中写javascript
- 如何在csdn中写一篇博客
- 如何在Markdown中写公式
- C语言中如何写一个简单可移植而又足够随机的随机数生成器
- 如何写一个随机洗牌函数
- Oracle中如何生成随机数字、随机字符串、随机日期
- 深度分析如何在Hadoop中控制Map的数量
- HID - Keyboard键盘和Mouse鼠标实例
- GridView使用RenderControl取得HTML的问题
- Google翻译内嵌到网站,轻松国际化
- SIFT算法学习小记
- SQL常用日期时间处理函数
- 如何在Hadoop中随机写
- eclipse CVS 中文文件名乱码,不能更新解决
- 关于阅读MFC源码的MFC.bsc文件
- Android 单个模块编译
- My new blog
- 整理一下安装Ubuntu以来遇到的一些问题(一)
- ASP.NET MVC 母版页、用户自定义控件及文件上传
- 在PHP里面运用与Perl兼容地正则表达式【转载】
- 在PHP里面运用与Perl兼容地正则表达式【转载】