总体概况
项目名称: 《Hadoop云盘系统》
Ø 项目开发环境:Linux下Hadoop分布式系统
Ø 项目开发环境:Ubuntu11.04+Hadoop0.20.2+JDK1.6+Eclipse3.3.2。
Ø 使用技术:Hadoop + Java
Ø 作品展示地址:http://blog.csdn.net/jtlyuan/article/details/7980826
Ø 作品描述:1、个人独立完成,课余兴趣作品。包含全部设计、分析、编码、优化。
2、功能实现,文件上传、下载、删除、维护、文件夹的新建、文件路径跟踪、以及个人文件搜索功能实现和文件分类展现等。
3、基于Hadoop开发的分布式云平台的文件管理系统。
再看个人的《云盘》
总结:界面设计简洁,整齐,操作方面,用户体验良好。
三、Hadoop集群主要配置和启动操作操作过程
1、查看集群的主节点配置。先在Linux中启动Hadoop,如下:查看现在JPS运行的进程,检查系统是否正常启动
2、查看 core-site.xml文件查看主节点的配置。
3、并在web中 查看 http://192.168.236.132:50030/ 和http://192.168.236.132:50070/ web界面集群启动情况,确定
无误后,可以利用Eclipse 启动程序运行程序了。
四、系统部分测试和主要代码解析
1、上传文件,是从本地文件系统中上传到HDFS中,上传到当前进入的目录当中
主要代码分析:
JFileChooser chooser = new JFileChooser(); chooser.setVisible(true); int returnVal = chooser.showOpenDialog(null); if (returnVal == JFileChooser.APPROVE_OPTION) {// 为确定或OK是 String localPath = chooser.getSelectedFile() .getPath(); String filename = chooser.getSelectedFile() .getName(); InputStream in = null; try { in = new BufferedInputStream( new FileInputStream(localPath));//本地文件输入流 } catch (FileNotFoundException e3) { e3.printStackTrace(); } OutputStream out = null; try { out = hdfs.create(new Path(currentPath + "/" + filename), new Progressable() { public void progress() { System.out.print("."); } });//HDFS路径的输出流抽象 } catch (IOException e2) { e2.printStackTrace(); } try { IOUtils.copyBytes(in, out, 4096, true);//利用IOUtils工具类实现上传 } catch (IOException e1) { e1.printStackTrace(); } try { showTable(currentPath);//上传完毕就刷新当前路径的文件表格 } catch (IOException e1) { e1.printStackTrace(); } }
if (e.getSource() == deleItem) { int ensuce = JOptionPane.showConfirmDialog(new MainWindow(), "确定删除所选文件吗", "确认对话框", JOptionPane.YES_NO_OPTION); if (ensuce == JOptionPane.NO_OPTION) { return; } if (ensuce == JOptionPane.YES_OPTION) { if (fileList.getSelectedRow() >= 0) { String temp = currentPath + "/" + fileList.getValueAt( fileList.getSelectedRow(), 0);//获取要删掉文件的路径 try { hdfs.delete(new Path(temp), true); } catch (IOException e1) { e1.printStackTrace(); } try { showTable(currentPath); } catch (IOException e1) { e1.printStackTrace(); } } }
/*-------------------------------------把currentPath路径下的文件和文件夹属性全都显示表格中----------------------------------------------------------*/ private void showTable(String currentPath) throws IOException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); Path inputDir = new Path(currentPath);/* 获取文件的路径*/ /* FileStatue类*/ FileStatus[] status = hdfs.listStatus(inputDir);/* 得到文件路径目录下文件列表*/ DefaultTableModel model = (DefaultTableModel) fileList.getModel(); // 获取表格模型 if (fileList.getRowCount() != 0) { // 当表格中有数据 ((DefaultTableModel) fileList.getModel()).setRowCount(0);// 将表格置空 } for (int i = 0; i < status.length; i++) { String filename = null; String lenStr = null; String modifDate = null; filename = status[i].getPath().getName(); String length = null; // 获取文件大小信息 DecimalFormat df = new DecimalFormat("#.00"); if (status[i].isDir()) { lenStr = "-"; } else { if (status[i].getLen() > (1024 * 1024 * 1024)) { length = df.format(status[i].getLen() / (1024.0 * 1024 * 1024)); lenStr = " " + length + "G"; } else if (status[i].getLen() > (1024 * 1024)) { length = df.format(status[i].getLen() / (1024.0 * 1024)); lenStr = " " + length + "M"; } else if (status[i].getLen() > 1024) { length = df.format(status[i].getLen() / 1024.0); lenStr = " " + length + "KB"; } else { length = df.format(status[i].getLen()); lenStr = " " + length + "B"; } } modifDate = sdf.format(status[i].getModificationTime()); model.addRow(new Object[] { filename, lenStr, modifDate }); // 将文件名、文件大小、文件创建日期添加到表格 } }
showAllResult(target);//具体实现 /*--------------------获取所有要搜索到的文件路径---------------------------------*/ private List<String> findAllFile(String target) { List<String> result = new ArrayList<String>(); char[] tar = target.toCharArray(); int count = 0; String findPath = currentPath;//默认搜索的路径是目前打开目录下为根的目录树 getAllFile(tar, result, findPath, count); return result; } /*-----------------------------回溯检测树形下的文件---------------------------------------------------------*/ private void getAllFile(char[] tar, List<String> result, String findPath, int count) { conf = new Configuration(); try { hdfs = FileSystem.get(URI.create(findPath), conf); } catch (IOException e) { e.printStackTrace(); } try { if (hdfs.isFile(new Path(findPath))) { String name = hdfs.getFileStatus(new Path(findPath)).getPath() .getName(); if (isFind(tar, name.toCharArray())) {//检测是否字符匹配,匹配为找到 result.add(findPath);// 搜索到加入数组 } return; } } catch (IOException e) { e.printStackTrace(); } FileStatus[] sta = null; try { sta = hdfs.listStatus(new Path(findPath)); } catch (IOException e) { e.printStackTrace(); } for (int i = 0; i < sta.length; i++) {//回溯法实现循环递归遍历 getAllFile(tar, result, sta[i].getPath().toString(), count++); } } /*-----------------------查看字符串是否包含--------------------------------------------*/ private boolean isFind(char[] tar, char[] sour) { int all=0.0;for (int i = 0; i < tar.length; i++) { int j = 0; for (; j < sour.length; ++j) { if (tar[i] == sour[j]) { all++;break; } } if (j == sour.length&&all/sour.length<0.75) {//概率匹配 return false; } } return true; }