Hadoop HIPI
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相关推荐
- hadoop 添加删除机器以及设置免密登录
添加hadoop机器 先在slaves中添加机器 然后启动datanode $: ./usr/hadoop-0.20.2-cdh3u4/bin/hadoop-daemon.sh start datan ...
- linux环境下快速配置hadoop集群免密登录
背景 在hadoop的日常使用过程中经常需要登录某些机器,如何更好的免密登录呢?这将为我们节省大量的时间 操作 假设你需要在A机器上免密登录B机器,那么你首先要确定B机器下是有秘钥文件的.如何确定是否 ...
- hadoop问题小结
20220322 https://blog.csdn.net/lt5227/article/details/119459827 hadoop控制台设置密码 访问验证 20220314 进入hive 高 ...
- hadoop,spark,scala,flink 大数据分布式系统汇总
20220314 https://shimo.im/docs/YcPW8YY3T6dT86dV/read 尚硅谷大数据文档资料 iceberg相当于对hive的读写,starrocks相当于对mysq ...
- spark,hadoop区别
https://zhuanlan.zhihu.com/p/95016937 Spark和Hadoop的区别和比较: 1.原理比较: Hadoop和Spark都是并行计算,两者都是用MR模型进行计算 H ...
- 2021年大数据Hadoop(三十):Hadoop3.x的介绍
全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 Hadoop3.x的介绍 介绍 Hadoop 3.0新特性 ...
- 2021年大数据Hadoop(二十九):关于YARN常用参数设置
全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 关于yarn常用参数设置 设置container分配最小内 ...
- 2021年大数据Hadoop(二十七):YARN运行流程
全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 Yarn运行流程 本系列历史文章 2021年大数据Hado ...
- 2021年大数据Hadoop(二十六):YARN三大组件介绍
全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 Yarn三大组件介绍 ResourceManager No ...
最新文章
- mybatis查询报错:com.mysql.cj.exceptions.DataConversionException: Cannot determine value type from string
- 解决Visual Studio For Mac Restore失败的问题
- 老王教你怎样干掉局域网的IDA验证
- c语言----预处理
- 13.multi_search_api
- linux 性能教程,Linux系统下常见性能分析工具的使用
- java遍历数组练习(for循环、foreach)
- android 碎片问题,Android碎片问题
- hadoop安装详细步骤_LED透明屏安装步骤详细说明
- 【华为认证】HCIA-DATACOM史上最全精选题库(附答案解析)
- VS2008+Vassistx使用技巧
- 软件工程 教师信息管理系统
- linux zip加压到文件夹,Linux下zip压缩和unzip解压缩命令全解
- 【JZOJ3339】wyl8899和法法塔的游戏【暴力】
- Vue动态加载本地磁盘图片
- Map_Excise1
- Hack the box (HTB) Metatwo靶机
- 根据year年的第week周,查询第week周的起止时间
- 【蓝桥真题3】蓝桥改革变难,想进国赛这些能力你可缺一不可
- 曾经面试的一个关于文件操作的上机题