分类 工具 下的文章

cygwin的作用

虽说Cygwin很强大,可以模拟linux、unix操作系统,但我还是不推荐使用这个工具。因为,我们现在的个人电脑配置已经足够高了,完全可以使用虚拟机软件虚拟一个完全的、真实的linux操作系统。Cygwin是需要安装在window上的,因此会出现好多意想不到的问题。我们既然能使用完全的linux系统,为什么非要使用各虚拟机软件来模拟linux,给自己找麻烦呢。
cygwin是一个在windows平台上运行的unix模拟环境,是cygnus solutions公司开发的自由软件(该公司开发了很多好东西,著名的还有eCos,不过现已被Redhat收购)。它对于学习unix/linux操作环境,或者从unix到windows的应用程序移植,或者进行某些特殊的开发工作,尤其是使用gnu工具集在windows上进行嵌入式系统开发,非常有用。随着嵌入式系统开发在国内日渐流行,越来越多的开发者对cygwin产生了兴趣。
Cygwin始于1995年,最初作为Cygnus工程师Steve Chamberlain的一个项目。当时Windows NT和Windows 95将COFF作为目标代码,而GNU已经支持x86和COFF,以及C语言库newlib。这样至少在理论上,可以将GCC重定向,作为cross compiler,从而产生能在Windows上运行的可执行程序。在后来的实践中,这很快实现了。
接下来的问题是如何在Windows系统中引导编译器,这需要对Unix的足够模拟,以使GNU configure的shell script可以运行,这样就用到像bash这样的shell,进而需要Fork和standard I/O。Windows含有类似的功能,所以Cygwin库只需要进行翻译调用、管理私有数据,比如文件描述符。
1996年后,由于看到cygwin可以提供Windows系统上的Cygnus嵌入式工具(以往的方案是使用DJGPP),其他工程师也加入了进来。特别吸引人的是,Cygwin可以实现three-way cross-compile,例如可以在Sun工作站上build,如此就形成Windows-x-MIPS cross-compiler,这样比单纯在PC上编译要快不少。1998年起,Cygnus开始将Cygwin包作为产品来提供。
Cygwin包括了一套库,该库在Win32系统下实现了POSIX系统调用的API;还有一套GNU开发工具集(比如GCC、GDB),这样可以进行简单的软件开发;还有一些UNIX系统下的常见程序。2001年,新增了X Window System。
另外还有一个名为MinGW的库,可以跟Windows本地的MSVCRT库(Windows API)一起工作。MinGW占用内存、硬盘空间都比较少,能够链接到任意软件,但它对POSIX规范的实现没有Cygwin库完备。
但糟糕的是,Cygwin不支持Unicode。实际上,除了当前Windows系统以及OEM codepages(例如,一个俄语用户,他的codepages是CP1251和CP866,而不能是KOI8-R、ISO/IEC 8859-5、UTF-8等),Cygwin对其他字符集都不支持。
Red Hat 规定,Cygwin 库遵守 GNU General Public License,但也可以跟符合开源定义的自由软件链接。Red Hat 另有价格不菲的许可协议,这样使用 Cygwin 库的专属软件,就可以进行再发布。
cygnus当初首先把gcc,gdb,gas等开发工具进行了改进,使他们能够生成并解释win32的目标文件。然后,他们要把这些工具移植到windows平台上去。一种方案是基于win32 api对这些工具的源代码进行大幅修改,这样做显然需要大量工作。因此,他们采取了一种不同的方法——他们写了一个共享库(就是cygwin dll),把win32 api中没有的unix风格的调用(如fork,spawn,signals,select,sockets等)封装在里面,也就是说,他们基于 win32 api写了一个unix系统库的模拟层。这样,只要把这些工具的源代码和这个共享库连接到一起,就可以使用unix主机上的交叉编译器来生成可以在 windows平台上运行的工具集。以这些移植到windows平台上的开发工具为基础,cygnus又逐步把其他的工具(几乎不需要对源代码进行修改,只需要修改他们的配置脚本)软件移植到windows上来。这样,在windows平台上运行bash和开发工具、用户工具,感觉好像在unix上工作。
所以我对学习hadoop的同学建议还是那些,再贴一遍:
必须先记在心里的东西:
1、cygwin只是模拟了linux环境
2、hadoop必须安装在linux环境上
3、mapreduce程序开发直接就在window上开发即可
4、mapreduce程序的运行:可以把写好的程序打成jar包 放到hadoop集群上 执行hadoop命令(就像大家安装完 验证集群是否正常运行那样 ”计算圆周率“一样)
5、 我们学的是hadoop 而不是整环境 ,可以先把环境的问题绕过
6、刚开始千万别用eclipse连接hadoop集群
7、如果你说6的理由是测试方便,那我告诉你,写junit更方便

BBC.地平线.大数据时代

“在洛杉矶,警方通过数据分析,预测12小时内哪个地区最有可能发生犯罪;在伦敦金融城,一位交易员认为,数学计算可成为发财”秘笈”;在南美,天文学家尝试为整个宇宙进行分类记录……这些迥然不同的领域如今出现同一特征:数据量的大爆发。”
  这是英国广播公司品牌栏目《地平线》最新播出的纪录片《大数据时代》中的开篇一幕。

Java开发者不一定最适合Hadoop

JNAN DASH的一位(IBM数据仓库BI)专家朋友几周前参加了在圣何塞举行的Hadoop会议。两年前也是这个时间,他参加了当时在纽约的Hadoop会议,但当时仅有200人,而这次不仅有2000多人参加,并且门票早已销售一空。显然,这很直观地证明了Hadoop会议引发了业内高度的兴趣。不止如此,他发现每一个主题演讲的PPT中有关Hadoop技术的幻灯片中都提到“我们正在招聘(we are hiring)”。
人才缺乏由此可见一斑。作为一个能够对大量数据进行分布式处理的软件框架,Hadoop可靠、高效而可伸缩。由于Hadoop很容易实现对搜索关键字进行内容分类,并可以通过并行处理加快处理速度,所以受到更行业的欢迎。而Hadoop带有用Java 语言编写的框架,因此在Linux生产平台上很理想。而在Hadoop上的应用程序也可以使用其他语言编写,比如 C++。
事实上,Hadoop使廉价服务器的大规模并行计算成为可能。企业可以收集更多的数据,保留时间可以更长,并对所有数据可以进行之前由于成本、复杂性和缺乏工具而无法进行的分析。互联网企业几乎都是Hadoop的用户,而如eBay、Facebook、LinkedIn、Netflix和Twitte的创新型尝试也为其他数据密集型行业,如金融、科技、电信和政府的应用铺平了道路。越来越多的IT人发现,Hadoop已经在其架构规划中占据一席之地。但Hadoop成为绝对主流的另一大挑战是,如何找到擅长这一技术的专业人才。
Cloudera、IBM、Hortonworks、MapR是值得关注的四家Hadoop企业。而这几家都有大量投资于培训计划,教IT专业人员如何部署,配置和管理Hadoop的产品。显然,这些企业清楚地认识到,人才将是限制Hadoop企业级应用发展不容回避的问题。
但另一面,Cloudera的客户解决方案副总裁Omer Trajman却表示:“直接雇佣新人是不可思议的。”在他看来,“最可行的办法是在企业内部寻找人才来学习Hadoop。”因为,“最成功的公司一般不需要大举招聘。因为在企业内部,完全可以了解员工的基本技能,比如谁有科学、统计、数据处理、利用Java来开发和分析的背景,找到这些已经在相关业务领域中拥有专门知识的人才,然后再做Hadoop培训,教会他们如何使用Hadoop工具,就可以成为合格的人才。”
当然,随着对Hadoop的重视程度更高,业内学习Hadoop的人也在增加。相关业内人士表示:“几年前我在面试技术人员时,问他们是否认识Hadoop?而通常的答案是ha-what?但是如今,知道和运用Hadoop的人已经越来越多了。”
不过,问题也随之而来。企业需要明确什么样类型的人是适合招聘的Hadoop人才?
“我们原以为需要找一个铁杆的Java开发者”,MapR商业分销Return Path的负责人表示,“但事实并非如此。最适合Hadoop的人才不一定是Java工程师。反而是那些能够理解集群、收集一些工具,指出如何实现协同工作,并能处理Hadoop生态系统中出现的许多问题,而并不仅限于Hadoop 1.0的人才是我们需要的技能型人才。”
这篇文章发表在:2012-07-13

招聘hadoop方向的开发人员主要看重的是什么能力?

想请教一下,在招聘hadoop方向的开发人员时,和招聘web应用开发人员的要求有什么不同,是否会更看重算法设计能力。对于目前从事web开发,想要转至hadoop方向的程序员有没有什么好的建议呢?谢谢!
我的规划中,是没有“专业Hadoop程序员”这个概念的。毕竟这只是一个框架,就好像不能叫“专业Mysql管理员”一样,我们应该是从事分布式计算的工程师,或者云计算工程师。
做这个领域,我认为有两个方面的能力是重要的,技术架构能力和业务数据敏感。
针对目前从事Web开发的工程师,我第一个建议是提高视野。很多Web工程师只认识Web框架内的东西,这阻碍他理解批处理系统的结构。
第二个建议是要对业务数据敏感,大部分Web工程师长期接触一线的需求,这方面是没有问题的。
你说的算法设计能力,我认为是技术能力的一部分。在入门阶段不是很紧迫,做1-2年以后会遇到需要优化的算法问题。
关于第一个问题,招聘时的区别。在我这里是没有的,任何领域的开发人员我们都要求 1 基础扎实 2 逻辑清晰 3 沟通流畅,知识可以慢慢学,但是素质不容易改。
知乎: http://www.zhihu.com/question/19956296

比Hive高效7倍 Facebook推新一代查询引擎Presto

在Facebook总部的一次开发者会议上,这个社交网络巨头的工程师透露,他们正在使用新的自主研发的查询引擎Presto,在已有的250PB的庞大数据仓库上进行交互式分析。
据Martin Traverso工程师透露,有超过850名Facebook工程师每天用它来扫描超过320TB的数据。在以前,我们的科学家和分析师一直依靠Hive来做数据分析。但Hive是专为批处理设计的。但随着数据越来越多,Hive已不能满足我们的需求。虽然我们还有其他比Hive更快的工具,但它们要么在功能有所限制要么就太简单,以至于无法操作我们庞大的数据仓库。而在过去的几个月中,我们一直使用Presto来填补这方面的空白。
Hive是Facebook在几年前专为Hadoop打造的一款数据仓库工具。因为它主要依赖MapReduce进行运行,所以随着年龄的上升,其在速度上已不能满足日益增长的数据要求。浏览一个完整的数据集可能要花费几分到几小时,这完全是不切实际的。
Traverso还表示,使用Presto进行简单的查询只需要几百毫秒,即使是非常复杂的查询,也只需数分钟即可完成,它在内存中运行,并且不会向磁盘写入。
虽然看起来Presto如同Facebook版的Cloudera Impala SQL查询引擎,或与Hortonworks在Stinger项目中所做的事情相似,但这是按照Facebook规模为实现更快操作而定制的版本。Presto并不会与其他商业产品进行竞争,但它会很快让大数据行业产生不小的震动。并且Facebook打算在今年秋天以开源的形式发布Presto。
Facebook的工程经理Ravi Murthy表示,随着用户量地不断增长,数据仓库也在快速增长,它比四年前要大4000倍。Murthy 也表示,在接下来几年,数据将会达到艾字节。因此,为了适应这种数据规模,我们不得不重新考虑许多东西。
Presto则是其中之一,除了提高查询速度,在CPU使用效率上,这个引擎比Hive高效7倍。另外一个正在进行的项目是缩减Facebook数据中心的分析数据空间。

Windows Azure要拥抱开源Hadoop

为什么Windows Azure要拥抱Hadoop?
Hadoop已经有一个非常完整的生态系统。最底层的是一个HDFS,是一个分布式的文件系统。但仅有HDFS和Mapreduce还远远不够,很多用户都在上层用一些脚本语言比如PiG、HIVE。现在有些开源系统,比如社交关系网的图形软件,在这些应用的基础上微软加入了JavaScript等。现在微软又加了ODBC,excel、powerview这些现有的微软应用可以访问这些数据。
Windows Azure如何存储数据?
HDFS在Windows Azure上运行,微软已将HDFS的API进行了扩展,使得它可以访问Azure  storage和Azure  Blob  Storage。企业选择大数据平台要尽可能选择廉价的平台。便宜的同时也得保证安全。Azure  storage不仅便宜,而且具有三个备份,加上三个异地备份,总共六个备份。
云服务公司不能总说自己产品的可靠性是“99.9999%”。云服务需要绝对的高保证,云服务不仅包括存储硬盘的可靠性,还包括机架、电、网络、bulding等等。“99.9999%”没有任何说服力,徐明强表示,微软Windows  Azure从上线至今从未丢过一个字节的数据,Windows  Azure不光廉价,而且数据绝对安全。

利用hdfs搭建网盘–webserver开发

利用hdfs搭建网盘–webserver开发,描述下实现思路:
1、网盘系统中的webserver是用来给用户提供操作界面,接收用户指令,完成文件上传、下载、图片上传、下载和图片预览功能的。
2、其中关于存储相关的功能都是调用hdfs API来完成,而关于文件的相关结构化信息都存储在mysql关系型数据库中;
3、webserver起到的是连接客户和hdfs的作用
4、采用的是SSH框架(Struts2、spring、hibernate)、数据库为mysql,数据模型请参考:利用hdfs搭建网盘–数据模型设计
5、web调用hdfs API的思路是:利用java运行时 运行java jar包,可参考《利用HDFS java API增删改查操作》,例如:

process = Runtime.getRuntime().exec("java -jar /root/hdfs-0.0.1-SNAPSHOT.jar read "+fileInfo.getFilePath()+" /root/file-tmp/"+fileInfo.getFileName());

文件列表页面:

@Action(value = "right", results = { @Result(name = "success", location = "/WEB-INF/npage/right.jsp") })
	public String right() {
		HttpSession session = this.getRequest().getSession();
		User user = (User) session.getAttribute("user");
		if (user != null) {
			page = fileInfoServie.queryUserFileList(0, 20, user.getUserId());
		}
		return "success";
	}

文件下载:

@Action(value = "downloadFile", results = { @Result(name = "success", location = "/right", type = "redirectAction") })
	public String downloadFile(){
		// 获取用户信息
		HttpSession session = this.getRequest().getSession();
		User user = (User) session.getAttribute("user");
		//查出要删除的文件信息
		String fileId = getRequest().getParameter("fileId");
		List<FileInfo> lists = fileInfoServie.findBy("fileId", Long.parseLong(fileId), PropertyFilter.MatchType.EQ);
		FileInfo fileInfo = new FileInfo();
		if(lists != null && lists.size() > 0){
			fileInfo = lists.get(0);
		}
		//路径
		String path = "/root/file-tmp/"+fileInfo.getFileName();
		// 从hdfs取得文件
		Process process;
		try {
			process = Runtime.getRuntime().exec("java -jar /root/hdfs-0.0.1-SNAPSHOT.jar read "+fileInfo.getFilePath()+" /root/file-tmp/"+fileInfo.getFileName());
			InputStreamReader ir = new InputStreamReader(process.getInputStream());
			LineNumberReader input = new LineNumberReader(ir);
			String line;
			while ((line = input.readLine()) != null)
				System.out.println(line);
		} catch (IOException e) {
			e.printStackTrace();
		}
		 try {
            // path是指欲下载的文件的路径。
            File file = new File(path);
            // 取得文件名。
            String filename = file.getName();
            // 取得文件的后缀名。
            String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();
            // 以流的形式下载文件。
            InputStream fis = new BufferedInputStream(new FileInputStream(path));
            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            fis.close();
            // 清空response
            this.getResponse().reset();
            // 设置response的Header
            this.getResponse().addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes()));
            this.getResponse().addHeader("Content-Length", "" + file.length());
            OutputStream toClient = new BufferedOutputStream(this.getResponse().getOutputStream());
            this.getResponse().setContentType("application/octet-stream");
            toClient.write(buffer);
            toClient.flush();
            toClient.close();
	        } catch (IOException ex) {
	            ex.printStackTrace();
	        }
		return null;
	}

删除文件:

@Action(value = "deleteFile", results = { @Result(name = "success", location = "/right", type = "redirectAction") })
	public String deleteFile(){
		// 获取用户信息
		HttpSession session = this.getRequest().getSession();
		User user = (User) session.getAttribute("user");
		//查出要删除的文件信息
		String fileId = getRequest().getParameter("fileId");
		List<FileInfo> lists = fileInfoServie.findBy("fileId", Long.parseLong(fileId), PropertyFilter.MatchType.EQ);
		FileInfo fileInfo = new FileInfo();
		if(lists != null && lists.size() > 0){
			fileInfo = lists.get(0);
		}
		// 将文件从hadoop集群删除
		Process process;
		try {
			process = Runtime.getRuntime().exec("java -jar /root/hdfs-0.0.1-SNAPSHOT.jar delete "+fileInfo.getFilePath());
			InputStreamReader ir = new InputStreamReader(process.getInputStream());
			LineNumberReader input = new LineNumberReader(ir);
			String line;
			while ((line = input.readLine()) != null)
				System.out.println(line);
		} catch (IOException e) {
			e.printStackTrace();
		}
		//从数据库删除
		fileInfoServie.deleteById(fileInfo.getId());
		return "success";
	}

照片列表:

@Action(value = "goPicPage", results = { @Result(name = "success", location = "/WEB-INF/npage/pic-right.jsp") })
	public String goPicPage() {
		HttpSession session = this.getRequest().getSession();
		User user = (User) session.getAttribute("user");
		if (user != null) {
			page = fileInfoServie.queryPicFileList(0, 20, user.getUserId());
		}
		return "success";
	}

上传文件或者图片:

@Action(value = "uploadFile", results = { @Result(name = "success", location = "/right", type = "redirectAction") })
	public String uploadFile() throws IOException {
		// 获取用户信息
		HttpSession session = this.getRequest().getSession();
		User user = (User) session.getAttribute("user");
		boolean isPic = false;
		if (file_name.indexOf(".jpg") > 0 || file_name.indexOf(".gif") > 0) {
			isPic = true;
		}
		// 接收文件
		String path = "";
		if (null != file_name && !file_name.equals("")) {
			path = fileInfoServie.saveFile(methodFile, file_name);
		}
		String fileName = "";
		String[] strArr = path.split("/");
		if (strArr != null && strArr.length > 0) {
			fileName = strArr[strArr.length - 1];
		}
		// 将文件上传到hadoop集群
		Process process;
		try {
			process = Runtime.getRuntime().exec(
					"java -jar /root/hdfs-0.0.1-SNAPSHOT.jar upload " + path + " hdfs://hadoopm:9000/user/root/upload/"
							+ user.getUserName() + "/" + fileName);
			InputStreamReader ir = new InputStreamReader(process.getInputStream());
			LineNumberReader input = new LineNumberReader(ir);
			String line;
			while ((line = input.readLine()) != null)
				System.out.println(line);
		} catch (IOException e) {
			e.printStackTrace();
		}
		FileInfo fileInfo = new FileInfo();
		fileInfo.setCreateTime(new Date());
		fileInfo.setFileName(this.file_name);
		fileInfo.setFilePath("hdfs://hadoopm:9000/user/root/upload/" + user.getUserName() + "/" + fileName);
		File fileTemp = new File(path);
		fileInfo.setFileSize((fileTemp.length() / 1024) > 1 ? (fileTemp.length() / 1024) : 1);
		//判断是否为图片
		if (isPic) {
			fileInfo.setFileType(1);// 0 :普通文件 1:图片
			String tempPath = "/root/" + user.getUserName() + "/"+ System.currentTimeMillis() + "/" + this.file_name;
			ImageScale.resizeFix(new File(path),new File(tempPath), 250, 250);
			fileInfo.setImg(tempPath);
		} else {
			fileInfo.setFileType(0);
		}
		fileInfo.setUserId(user.getUserId());
		fileInfo.setFpos(null);
		fileInfo.setFileId(System.currentTimeMillis());
		fileInfoServie.save(fileInfo);
		return "success";
	}

获取缩略图:

@Action(value = "getsImg")
	public String getsImg() throws IOException {
		String fileId = getRequest().getParameter("fileId");
		List<FileInfo> lists = fileInfoServie.findBy("fileId", Long.parseLong(fileId), PropertyFilter.MatchType.EQ);
		FileInfo fileInfo = new FileInfo();
		if(lists != null && lists.size() > 0){
			fileInfo = lists.get(0);
		}
		FileInputStream is = new FileInputStream(fileInfo.getImg());
		int i = is.available(); // 得到文件大小
		byte data[] = new byte[i];
		is.read(data); // 读数据
		is.close();
		this.getResponse().setContentType("image/*"); // 设置返回的文件类型
		OutputStream toClient = this.getResponse().getOutputStream(); // 得到向客户端输出二进制数据的对象
		toClient.write(data); // 输出数据
		toClient.close();
		return null;
	}

获取大图:

@Action(value = "getbImg")
	public String getbImg() throws IOException{
		// 获取用户信息
		HttpSession session = this.getRequest().getSession();
		User user = (User) session.getAttribute("user");
		//查出要删除的文件信息
		String fileId = getRequest().getParameter("fileId");
		List<FileInfo> lists = fileInfoServie.findBy("fileId", Long.parseLong(fileId), PropertyFilter.MatchType.EQ);
		FileInfo fileInfo = new FileInfo();
		if(lists != null && lists.size() > 0){
			fileInfo = lists.get(0);
		}
		//路径
		String path = "/root/file-tmp/bpic/"+fileInfo.getFileName();
		// 从hdfs取得文件
		Process process;
		try {
			process = Runtime.getRuntime().exec("java -jar /root/hdfs-0.0.1-SNAPSHOT.jar read "+fileInfo.getFilePath()+" /root/file-tmp/bpic/"+fileInfo.getFileName());
			InputStreamReader ir = new InputStreamReader(process.getInputStream());
			LineNumberReader input = new LineNumberReader(ir);
			String line;
			while ((line = input.readLine()) != null)
				System.out.println(line);
		} catch (IOException e) {
			e.printStackTrace();
		}
		File f = new File(path);
        if (!f.exists()) {
            this.getResponse().sendError(404, "File not found!");
            return null;
        }
        BufferedInputStream br = new BufferedInputStream(new FileInputStream(f));
        byte[] buf = new byte[1024];
        int len = 0;
        this.getResponse().reset(); // 非常重要
        // 在线打开方式
        URL u = new URL("file:///" + path);
        this.getResponse().setContentType(u.openConnection().getContentType());
        this.getResponse().setHeader("Content-Disposition", "inline; filename=" + f.getName());
        // 文件名应该编码成UTF-8
        OutputStream out = this.getResponse().getOutputStream();
        while ((len = br.read(buf)) > 0)
            out.write(buf, 0, len);
        br.close();
        out.close();
		return null;
	}

完整Action类如下:

package org.nbc.storage.file.action;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.io.OutputStream;
import java.net.URL;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import org.nbc.storage.common.action.BaseAction;
import org.nbc.storage.common.util.ImageScale;
import org.nbc.storage.file.model.FileInfo;
import org.nbc.storage.file.service.FileInfoServie;
import org.nbc.storage.user.model.User;
import com.sitech.core.orm.PropertyFilter;
import com.sitech.core.utils.Page;
public class FileAction extends BaseAction {
	private static final long serialVersionUID = 1L;
	private Page page;
	private String file_name;
	private File methodFile;
	/** 下载需要的 */
	private InputStream inputStream;
	private String downloadFileName;
	@Resource
	public FileInfoServie fileInfoServie;
	@Action(value = "files", results = { @Result(name = "success", location = "/WEB-INF/npage/main.jsp") })
	public String userFileList() {
		return "success";
	}
	@Action(value = "top", results = { @Result(name = "success", location = "/WEB-INF/npage/top.jsp") })
	public String top() {
		return "success";
	}
	@Action(value = "left", results = { @Result(name = "success", location = "/WEB-INF/npage/left.jsp") })
	public String left() {
		return "success";
	}
	@Action(value = "right_top", results = { @Result(name = "success", location = "/WEB-INF/npage/right_top.jsp") })
	public String right_top() {
		return "success";
	}
	@Action(value = "right", results = { @Result(name = "success", location = "/WEB-INF/npage/right.jsp") })
	public String right() {
		HttpSession session = this.getRequest().getSession();
		User user = (User) session.getAttribute("user");
		if (user != null) {
			page = fileInfoServie.queryUserFileList(0, 20, user.getUserId());
		}
		return "success";
	}
	/**
	 *
	 * 下载文件.
	 *
	 * @return
	 */
	@Action(value = "downloadFile", results = { @Result(name = "success", location = "/right", type = "redirectAction") })
	public String downloadFile(){
		// 获取用户信息
		HttpSession session = this.getRequest().getSession();
		User user = (User) session.getAttribute("user");
		//查出要删除的文件信息
		String fileId = getRequest().getParameter("fileId");
		List lists = fileInfoServie.findBy("fileId", Long.parseLong(fileId), PropertyFilter.MatchType.EQ);
		FileInfo fileInfo = new FileInfo();
		if(lists != null && lists.size() > 0){
			fileInfo = lists.get(0);
		}
		//路径
		String path = "/root/file-tmp/"+fileInfo.getFileName();
		// 从hdfs取得文件
		Process process;
		try {
			process = Runtime.getRuntime().exec("java -jar /root/hdfs-0.0.1-SNAPSHOT.jar read "+fileInfo.getFilePath()+" /root/file-tmp/"+fileInfo.getFileName());
			InputStreamReader ir = new InputStreamReader(process.getInputStream());
			LineNumberReader input = new LineNumberReader(ir);
			String line;
			while ((line = input.readLine()) != null)
				System.out.println(line);
		} catch (IOException e) {
			e.printStackTrace();
		}
		 try {
            // path是指欲下载的文件的路径。
            File file = new File(path);
            // 取得文件名。
            String filename = file.getName();
            // 取得文件的后缀名。
            String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();
            // 以流的形式下载文件。
            InputStream fis = new BufferedInputStream(new FileInputStream(path));
            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            fis.close();
            // 清空response
            this.getResponse().reset();
            // 设置response的Header
            this.getResponse().addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes()));
            this.getResponse().addHeader("Content-Length", "" + file.length());
            OutputStream toClient = new BufferedOutputStream(this.getResponse().getOutputStream());
            this.getResponse().setContentType("application/octet-stream");
            toClient.write(buffer);
            toClient.flush();
            toClient.close();
	        } catch (IOException ex) {
	            ex.printStackTrace();
	        }
		return null;
	}
	/**
	 *
	 * 删除文件.
	 *
	 * @return
	 */
	@Action(value = "deleteFile", results = { @Result(name = "success", location = "/right", type = "redirectAction") })
	public String deleteFile(){
		// 获取用户信息
		HttpSession session = this.getRequest().getSession();
		User user = (User) session.getAttribute("user");
		//查出要删除的文件信息
		String fileId = getRequest().getParameter("fileId");
		List lists = fileInfoServie.findBy("fileId", Long.parseLong(fileId), PropertyFilter.MatchType.EQ);
		FileInfo fileInfo = new FileInfo();
		if(lists != null && lists.size() > 0){
			fileInfo = lists.get(0);
		}
		// 将文件从hadoop集群删除
		Process process;
		try {
			process = Runtime.getRuntime().exec("java -jar /root/hdfs-0.0.1-SNAPSHOT.jar delete "+fileInfo.getFilePath());
			InputStreamReader ir = new InputStreamReader(process.getInputStream());
			LineNumberReader input = new LineNumberReader(ir);
			String line;
			while ((line = input.readLine()) != null)
				System.out.println(line);
		} catch (IOException e) {
			e.printStackTrace();
		}
		//从数据库删除
		fileInfoServie.deleteById(fileInfo.getId());
		return "success";
	}
	@Action(value = "goUploadPage", results = { @Result(name = "success", location = "/WEB-INF/npage/upload-right.jsp") })
	public String goUploadPage() {
		return "success";
	}
	@Action(value = "goPicPage", results = { @Result(name = "success", location = "/WEB-INF/npage/pic-right.jsp") })
	public String goPicPage() {
		HttpSession session = this.getRequest().getSession();
		User user = (User) session.getAttribute("user");
		if (user != null) {
			page = fileInfoServie.queryPicFileList(0, 20, user.getUserId());
		}
		return "success";
	}
	/**
	 *
	 * 上传文件或图片.
	 *
	 * @return
	 * @throws IOException
	 */
	@Action(value = "uploadFile", results = { @Result(name = "success", location = "/right", type = "redirectAction") })
	public String uploadFile() throws IOException {
		// 获取用户信息
		HttpSession session = this.getRequest().getSession();
		User user = (User) session.getAttribute("user");
		boolean isPic = false;
		if (file_name.indexOf(".jpg") > 0 || file_name.indexOf(".gif") > 0) {
			isPic = true;
		}
		// 接收文件
		String path = "";
		if (null != file_name && !file_name.equals("")) {
			path = fileInfoServie.saveFile(methodFile, file_name);
		}
		String fileName = "";
		String[] strArr = path.split("/");
		if (strArr != null && strArr.length > 0) {
			fileName = strArr[strArr.length - 1];
		}
		// 将文件上传到hadoop集群
		Process process;
		try {
			process = Runtime.getRuntime().exec(
					"java -jar /root/hdfs-0.0.1-SNAPSHOT.jar upload " + path + " hdfs://hadoopm:9000/user/root/upload/"
							+ user.getUserName() + "/" + fileName);
			InputStreamReader ir = new InputStreamReader(process.getInputStream());
			LineNumberReader input = new LineNumberReader(ir);
			String line;
			while ((line = input.readLine()) != null)
				System.out.println(line);
		} catch (IOException e) {
			e.printStackTrace();
		}
		FileInfo fileInfo = new FileInfo();
		fileInfo.setCreateTime(new Date());
		fileInfo.setFileName(this.file_name);
		fileInfo.setFilePath("hdfs://hadoopm:9000/user/root/upload/" + user.getUserName() + "/" + fileName);
		File fileTemp = new File(path);
		fileInfo.setFileSize((fileTemp.length() / 1024) > 1 ? (fileTemp.length() / 1024) : 1);
		//判断是否为图片
		if (isPic) {
			fileInfo.setFileType(1);// 0 :普通文件 1:图片
			String tempPath = "/root/" + user.getUserName() + "/"+ System.currentTimeMillis() + "/" + this.file_name;
			ImageScale.resizeFix(new File(path),new File(tempPath), 250, 250);
			fileInfo.setImg(tempPath);
		} else {
			fileInfo.setFileType(0);
		}
		fileInfo.setUserId(user.getUserId());
		fileInfo.setFpos(null);
		fileInfo.setFileId(System.currentTimeMillis());
		fileInfoServie.save(fileInfo);
		return "success";
	}
	/**
	 *
	 * 获取缩略图.
	 *
	 * @return
	 * @throws IOException
	 */
	@Action(value = "getsImg")
	public String getsImg() throws IOException {
		String fileId = getRequest().getParameter("fileId");
		List lists = fileInfoServie.findBy("fileId", Long.parseLong(fileId), PropertyFilter.MatchType.EQ);
		FileInfo fileInfo = new FileInfo();
		if(lists != null && lists.size() > 0){
			fileInfo = lists.get(0);
		}
		FileInputStream is = new FileInputStream(fileInfo.getImg());
		int i = is.available(); // 得到文件大小
		byte data[] = new byte[i];
		is.read(data); // 读数据
		is.close();
		this.getResponse().setContentType("image/*"); // 设置返回的文件类型
		OutputStream toClient = this.getResponse().getOutputStream(); // 得到向客户端输出二进制数据的对象
		toClient.write(data); // 输出数据
		toClient.close();
		return null;
	}
	/**
	 *
	 * 获取大图.
	 *
	 * @return
	 * @throws IOException
	 */
	@Action(value = "getbImg")
	public String getbImg() throws IOException{
		// 获取用户信息
		HttpSession session = this.getRequest().getSession();
		User user = (User) session.getAttribute("user");
		//查出要删除的文件信息
		String fileId = getRequest().getParameter("fileId");
		List lists = fileInfoServie.findBy("fileId", Long.parseLong(fileId), PropertyFilter.MatchType.EQ);
		FileInfo fileInfo = new FileInfo();
		if(lists != null && lists.size() > 0){
			fileInfo = lists.get(0);
		}
		//路径
		String path = "/root/file-tmp/bpic/"+fileInfo.getFileName();
		// 从hdfs取得文件
		Process process;
		try {
			process = Runtime.getRuntime().exec("java -jar /root/hdfs-0.0.1-SNAPSHOT.jar read "+fileInfo.getFilePath()+" /root/file-tmp/bpic/"+fileInfo.getFileName());
			InputStreamReader ir = new InputStreamReader(process.getInputStream());
			LineNumberReader input = new LineNumberReader(ir);
			String line;
			while ((line = input.readLine()) != null)
				System.out.println(line);
		} catch (IOException e) {
			e.printStackTrace();
		}
		File f = new File(path);
        if (!f.exists()) {
            this.getResponse().sendError(404, "File not found!");
            return null;
        }
        BufferedInputStream br = new BufferedInputStream(new FileInputStream(f));
        byte[] buf = new byte[1024];
        int len = 0;
        this.getResponse().reset(); // 非常重要
        // 在线打开方式
        URL u = new URL("file:///" + path);
        this.getResponse().setContentType(u.openConnection().getContentType());
        this.getResponse().setHeader("Content-Disposition", "inline; filename=" + f.getName());
        // 文件名应该编码成UTF-8
        OutputStream out = this.getResponse().getOutputStream();
        while ((len = br.read(buf)) > 0)
            out.write(buf, 0, len);
        br.close();
        out.close();
		return null;
	}
	public FileInfoServie getFileInfoServie() {
		return fileInfoServie;
	}
	public void setFileInfoServie(FileInfoServie fileInfoServie) {
		this.fileInfoServie = fileInfoServie;
	}
	public Page getPage() {
		return page;
	}
	public void setPage(Page page) {
		this.page = page;
	}
	public String getFile_name() {
		return file_name;
	}
	public void setFile_name(String file_name) {
		this.file_name = file_name;
	}
	public File getMethodFile() {
		return methodFile;
	}
	public void setMethodFile(File methodFile) {
		this.methodFile = methodFile;
	}
	public String getDownloadFileName() {
		return downloadFileName;
	}
	public void setDownloadFileName(String downloadFileName) {
		this.downloadFileName = downloadFileName;
	}
	public void setInputStream(InputStream inputStream) {
		this.inputStream = inputStream;
	}
	@Action(value = "filelist", results = { @Result(name = "success", location = "/WEB-INF/npage/filelist.jsp") })
	public String filelist() {
//		HttpSession session = this.getRequest().getSession();
//		User user = (User) session.getAttribute("user");
//		if (user != null) {
			page = fileInfoServie.queryUserFileList(0, 20, 1L);
//		}
		return "success";
	}
	@Action(value = "goUploadPageCC", results = { @Result(name = "success", location = "/WEB-INF/npage/goUploadPageCC.jsp") })
	public String goUploadPageCC() {
		return "success";
	}
	@Action(value = "uploadFileCC", results = { @Result(name = "success", location = "/filelist", type = "redirectAction") })
	public String uploadFileCC() throws IOException {
		// 获取用户信息
		HttpSession session = this.getRequest().getSession();
		User user = (User) session.getAttribute("user");
		boolean isPic = false;
		if (file_name.indexOf(".jpg") > 0 || file_name.indexOf(".gif") > 0) {
			isPic = true;
		}
		// 接收文件
		String path = "";
		if (null != file_name && !file_name.equals("")) {
			path = fileInfoServie.saveFile(methodFile, file_name);
		}
		String fileName = "";
		String[] strArr = path.split("/");
		if (strArr != null && strArr.length > 0) {
			fileName = strArr[strArr.length - 1];
		}
		// 将文件上传到hadoop集群
		Process process;
		try {
			process = Runtime.getRuntime().exec(
					"java -jar /root/hdfs-0.0.1-SNAPSHOT.jar upload " + path + " hdfs://hadoopm:9000/user/root/upload/"
							+ "lisn" + "/" + fileName);
			InputStreamReader ir = new InputStreamReader(process.getInputStream());
			LineNumberReader input = new LineNumberReader(ir);
			String line;
			while ((line = input.readLine()) != null)
				System.out.println(line);
		} catch (IOException e) {
			e.printStackTrace();
		}
		FileInfo fileInfo = new FileInfo();
		fileInfo.setCreateTime(new Date());
		fileInfo.setFileName(this.file_name);
		fileInfo.setFilePath("hdfs://hadoopm:9000/user/root/upload/" +"lisn" + "/" + fileName);
		File fileTemp = new File(path);
		fileInfo.setFileSize((fileTemp.length() / 1024) > 1 ? (fileTemp.length() / 1024) : 1);
		//判断是否为图片
		if (isPic) {
			fileInfo.setFileType(1);// 0 :普通文件 1:图片
			String tempPath = "/root/" + "lisn" + "/"+ System.currentTimeMillis() + "/" + this.file_name;
			ImageScale.resizeFix(new File(path),new File(tempPath), 250, 250);
			fileInfo.setImg(tempPath);
		} else {
			fileInfo.setFileType(0);
		}
		fileInfo.setUserId(1L);
		fileInfo.setFpos(null);
		fileInfo.setFileId(System.currentTimeMillis());
		fileInfoServie.save(fileInfo);
		return "success";
	}
}

完整services:

package org.nbc.storage.file.service.impl;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import javax.annotation.Resource;
import org.nbc.storage.file.model.FileInfo;
import org.nbc.storage.file.service.FileInfoServie;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.sitech.core.orm.BaseDAO;
import com.sitech.core.service.impl.BaseServiceImpl;
import com.sitech.core.utils.Page;
@Service("fileInfoServie")
@Transactional
public class FileInfoServieImpl extends BaseServiceImpl<FileInfo, Long> implements FileInfoServie {
	private static int BUFFER_SIZE = 16 * 1024;
	@Resource(name = "fileInfoDAO")
	public void setBaseDAO(BaseDAO<FileInfo, Long> baseDAO) {
		super.setBaseDAO(baseDAO);
	}
	@Override
	public Page<FileInfo> queryUserFileList(int pageNo,
			int pageSize, Long userId) {
		String hql = " from FileInfo where userId = ? order by createTime desc ";
		Page<FileInfo> page = new Page<FileInfo>(pageSize);
		page.setPageNo(pageNo);
		return this.getBaseDAO().findPage(page, hql, userId);
	}
	public long copyFile(File src, File dest) throws Exception {
		BufferedInputStream in = null;
		BufferedOutputStream out = null;
		byte[] buffer = new byte[BUFFER_SIZE];
		long total = 0;
		try {
			in = new BufferedInputStream(new FileInputStream(src), BUFFER_SIZE);
			out = new BufferedOutputStream(new FileOutputStream(dest),
					BUFFER_SIZE);
			int curSize = in.read(buffer);
			while (curSize > 0) {
				total += curSize;
				out.write(buffer, 0, curSize);
				curSize = in.read(buffer);
			}
		} catch (Exception e) {
		} finally {
			try {
				if (in != null) {
					in.close();
					in = null;
				}
				if (out != null) {
					out.close();
					out = null;
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return total;
	}
	public String saveFile(File methodFile,String file_name){
		String savePath = "/root/lisn/";
		String middlePath = "";
		String separator = "/";
		String [] strArr = file_name.split("\.");
		if(strArr != null && strArr.length > 0){
			file_name = strArr[strArr.length-1];
		}
		//创建filename
		file_name = System.currentTimeMillis() + "."+file_name;
		File f = new File(savePath);
		if (!f.exists()) {
			f.mkdirs();
		}
		File file = new File(savePath+file_name);
		try {
			file.createNewFile();
			long total = copyFile(methodFile, file);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return savePath+file_name;
	}
	@Override
	public Page<FileInfo> queryPicFileList(int pageNo, int pageSize, Long userId) {
		String hql = " from FileInfo where userId = ? and fileType = 1 order by createTime desc ";
		Page<FileInfo> page = new Page<FileInfo>(pageSize);
		page.setPageNo(pageNo);
		return this.getBaseDAO().findPage(page, hql, userId);
	}
}

展示图片预览页面:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<style type="text/css">
<!--
.STYLE1 {font-size: 12px}
.STYLE3 {color: #707070; font-size: 12px; }
.STYLE5 {color: #0a6e0c; font-size: 12px; }
body {
	margin-top: 0px;
	margin-bottom: 0px;
}
.STYLE7 {font-size: 12}
-->
</style>
</head>
<body>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td height="30"><table width="100%" border="0" cellspacing="0" cellpadding="0">
      <tr>
        <td>&nbsp;</td>
        <td style="padding-right:10px;"><div align="right">
          <table border="0" align="right" cellpadding="0" cellspacing="0">
            <tr>
              <td width="60"><table width="87%" border="0" cellpadding="0" cellspacing="0">
                  <tr>
                   <!--  <td class="STYLE1"><div align="center">
                        <input type="checkbox" name="checkbox62" value="checkbox" />
                    </div></td>-->
                    <td class="STYLE1" onclick="window.location.href='<%=request.getContextPath() %>/wangpan-web/goPicPage'"><div align="center" style="cursor:pointer;">图片列表</div></td>
                  </tr>
              </table></td>
              <td width="60"><table width="90%" border="0" cellpadding="0" cellspacing="0">
                  <tr>
                  <!--   <td class="STYLE1"><div align="center"><img src="<%=request.getContextPath() %>/images/001.gif" width="14" height="14" /></div></td> -->
                    <td class="STYLE1" onclick="window.location.href='<%=request.getContextPath() %>/wangpan-web/goUploadPage'"><div align="center" style="cursor:pointer;">上传文件</div></td>
                  </tr>
              </table></td>
              <td width="60"><table width="90%" border="0" cellpadding="0" cellspacing="0">
                  <tr>
                   <!--  <td class="STYLE1"><div align="center"><img src="<%=request.getContextPath() %>/images/114.gif" width="14" height="14" /></div></td> -->
                    <td class="STYLE1" onclick="window.location.href='<%=request.getContextPath() %>/wangpan-web/right'"><div align="center" style="cursor:pointer;">文件列表</div></td>
                  </tr>
              </table></td>
              <!--
              <td width="52"><table width="88%" border="0" cellpadding="0" cellspacing="0">
                  <tr>
                    <td class="STYLE1"><div align="center"><img src="<%=request.getContextPath() %>/images/083.gif" width="14" height="14" /></div></td>
                    <td class="STYLE1"><div align="center">删除</div></td>
                  </tr>
              </table></td>
               -->
            </tr>
          </table>
        </div></td>
      </tr>
    </table></td>
  </tr>
  <tr>
    <td><table width="100%" border="0" cellpadding="0" cellspacing="1" bgcolor="#c9c9c9">
      <tr>
        <td height="22" bgcolor="#FFFFFF" width="50%"><div align="center"><strong><span class="STYLE1">图片预览</span></strong></div></td>
      </tr>
      <s:iterator value="page.result" var="file">
      <tr>
        <td height="22" bgcolor="#FFFFFF" width="50%"><div align="center"><span class="STYLE3" style="cursor:pointer;"><img onclick="window.open('http://192.168.75.142:8080/wangpan-web/getbImg?fileId=<s:property value="fileId" />');" title="点击查看大图" alt="<s:property value="fileName" />" src="http://192.168.75.142:8080/wangpan-web/getsImg?fileId=<s:property value="fileId" />" >  </span></div></td>
      </tr>
      </s:iterator>
    </table></td>
  </tr>
  <tr>
    <td height="35"><table width="100%" border="0" cellspacing="0" cellpadding="0">
      <tr>
        <td width="25%" height="29" nowrap="nowrap"><table width="342" border="0" cellspacing="0" cellpadding="0">
          <tr>
            <td width="44%" class="STYLE1">当前页:1/2页 每页
              <input name="textfield2" type="text" class="STYLE1" style="height:14px; width:25px;" value="15" size="5" />            </td>
            <td width="14%" class="STYLE1"><img src="<%=request.getContextPath() %>/images/sz.gif" width="43" height="20" /></td>
            <td width="42%" class="STYLE1"><span class="STYLE7">数据总量 15 </span></td>
          </tr>
        </table></td>
        <td width="75%" valign="top" class="STYLE1"><div align="right">
            <table width="352" height="20" border="0" cellpadding="0" cellspacing="0">
              <tr>
                <td width="62" height="22" valign="middle"><div align="right"><img src="<%=request.getContextPath() %>/images/page_first_1.gif" width="48" height="20" /></div></td>
                <td width="50" height="22" valign="middle"><div align="right"><img src="<%=request.getContextPath() %>/images/page_back_1.gif" width="55" height="20" /></div></td>
                <td width="54" height="22" valign="middle"><div align="right"><img src="<%=request.getContextPath() %>/images/page_next.gif" width="58" height="20" /></div></td>
                <td width="49" height="22" valign="middle"><div align="right"><img src="<%=request.getContextPath() %>/images/page_last.gif" width="52" height="20" /></div></td>
                <td width="59" height="22" valign="middle"><div align="right">转到第</div></td>
                <td width="25" height="22" valign="middle"><span class="STYLE7">
                  <input name="textfield" type="text" class="STYLE1" style="height:10px; width:25px;" size="5" />
                </span></td>
                <td width="23" height="22" valign="middle">页</td>
                <td width="30" height="22" valign="middle"><img src="<%=request.getContextPath() %>/images/go.gif" width="26" height="20" /></td>
              </tr>
            </table>
        </div></td>
      </tr>
    </table></td>
  </tr>
</table>
</body>
</html>

文件列表页:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<style type="text/css">
<!--
.STYLE1 {font-size: 12px}
.STYLE3 {color: #707070; font-size: 12px; }
.STYLE5 {color: #0a6e0c; font-size: 12px; }
body {
	margin-top: 0px;
	margin-bottom: 0px;
}
.STYLE7 {font-size: 12}
-->
</style>
</head>
<body>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td height="30"><table width="100%" border="0" cellspacing="0" cellpadding="0">
      <tr>
        <td>&nbsp;</td>
        <td style="padding-right:10px;"><div align="right">
          <table border="0" align="right" cellpadding="0" cellspacing="0">
            <tr>
              <td width="60"><table width="87%" border="0" cellpadding="0" cellspacing="0">
                  <tr>
                   <!--  <td class="STYLE1"><div align="center">
                        <input type="checkbox" name="checkbox62" value="checkbox" />
                    </div></td>-->
                    <td class="STYLE1" onclick="window.location.href='<%=request.getContextPath() %>/wangpan-web/goPicPage'"><div align="center" style="cursor:pointer;">图片列表</div></td>
                  </tr>
              </table></td>
              <td width="60"><table width="90%" border="0" cellpadding="0" cellspacing="0">
                  <tr>
                  <!--   <td class="STYLE1"><div align="center"><img src="<%=request.getContextPath() %>/images/001.gif" width="14" height="14" /></div></td> -->
                    <td class="STYLE1" onclick="window.location.href='<%=request.getContextPath() %>/wangpan-web/goUploadPage'"><div align="center" style="cursor:pointer;">上传文件</div></td>
                  </tr>
              </table></td>
              <td width="60"><table width="90%" border="0" cellpadding="0" cellspacing="0">
                  <tr>
                   <!--  <td class="STYLE1"><div align="center"><img src="<%=request.getContextPath() %>/images/114.gif" width="14" height="14" /></div></td> -->
                    <td class="STYLE1" onclick="window.location.href='<%=request.getContextPath() %>/wangpan-web/right'"><div align="center" style="cursor:pointer;">文件列表</div></td>
                  </tr>
              </table></td>
              <!--
              <td width="52"><table width="88%" border="0" cellpadding="0" cellspacing="0">
                  <tr>
                    <td class="STYLE1"><div align="center"><img src="<%=request.getContextPath() %>/images/083.gif" width="14" height="14" /></div></td>
                    <td class="STYLE1"><div align="center">删除</div></td>
                  </tr>
              </table></td>
               -->
            </tr>
          </table>
        </div></td>
      </tr>
    </table></td>
  </tr>
  <tr>
    <td><table width="100%" border="0" cellpadding="0" cellspacing="1" bgcolor="#c9c9c9">
      <tr>
        <td height="22" bgcolor="#FFFFFF" width="50%"><div align="center"><strong><span class="STYLE1">文件名</span></strong></div></td>
        <td height="22" bgcolor="#FFFFFF"><div align="center"><strong><span class="STYLE1">大小</span></strong></div></td>
        <td height="22" bgcolor="#FFFFFF"><div align="center"><strong><span class="STYLE1">上传日期</span></strong></div></td>
        <td height="22" bgcolor="#FFFFFF"><div align="center"><strong><span class="STYLE1">操作</span></strong></div></td>
      </tr>
      <s:iterator value="page.result" var="file">
      <tr>
        <td height="22" bgcolor="#FFFFFF" width="50%"><div align="center"><span class="STYLE3"><s:property value="fileName" /></span></div></td>
        <td height="22" bgcolor="#FFFFFF"><div align="center"><span class="STYLE3"><s:property value="fileSize" />&nbsp;KB</span></div></td>
        <td height="22" bgcolor="#FFFFFF"><div align="center"><span class="STYLE3"><s:date name="createTime" format="yyyy-MM-dd HH:mm" /></span></div></td>
        <td height="22" bgcolor="#FFFFFF">
        	<div align="center">
        		<span style="cursor:pointer;" class="STYLE3" onclick="window.location.href='<%=request.getContextPath() %>/wangpan-web/deleteFile?fileId=<s:property value="fileId" />'">删除</span>
        		<span style="cursor:pointer;" class="STYLE3" onclick="window.open('<%=request.getContextPath() %>/wangpan-web/downloadFile?fileId=<s:property value="fileId" />');">下载</span>
        		</div>
        </td>
      </tr>
      </s:iterator>
    </table></td>
  </tr>
  <tr>
    <td height="35"><table width="100%" border="0" cellspacing="0" cellpadding="0">
      <tr>
        <td width="25%" height="29" nowrap="nowrap"><table width="342" border="0" cellspacing="0" cellpadding="0">
          <tr>
            <td width="44%" class="STYLE1">当前页:1/2页 每页
              <input name="textfield2" type="text" class="STYLE1" style="height:14px; width:25px;" value="15" size="5" />            </td>
            <td width="14%" class="STYLE1"><img src="<%=request.getContextPath() %>/images/sz.gif" width="43" height="20" /></td>
            <td width="42%" class="STYLE1"><span class="STYLE7">数据总量 15 </span></td>
          </tr>
        </table></td>
        <td width="75%" valign="top" class="STYLE1"><div align="right">
            <table width="352" height="20" border="0" cellpadding="0" cellspacing="0">
              <tr>
                <td width="62" height="22" valign="middle"><div align="right"><img src="<%=request.getContextPath() %>/images/page_first_1.gif" width="48" height="20" /></div></td>
                <td width="50" height="22" valign="middle"><div align="right"><img src="<%=request.getContextPath() %>/images/page_back_1.gif" width="55" height="20" /></div></td>
                <td width="54" height="22" valign="middle"><div align="right"><img src="<%=request.getContextPath() %>/images/page_next.gif" width="58" height="20" /></div></td>
                <td width="49" height="22" valign="middle"><div align="right"><img src="<%=request.getContextPath() %>/images/page_last.gif" width="52" height="20" /></div></td>
                <td width="59" height="22" valign="middle"><div align="right">转到第</div></td>
                <td width="25" height="22" valign="middle"><span class="STYLE7">
                  <input name="textfield" type="text" class="STYLE1" style="height:10px; width:25px;" size="5" />
                </span></td>
                <td width="23" height="22" valign="middle">页</td>
                <td width="30" height="22" valign="middle"><img src="<%=request.getContextPath() %>/images/go.gif" width="26" height="20" /></td>
              </tr>
            </table>
        </div></td>
      </tr>
    </table></td>
  </tr>
</table>
</body>
</html>

云计算上课感悟

1、阿里神话,阿里将数据一致性高的都放在银行侧了,这是他们去ioe化的基础,并且,马云可以选择哪家银行存放钱,这是阿里的底气。在双十一阿里显得霸气侧漏的时候,其实苦逼的是银行。
2、数据中心进了老鼠怎么办,谷歌不知道怎么办,但国内银行是放只猫,抓完老鼠就拿出来。
3、企业IT和互联网IT,如果在某一方面达到极致,那么最后都是相通的,我随不做你那方面的东西,但我一眼就能看出来,哪些地方是夸大,哪些是创新。
4、对数据一致性要求高的一定是用IOE的,这是架构设计的选型依据。
上课感想(观点不一定正确),后续补充….
相关资料:
(1)、IOE事件中的I是代表IBM的缩写,也即去IBM的存储设备和小型机,主要是小型机,阿里巴巴、淘宝和支付宝主要是使用了IBM的小型机,IBM存储设备相对较少;
(2)、IOE 事件中的O是代表Oracle的缩写,也即去处Oracle数据库,采用MySQL和Hadoop替代的解决方案,Oracle RAC将会被Hadoop集群替代,其阿里巴巴B2B使用的GreenPlum集群,也将会在阿里巴巴集团完成运维团队和DBA团队合并之后,采用 Hadoop集群解决方案替代;
(3)、IOE事件中的E是代表EMC2,阿里巴巴B2B、淘宝和支付宝都是用大量EMC2的存储设备,也有少量DELL的存储设备,主要是EMC2,的存储设备性价比高;
(4)、阿里巴巴集团内部最早进行MySQL数据库替代Oracle数据库支持数据服务的子公司,是阿里巴巴B2B用PC Server替代EMC2,存储设备,替代IBM小型机。不过替换节凑是被合理控制的,因多方面的原因内部也没有那么雄壮的决心。后来,淘宝也开始进行MySQL数据库的应用摸索和推广,并且高调宣传去IOE事件,最后造成网络上满城风雨;

MySQL手册已经悄悄移除了GPL许可证

刚刚引起我们注意的是 MySQL 的手册已经修改了授权许可证,这是从 MySQL 5.5.30 到 5.5.31 时做的改动,该改动影响源码包中的 man 文件夹里的所有页面。
老的手册遵循 GPLv2 许可证(MySQL 5.5.30 或者更早版本):
This documentation is free software; you can redistribute it and/or modify it only under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License.
而新的手册页面(MySQL 5.5.31 或者更新版本)则采用如下授权协议:
This software and related documentation are provided under a license agreement containing restrictions on use and disclosure and are protected by intellectual property laws. Except as expressly permitted in your license agreement or allowed by law, you may not use, copy, reproduce, translate, broadcast, modify, license, transmit, distribute, exhibit, perform, publish, or display any part, in any form, or by any means. Reverse engineering, disassembly, or decompilation of this software, unless required by law for interoperability, is prohibited.
此举明显的显示出 Oracle 非常不友善的行为。新的许可证跟 GPL 差别巨大,并且明确表达不再使用 GPL 许可证。
oracle你这是要闹哪样啊???
 

利用hdfs搭建网盘–数据模型设计

先阐述下利用hdfs搭建网盘的思路:
(1)、首先要搭建hadoop集群,确保该集群正常运行
(2)、通过API访问文件到存储在hdfs中的文件,能对文件进行增删改查
(3)、文件的其他结构化信息,,比如:文件名称,上传时间,所属用户、文件类型等信息,需要存储在数据库里,我们使用mysql
(4)、用户需要通过操作界面来访问网盘系统,而不是直接操作hdfs,这里采用java、struts2框架来实现web端开发
(5)、有用户系统,存储用户相关信息,另外hdfs中文件存放的路径也和用户有直接关系
网盘系统的截图:http://pan.baidu.com/share/link?shareid=3253971941&uk=772112791
第一点已经在《Hadoop集群搭建详细简明教程》里详细写明步骤了,再次就不再提了
第二点已经在《利用HDFS java API增删改查操作》里详细阐述了
这篇文章先阐述下第三、第五点
网盘数据模型的设计,以及mysql在linux下的安装
网盘数据模型的设计:

file_info

file_info


user

user


tables

tables


目前只用到这file_ifno,user这两个表
mysql在linux:
我是在《Hadoop集群搭建详细简明教程》中搭建好的hadoopm主机上,通过yum安装的mysql,并设置mysql密码

yum install mysql
yum install mysql-server
yum install mysql-devel
chgrp -R mysql /var/lib/mysql
chmod -R 770 /var/lib/mysql
service mysqld start
mysql
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('secret_password');

PS:设置密码的时候可能会报错:ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number
可通过这个命令:select password(‘root’);得知root的 41-digit是什么
设置mysql开机启动:

chkconfig --levels 345 mysqld on

相关参考资料:
1、linux下安装mysql
2、设置用户
http://www.hackbase.com/tech/2011-09-09/65234.html
yum install mysql
http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/10/16/2214272.html
3、远程连接
http://www.cnblogs.com/smallstone/archive/2010/04/29/1723838.html
4、创建数据库–奇怪的问题:必须得使用特别奇怪的引号,否则不生效
http://tdcq.iteye.com/blog/363955
http://blog.sina.com.cn/s/blog_5dc960cd0100ea2h.html
5、在数据库上创建表
http://www.51cto.com/html/2005/1129/12524.htm
6、mysql中文乱码
http://www.2cto.com/database/201108/101151.html
7、修改表结构
http://database.51cto.com/art/201005/201148.htm
8、2007-07-20 10:59 在mysql中查询一个数据库中的所有表
http://hi.baidu.com/aigyoo/item/d56a8c01dcb50c10cd34eacf
9、mysql查看表结构命令
http://www.blogjava.net/etlan/archive/2007/07/12/129794.html