现在的位置: 首页 > 综合 > 正文

Hadoop云盘系统

2017年11月18日 ⁄ 综合 ⁄ 共 8222字 ⁄ 字号 评论关闭

总体概况

 

    项目名称:  《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开发的分布式云平台的文件管理系统。

 
  一、 概况:

    1、这是个人的业余爱好项目,自己进行了全部的设计、分析、编码、和优化。
 
    2、 根据现场需求进行流程分析与编写。
    
    3、 根据所需求的业务进行开发,代码编写,实现功能。
 
    4、 对程序业务逻辑进行优化,使其达到更高的性能。
 
    项目难点:1、搜索的实现利用了回溯法进行所有文件的搜索,利用字符是否包含来判断是否进入结果容器中
 
             2、目录跟踪显示的实现
 
这是本人仿照《百度网盘》,利用Hadoop技术进行开发的《Hadoop云盘系统》
 
 
       如下图所示,《百度网盘》和自己做的《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中,上传到当前进入的目录当中

                               

        主要代码分析:

[java] view
plain
copy

  1. JFileChooser chooser = new JFileChooser();  
  2. chooser.setVisible(true);  
  3. int returnVal = chooser.showOpenDialog(null);  
  4. if (returnVal == JFileChooser.APPROVE_OPTION) {// 为确定或OK是  
  5. String localPath = chooser.getSelectedFile()  
  6. .getPath();  
  7. String filename = chooser.getSelectedFile()  
  8. .getName();  
  9. InputStream in = null;  
  10. try {  
  11. in = new BufferedInputStream(  
  12. new FileInputStream(localPath));//本地文件输入流  
  13. catch (FileNotFoundException e3) {  
  14. e3.printStackTrace();  
  15. }  
  16. OutputStream out = null;  
  17. try {  
  18. out = hdfs.create(new Path(currentPath  
  19. "/" + filename),  
  20. new Progressable() {  
  21. public void progress() {  
  22. System.out.print(".");  
  23. }  
  24. });//HDFS路径的输出流抽象  
  25. catch (IOException e2) {  
  26. e2.printStackTrace();  
  27. }  
  28. try {  
  29. IOUtils.copyBytes(in, out, 4096true);//利用IOUtils工具类实现上传  
  30. catch (IOException e1) {  
  31. e1.printStackTrace();  
  32. }  
  33. try {  
  34. showTable(currentPath);//上传完毕就刷新当前路径的文件表格  
  35. catch (IOException e1) {  
  36. e1.printStackTrace();  
  37. }  
  38. }   

 

            2、文件下载分析:从在HDFS中下载到本地文件系统中,
                        
                                                  
 
                主要代码分析:
                   

[java] view
plain
copy

  1. if (e.getSource() == deleItem) {  
  2. int ensuce = JOptionPane.showConfirmDialog(new MainWindow(),  
  3. "确定删除所选文件吗""确认对话框", JOptionPane.YES_NO_OPTION);  
  4. if (ensuce == JOptionPane.NO_OPTION) {  
  5. return;  
  6. }  
  7. if (ensuce == JOptionPane.YES_OPTION) {  
  8. if (fileList.getSelectedRow() >= 0) {  
  9. String temp = currentPath  
  10. "/"  
  11. + fileList.getValueAt(  
  12. fileList.getSelectedRow(), 0);//获取要删掉文件的路径  
  13. try {  
  14. hdfs.delete(new Path(temp), true);  
  15. catch (IOException e1) {  
  16. e1.printStackTrace();  
  17. }  
  18. try {  
  19. showTable(currentPath);  
  20. catch (IOException e1) {  
  21. e1.printStackTrace();  
  22. }  
  23. }  
  24. }   

 

                3、文件表格展现
                            
                    
                   主要代码:
                         

[java] view
plain
copy

  1. /*-------------------------------------把currentPath路径下的文件和文件夹属性全都显示表格中----------------------------------------------------------*/  
  2. private void showTable(String currentPath) throws IOException {  
  3. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");  
  4. Path inputDir = new Path(currentPath);/* 获取文件的路径*/  
  5. /* FileStatue类*/  
  6. FileStatus[] status = hdfs.listStatus(inputDir);/* 得到文件路径目录下文件列表*/  
  7. DefaultTableModel model = (DefaultTableModel) fileList.getModel(); // 获取表格模型  
  8. if (fileList.getRowCount() != 0) { // 当表格中有数据  
  9. ((DefaultTableModel) fileList.getModel()).setRowCount(0);// 将表格置空  
  10. }  
  11. for (int i = 0; i < status.length; i++) {  
  12. String filename = null;  
  13. String lenStr = null;  
  14. String modifDate = null;  
  15. filename = status[i].getPath().getName();  
  16. String length = null// 获取文件大小信息  
  17. DecimalFormat df = new DecimalFormat("#.00");  
  18. if (status[i].isDir()) {  
  19. lenStr = "-";  
  20. else {  
  21. if (status[i].getLen() > (1024 * 1024 * 1024)) {  
  22. length = df.format(status[i].getLen()  
  23. / (1024.0 * 1024 * 1024));  
  24. lenStr = " " + length + "G";  
  25. else if (status[i].getLen() > (1024 * 1024)) {  
  26. length = df.format(status[i].getLen() / (1024.0 * 1024));  
  27. lenStr = " " + length + "M";  
  28. else if (status[i].getLen() > 1024) {  
  29. length = df.format(status[i].getLen() / 1024.0);  
  30. lenStr = " " + length + "KB";  
  31. else {  
  32. length = df.format(status[i].getLen());  
  33. lenStr = " " + length + "B";  
  34. }  
  35. }  
  36. modifDate = sdf.format(status[i].getModificationTime());  
  37. model.addRow(new Object[] { filename, lenStr, modifDate }); // 将文件名、文件大小、文件创建日期添加到表格  
  38. }  
  39. }  

 

                    4、文件搜索功能实现(利用回溯算法+字符匹配来实现)
 
                

                        先测试一下功能吧!我们输入“Hadoop”关键字搜索比配的文件
                                           
 
                        再入:输入“数学”搜索一下结果
                                         
                        
                      主要实现代码
                     

[java] view
plain
copy

  1. showAllResult(target);//具体实现   
  2. /*--------------------获取所有要搜索到的文件路径---------------------------------*/  
  3. private List<String> findAllFile(String target) {  
  4. List<String> result = new ArrayList<String>();  
  5. char[] tar = target.toCharArray();  
  6. int count = 0;  
  7. String findPath = currentPath;//默认搜索的路径是目前打开目录下为根的目录树  
  8. getAllFile(tar, result, findPath, count);  
  9. return result;  
  10. }  
  11. /*-----------------------------回溯检测树形下的文件---------------------------------------------------------*/  
  12. private void getAllFile(char[] tar, List<String> result, String findPath,  
  13. int count) {  
  14. conf = new Configuration();  
  15. try {  
  16. hdfs = FileSystem.get(URI.create(findPath), conf);  
  17. catch (IOException e) {  
  18. e.printStackTrace();  
  19. }  
  20. try {  
  21. if (hdfs.isFile(new Path(findPath))) {  
  22. String name = hdfs.getFileStatus(new Path(findPath)).getPath()  
  23. .getName();  
  24. if (isFind(tar, name.toCharArray())) {//检测是否字符匹配,匹配为找到  
  25. result.add(findPath);// 搜索到加入数组  
  26. }  
  27. return;  
  28. }  
  29. catch (IOException e) {  
  30. e.printStackTrace();  
  31. }  
  32. FileStatus[] sta = null;  
  33. try {  
  34. sta = hdfs.listStatus(new Path(findPath));  
  35. catch (IOException e) {  
  36. e.printStackTrace();  
  37. }  
  38. for (int i = 0; i < sta.length; i++) {//回溯法实现循环递归遍历  
  39. getAllFile(tar, result, sta[i].getPath().toString(), count++);  
  40. }  
  41. }  
  42. /*-----------------------查看字符串是否包含--------------------------------------------*/  
  43. private boolean isFind(char[] tar, char[] sour) {  
  44. int all=0.0for (int i = 0; i < tar.length; i++) {  
  45. int j = 0;  
  46. for (; j < sour.length; ++j) {  
  47. if (tar[i] == sour[j]) {  
  48. all++;break;  
  49. }  
  50. }  
  51. if (j == sour.length&&all/sour.length<0.75) {//概率匹配  
  52. return false;  
  53. }  
  54. }  
  55. return true;  
  56. }  

                5、文件分类实现查询
                        a、文件分类管理查看,查看“文档”列出系统中所有的文档                                            
                                 
                        
                          b、“图片”
                                 
                         
                           c、“音乐”
                                    
                           等等 。。。 。。。
 
                    
                   6、其他的实现,目录文件跟踪、文件维护等:
                    
       *最后说说本系统的信息处理的实现---MapReduce解决
           首先说下其实登陆不只是利用数据库来实现的,解决方法有如下几种:
           方案一:用另外一台机器专门用于对数据库操作的。要是在一个Hadoop中集群中安装一个数据库,我们不应该把数据库放在namenode中,而是放到另外的一台机,因
                          为namenode的任务已经够多了,安装在namenode上,多用户登陆时对数据库操作会消耗namenode的内存,会影响namenode对datanode的管理和调度等。
                          所以我们应该放到指定的一台机器上。
          方案二:利用利用Hadoop中分布式数据库HBase解决。这个毫无疑问是最好的解决方案,是针对云技术分布式的数据库。不过本人对HBase还是处于了解阶段,所以没
                         有用上它。
         最终方案:HBase用不上,不过没关系,因为现在只是对一个用户信息处理实现,业务量很少,我可以仿照Hive那样,在数据进行的时候转化为MapReduce进行,利用MapReduce来进行表与表的关联。        
                   例如如下表:                                        信息表:
                        登陆表:                                  
                                               
                                          
 
 
               有待扩展的功能模块我的分享----可以做成分享一个文件提供所有人下载,也可以做成分享给具体的某个用户。
                             实现方式:做一个分享表,记录了 分享人,被分享人,文件获取的路径(或者获取文件所需的参数参数)
                                       如下:
                                         
                                               
 
 
 
总结:本人学习Hadoop至今快半年,熟悉HDFS、MapReduce开发,有对过Hadoop HDFS部分、MapReduce源代码深入分析过,特别是MapReduce、做过不少的MapReduce计算实现。对Hadoop云技术很感兴趣,渴望从事于相关的开发工作。
【上篇】
【下篇】

抱歉!评论已关闭.