日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JSP访问Hadoop 图片存储服务

發(fā)布時間:2025/6/15 javascript 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JSP访问Hadoop 图片存储服务 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
使用hadoop的hdfs來存放圖片文件.以下是整個架構(gòu)思路:

? 使用hadoop作為分布式文件系統(tǒng),hadoop是一個實現(xiàn)了HDFS文件系統(tǒng)和MapReduce的開源項目,我們這里只是

使用了它的hdfs.首先從web頁面上上傳的文件直接調(diào)用hadoop接口將圖片文件存入hadoop系統(tǒng)中,hadoop可以設(shè)定備份

數(shù),這樣在hadoop系統(tǒng)中某個datanode死掉并不會造成圖片不可能,系統(tǒng)會從其他datanode上拿到數(shù)據(jù)。以下我們編寫的一個hadoop的java的訪問封裝類:

?

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileUtil;
import org.apache.hadoop.fs.Path;
import org.apache.log4j.Logger;

?

public class HadoopFileUtil {
?static Logger logger = Logger.getLogger(HadoopFileUtil.class);
?/**
? * @param args
? */
?public static void main(String[] args) {
??
???String src=args[0];
???String dst=args[1];
???String tag=args[2];
???HadoopFileUtil util=new HadoopFileUtil();
???if(tag!=null&&tag.equals("1")){
????System.out.println(util.createFile(src, dst));
???}
???else{
????util.deleteFile(dst);
???}

?}

?/**
? * 拷貝一個本地文件到hadoop里面
? * @param localFile 本地文件和路徑名
? * @param hadoopFile hadoop文件和路徑名
? * @return
? */
?public? boolean createFile(String localFile,String hadoopFile){
??try {
???Configuration conf=new Configuration();
???FileSystem src=FileSystem.getLocal(conf);
???FileSystem dst= FileSystem.get(conf);
???Path srcpath = new Path(localFile);
???Path dstpath = new Path(hadoopFile);
???FileUtil.copy(src, srcpath, dst, dstpath,false,conf);
??} catch (Exception e) {
???e.printStackTrace();
???return false;
??}??

??return true;
?}
?
?
?/**將一個流作為輸入,生成一個hadoop里面的文件
? * @param inStream 輸入流
? * @param hadoopFile hadoop路徑及文件名字
? * @return
? */
?public boolean createFileByInputStream(InputStream inStream,String hadoopFile){
??try {
???Configuration conf=new Configuration();
???FileSystem dst= FileSystem.get(conf);
???Path dstpath = new Path(hadoopFile);
???FSDataOutputStream oStream=dst.create(dstpath);
???byte[] buffer = new byte[400];
???int length = 0;
???while((length = inStream.read(buffer))>0){
????oStream.write(buffer,0,length);
???}
???oStream.flush();
???oStream.close();
???inStream.close();
??} catch (Exception e) {
???e.printStackTrace();
???return false;
??}??
??return true;
?}
?/**
? * 刪除hadoop里面的一個文件
? * @param hadoopFile
? * @return
? */
?public? boolean deleteFile(String hadoopFile){
??try {
???Configuration conf=new Configuration();
???FileSystem dst= FileSystem.get(conf);
???FileUtil.fullyDelete(dst,new Path(hadoopFile));
??} catch (Exception e) {
???e.printStackTrace();
???return false;
??}
??
??return true;
?}
?/**
? * 從hadoop中讀取一個文件流
? * @param hadoopFile
? * @return
? */
?public FSDataInputStream getInputStream(String hadoopFile){
??FSDataInputStream iStream=null;
??try {
???Configuration conf=new Configuration();
???FileSystem dst= FileSystem.get(conf);
???Path p=new Path(hadoopFile);
???iStream=dst.open(p);
??} catch (Exception e) {
???e.printStackTrace();
???logger.error("getInputStream error:", e);
??}
??return iStream;
?}

}
通過調(diào)用這個類可以將圖片存入hadoop 系統(tǒng).

當(dāng)需要訪問某個圖片時,先訪問jsp服務(wù)器(如:tomcat)的一個servlet,這個servlet從hadoop里面讀出圖片,并

返回給瀏覽器.以下是我們的servlet:
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.io.IOUtils;
import org.apache.log4j.Logger;

import com.tixa.dfs.hadoop.util.HadoopFileUtil;

public class HadoopServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
?static Logger logger = Logger.getLogger(HadoopServlet.class);
?
?public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{

??PrintWriter out=res.getWriter();
??res.setContentType("image/jpeg");
??java.util.Date date = new java.util.Date();??
??res.setDateHeader("Expires",date.getTime()+1000*60*60*24);??
??String path=req.getPathInfo();
??path=path.substring(1,path.length());
??HadoopFileUtil hUtil=new HadoopFileUtil();
??FSDataInputStream inputStream=hUtil.getInputStream(path);
??OutputStream os = res.getOutputStream();
?
??byte[] buffer = new byte[400];
??int length = 0;
??while((length = inputStream.read(buffer))>0){
???? os.write(buffer,0,length);
??}
??os.flush();
??os.close();
??inputStream.close();
?}
???
}
另外,為了避免對hadoop的頻繁讀取,可以再jsp服務(wù)器前放一個squid進行對圖片的緩存。

這就是我們圖片服務(wù)器的架構(gòu).

總結(jié)

以上是生活随笔為你收集整理的JSP访问Hadoop 图片存储服务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。