Hadoop HIPI学习

1.Hipi是什么?

HIPI是hadoop图片处理的框架,它提供了用于在分布式计算环境中执行图片处理任务的API。

描述图如下:

2.HIPI作用:

用于合并小的图像文件,及切割算法。

3.为什么用要用HIPI框架

因为hadoop框架很适合大文件的操作,而我们平时使用的图片的文件都比较小,如果这种小文件不经过处理直接上传,会十分影响性能,所以HIPI框架具备图片的合并以及分割,Hadoop HIPI学习

2.Hipi是什么?

HIPI是hadoop图片处理的框架,它提供了用于在分布式计算环境中执行图片处理任务的API。

描述图如下:

本人的个人理解:

通过HIBI框架把客户端上传的多张图片合并成一个大的HIB文件,然后把这些大的文件上传到hadoop hdfs中,

(待续.。。。。)

3.HIPI作用:

用于合并小的图像文件,及切割算法。

帮我们很好的解决了这方面的问题.

4.HIPI官网: 官网中有很多有用的资料,大家可以看看

http://hipi.cs.virginia.edu/index.html

5.HIPI框架下载地址:

http://hipi.cs.virginia.edu/downloads.html

里面有几个版本,大家把HIPI开发版下载下来就可以了,里面的内容很全.

hipi-dev.tar.gz ---该版本为开发版

6.把本地的图片文件通过HIPI框架上传到hadoop系统中

(1).把hipi-dev.tar.gz中src的源码引入到eclipse的jar项目中.----之所以引入源码,因为目前HIPI还是有一些BUG的(不过对我们使用HIPI的影响不是很大)

例如:获取一个分辨率很大的图片,会报内存异常错误,导入源码后,可以对一些bug进行修改,或对现已有的功能进行定制化修改。

(2).把hipi-dev.tar.gz中3rdparty中的metadata-extractor-2.3.1.jar和junit-4.11.jar,导入的到项目中去.否则会报错.

(3)上传代码:

往hib中添加1张图片,上传到hdfs中

/**

*

*/

package com.hd.hdfs;

import hipi.image.FloatImage;

import hipi.image.ImageHeader;

import hipi.image.ImageHeader.ImageType;

import hipi.imagebundle.AbstractImageBundle;

import hipi.imagebundle.HipiImageBundle;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.util.ArrayList;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.Path;

/**

* @author

*时间: @2013-12-18 @下午5:22:44

*说明:上传数据

*

*/

public class UploadImage {

/**

* 上传

* @throws IOException

*/

public void myUploadImage() throws IOException{

//ArrayList<String> hosts=new ArrayList<String>();

Configuration conf=new Configuration();

conf.addResource(new Path("d:\\core-site.xml"));

conf.addResource(new Path("d:\\hdfs-site.xml"));

conf.addResource(new Path("d:\\mapred-site.xml"));

HipiImageBundle hib=new HipiImageBundle(new Path("/test/file2.hib"), conf);

hib.open(AbstractImageBundle.FILE_MODE_WRITE,true);

File file=new File("c:\\a.jpg");

FileInputStream fis=new FileInputStream(file);

hib.addImage(new FileInputStream(new File("d:\\zc\\IMG_0325.jpg")),ImageType.JPEG_IMAGE);

hib.addImage(fis,ImageType.JPEG_IMAGE);

hib.close();

}

/**

* 追加数据

* @param args

* @throws IOException

* 把file2中的数据追加到file3中

*/

public void addpendImage() throws IOException{

Configuration conf=new Configuration();

conf.addResource(new Path("d:\\core-site.xml"));

conf.addResource(new Path("d:\\hdfs-site.xml"));

conf.addResource(new Path("d:\\mapred-site.xml"));

HipiImageBundle hib=new HipiImageBundle(new Path("/test/file3.hib"), conf);

hib.open(AbstractImageBundle.FILE_MODE_WRITE,true);

File file=new File("d:\\zc\\IMG_0321.jpg");

FileInputStream fis=new FileInputStream(file);

hib.addImage(fis,ImageType.JPEG_IMAGE);

HipiImageBundle hib1=new HipiImageBundle(new Path("/test/file2.hib"), conf);

hib.append(hib1);

}

public static void main(String[] args) {

try {

new UploadImage().myUploadImage();

//new UploadImage().addpendImage();

//new UploadImage().addInfo();

} catch (IOException e) {

e.printStackTrace();

}

}

}

4.从hdfs 中读取图片数据,然后保存到本地

/**

*

*/

package com.hd.hdfs;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.Path;

import hipi.image.FloatImage;

import hipi.image.ImageHeader;

import hipi.image.io.JPEGImageUtil;

import hipi.imagebundle.AbstractImageBundle;

import hipi.imagebundle.HipiImageBundle;

/**

* @author

*时间: @2013-12-19 @上午11:54:28

*说明:hdfs中读取HIB数据,保存到本地中

*

*/

public class DonloadInfo extends HipiImageBundle {

/**

* @param file_path

* @param conf

*/

public DonloadInfo(Path file_path, Configuration conf) {

super(file_path, conf);

try {

//开启模式

this.openForRead();

while (this.hasNext()) {

ImageHeader imageHeader = this.next();

FloatImage image = this.readImage();

JPEGImageUtil.getInstance().encodeImage(image, imageHeader, new FileOutputStream(new File("c:\\b.jpg")));

}

this.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public static void main(String[] args) {

Configuration conf=new Configuration();

conf.addResource(new Path("d:\\core-site.xml"));

conf.addResource(new Path("d:\\hdfs-site.xml"));

conf.addResource(new Path("d:\\mapred-site.xml"));

new DonloadInfo(new Path("hdfs://192.168.1.200:9000/test/file2.hib"),conf);

}

}

上面代码就是读区图片信息,如果大家在试验中上传的分别率过大图片在读取的时候,会报内存溢出,这是由于HIBI源码的一个bug.(如果上传一个较小分别率图片的话是没有问题的)

分析BUG原因:

进入HipiImageBundle中会发现.

代码225行报错:

Image=decoder.decodeImage(_byte_arrayinput_stream);

该_byte_array_input_stream输入流是中是获取的到是正确的.主要是decodeImage接口代码中有问题

,进入实现类JPEGImageUtil类中,找到decodeImage()方法,在代码98行中发现,

float[] pels = new float[w*h*3];

W和h代表图片的分辨率,如果你的分辨率过大的话,会出现w*h*3超过了float数组的返回,就会报内存溢出错误.

解决办法:

在源码包中HIpiIImageBundle中,添加如下方法:

private ByteArrayInputStream in=null;

public ByteArrayInputStream getByteArrayInputStream(){

if (in != null)

return in;

if (_cacheLength > 0) {

ImageDecoder decoder = CodecManager.getDecoder(ImageType

.fromValue(_cacheType));

if (decoder == null)

return null;

ByteArrayInputStream _byte_array_input_stream = new ByteArrayInputStream(_byte_array_data);

return_byte_array_input_stream;

}

return null;

}

然后在HipiImageBundle中的readImage()方法下面加入如下方法:

Public ByteArrayInputStream readByteArrayInputStream(){

return _reader.getByteArrayInputStream();

}

//现在我们就可以直接获取到ByteArrayInputStream流了, 该流就是每张图片的流,得到流后,就可以信息各种操作了.

源码修改后的,获取图片的代码:

/**

*

*/

package com.hd.hdfs;

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import javax.imageio.ImageIO;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.Path;

import com.sun.image.codec.jpeg.JPEGCodec;

import com.sun.image.codec.jpeg.JPEGEncodeParam;

import com.sun.image.codec.jpeg.JPEGImageEncoder;

import hipi.image.FloatImage;

import hipi.image.ImageHeader;

import hipi.image.io.JPEGImageUtil;

import hipi.imagebundle.AbstractImageBundle;

import hipi.imagebundle.HipiImageBundle;

/**

* @author

*时间: @2013-12-19 @上午11:54:28

*说明:hdfs中读取HIB数据,保存到本地中

*

*/

public class DonloadInfo extends HipiImageBundle {

/**

* @param file_path

* @param conf

*/

public DonloadInfo(Path file_path, Configuration conf) {

super(file_path, conf);

try {

//开启模式

this.openForRead();

ByteArrayInputStream by=null;

BufferedImage bufferedImage=null;

int len=0;

byte b[]=new byte[1024];

int i=0;

while (this.hasNext()) {

ImageHeader imageHeader = this.next();

by=this.readByteArrayInputStream();

i++;

FileOutputStream out=new FileOutputStream("c:\\img\\a"+i+".jpg");

while((len=by.read(b))!=-1){

out.write(b, 0, len);

}

out.close();

}

this.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public static void main(String[] args) {

Configuration conf=new Configuration();

conf.addResource(new Path("d:\\core-site.xml"));

conf.addResource(new Path("d:\\hdfs-site.xml"));

conf.addResource(new Path("d:\\mapred-site.xml"));

new DonloadInfo(new Path("hdfs://192.168.1.200:9000/test/file2.hib"),conf);

}

}

Hadoop HIPI相关推荐

  1. hadoop 添加删除机器以及设置免密登录

    添加hadoop机器 先在slaves中添加机器 然后启动datanode $: ./usr/hadoop-0.20.2-cdh3u4/bin/hadoop-daemon.sh start datan ...

  2. linux环境下快速配置hadoop集群免密登录

    背景 在hadoop的日常使用过程中经常需要登录某些机器,如何更好的免密登录呢?这将为我们节省大量的时间 操作 假设你需要在A机器上免密登录B机器,那么你首先要确定B机器下是有秘钥文件的.如何确定是否 ...

  3. hadoop问题小结

    20220322 https://blog.csdn.net/lt5227/article/details/119459827 hadoop控制台设置密码 访问验证 20220314 进入hive 高 ...

  4. hadoop,spark,scala,flink 大数据分布式系统汇总

    20220314 https://shimo.im/docs/YcPW8YY3T6dT86dV/read 尚硅谷大数据文档资料 iceberg相当于对hive的读写,starrocks相当于对mysq ...

  5. spark,hadoop区别

    https://zhuanlan.zhihu.com/p/95016937 Spark和Hadoop的区别和比较: 1.原理比较: Hadoop和Spark都是并行计算,两者都是用MR模型进行计算 H ...

  6. 2021年大数据Hadoop(三十):Hadoop3.x的介绍

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 Hadoop3.x的介绍 介绍 Hadoop 3.0新特性 ...

  7. 2021年大数据Hadoop(二十九):​​​​​​​关于YARN常用参数设置

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 关于yarn常用参数设置 设置container分配最小内 ...

  8. 2021年大数据Hadoop(二十七):YARN运行流程

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 Yarn运行流程 本系列历史文章 2021年大数据Hado ...

  9. 2021年大数据Hadoop(二十六):YARN三大组件介绍

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 Yarn三大组件介绍 ResourceManager No ...

最新文章

  1. mybatis查询报错:com.mysql.cj.exceptions.DataConversionException: Cannot determine value type from string
  2. 解决Visual Studio For Mac Restore失败的问题
  3. 老王教你怎样干掉局域网的IDA验证
  4. c语言----预处理
  5. 13.multi_search_api
  6. linux 性能教程,Linux系统下常见性能分析工具的使用
  7. java遍历数组练习(for循环、foreach)
  8. android 碎片问题,Android碎片问题
  9. hadoop安装详细步骤_LED透明屏安装步骤详细说明
  10. 【华为认证】HCIA-DATACOM史上最全精选题库(附答案解析)
  11. VS2008+Vassistx使用技巧
  12. 软件工程 教师信息管理系统
  13. linux zip加压到文件夹,Linux下zip压缩和unzip解压缩命令全解
  14. 【JZOJ3339】wyl8899和法法塔的游戏【暴力】
  15. Vue动态加载本地磁盘图片
  16. Map_Excise1
  17. Hack the box (HTB) Metatwo靶机
  18. 根据year年的第week周,查询第week周的起止时间
  19. 【蓝桥真题3】蓝桥改革变难,想进国赛这些能力你可缺一不可
  20. 曾经面试的一个关于文件操作的上机题

热门文章

  1. 序列化解决方案,就是采用二进制通信协议(数据报文格式)
  2. 学习上溯造型和下溯造型 【转载一篇】
  3. 计算机考研面试自我介绍范文英语,研究生英语面试自我介绍范文三篇
  4. pytorch1.13启用caffe2
  5. 全面的平板--Surface(各版本对比)
  6. 运筹学 基础 知识点总结 (八)
  7. UCOSⅢ 任务管理
  8. 常用计算机二级题库,17年计算机二级office选择题题库
  9. 解决Past duration X.XXXX too large警告
  10. 前端框架-Angular.js