基于Hadoop分布式存储的网盘系统实现(简易粗糙版)(上)

简介: 基于Hadoop分布式存储的网盘系统实现(简易粗糙版)(上)

0x00 教程内容


  1. 准备工作
  2. 编写代码
  3. 运行效果
  4. 实现说明

说明:本实现非常地粗糙,仅供参考。通过本教程,可以看到运行结果,并且实现跟 HDFS 交互的最基本的功能。


0x01 基于Hadoop分布式存储的网盘系统实现


1. 准备工作

(1)需要自行安装好 Hadoop

(2)启动好 Hadoop

2. 编写代码

注意:这里必须要引入Hadoop的依赖,可以参考教程:Java API实现HDFS的相关操作 新建一个Maven项目,并引入依赖。

(1)编写页面代码: MainFram


package com.bigdata.mapreduce.swing;
import com.bigdata.mapreduce.utils.HDFSUtil;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
public class MainFram extends JFrame{
  private JTree tree=null;
  private JButton btnUpload = new JButton("上传");
  private JButton btnDownload = new JButton("下载");
  private JButton btnCreateDir = new JButton("创建文件夹");
  private JButton btndeleteDirOrFiles = new JButton("删除文件或者文件夹");
  private JButton btnRenameDirOrFiles = new JButton("重命名文件或者文件夹");
  private JButton btnMoveDir = new JButton("移动文件/文件夹");
  private JButton btnListDir = new JButton("列出文件");
  private DefaultMutableTreeNode root=new DefaultMutableTreeNode("我的网盘");
  private JPanel jp_center=new JPanel();
  // 初始化函数
  private void initTree() {
      tree=new JTree(root);
      tree.addTreeSelectionListener(new TreeSelectionListener() {
      @Override
      public void valueChanged(TreeSelectionEvent e) {
        tree_ValueChanged(e);
      }       
      });
    }
  private void tree_ValueChanged(TreeSelectionEvent e) {
//      JOptionPane.showMessageDialog(this,
//      tree.getSelectionPath().getLastPathComponent().toString());
    btnListDir_Clicked();
    }
    public MainFram() {
      JPanel jp=(JPanel)this.getContentPane();
      initTree();
      JScrollPane jsp_tree=new JScrollPane(tree);
      // 创建Panel
        JPanel jp_top=new JPanel();
        // 添加三个按钮
      jp_top.add(btnUpload);
      jp_top.add(btnDownload);
      jp_top.add(btnCreateDir);
      jp_top.add(btndeleteDirOrFiles);
      jp_top.add(btnRenameDirOrFiles);
      jp_top.add(btnMoveDir);
//      jp_top.add(btnListDir);
      JSplitPane splitPane_right=new JSplitPane(JSplitPane.VERTICAL_SPLIT,jp_top,jp_center);
      splitPane_right.setDividerLocation(100);
      splitPane_right.setDividerSize(1);
      JSplitPane splitPane=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,jsp_tree,splitPane_right);
      splitPane.setDividerLocation(300);
      splitPane.setDividerSize(2);
      jp.add(splitPane);
      btnUpload.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        btnUpload_Clicked();
      }
      });
      btnDownload.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        btnDownload_Clicked();
      }
      });
    btnCreateDir.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        btnCreateDir_Clicked();
      }
    });
    btnListDir.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        btnListDir_Clicked();
      }
    });
    btndeleteDirOrFiles.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        btndeleteDirOrFiles_Clicked();
      }
    });
    btnRenameDirOrFiles.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        btnRenameDirOrFiles_Clicked();
      }
    });
    btnMoveDir.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        btnMoveDir_Clicked();
      }
    });
      this.setTitle("我的云盘");
    this.setSize(1200, 800);
    this.setVisible(true);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    private void btnDownload_Clicked() {
    System.out.println("download");
    String message = "请输入需要下载的文件,HDFS上的文件:\n";
    try {
      List<String> hdfsDir = HDFSUtil.listRemoteDirAndFiles("/");
      for (int k = 0; k < hdfsDir.size(); k++) {
        message += hdfsDir.get(k) + "\n";
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
    String srcPath = JOptionPane.showInputDialog(null, message);
    System.out.println(srcPath);
    JFileChooser jf = new JFileChooser();
    jf.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
    jf.setDialogTitle("请选择要上传的文件夹...");
    jf.showDialog(null, null);
    String destPath = jf.getSelectedFile().getAbsolutePath() + "/";
//    String[] name = jf.getSelectedFile().getAbsolutePath().split("/");
//    String destPath = "/user";
    if (destPath.isEmpty()) {
      System.out.println("请选择本地路径!");
    } else {
      try {
        HDFSUtil.downloadFromHDFS(srcPath, destPath);
      } catch (Exception e1) {
        e1.printStackTrace();
      }
    }
    System.out.println("下载成功!");
    }
    private void btnUpload_Clicked() {
    System.out.println("upload");
    JFileChooser jf = new JFileChooser();
    jf.setFileSelectionMode(JFileChooser.FILES_ONLY);
    jf.setDialogTitle("请选择要上传的文件...");
    jf.showDialog(null, null);
    String srcPath = jf.getSelectedFile().getAbsolutePath() + "/";
//    String destPath = "/";
    if (srcPath.isEmpty()) {
      System.out.println("本地文件路径不能为空!");
    } else {
      String destPath = JOptionPane.showInputDialog(null, "请输入需要上传到HDFS的路径:");
      if (!destPath.isEmpty()) {
        try {
          HDFSUtil.uploadToHDFS(srcPath, destPath);
        } catch (Exception e1) {
          e1.printStackTrace();
        }
      } else {
        System.out.println("HDFS路径不能为空!");
      }
    }
    System.out.println("上传成功!");
    }
  private void btnMoveDir_Clicked() {
    String message1 = "请输入需要移动的文件或者文件夹名:\n";
    String message2 = "请输入想要移动后的文件夹名:\n";
    try {
      List<String> hdfsDir = HDFSUtil.listRemoteDirAndFiles("/");
      for (int k = 0; k < hdfsDir.size(); k++) {
        message1 += hdfsDir.get(k) + "\n";
        message2 += hdfsDir.get(k) + "\n";
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
    String oldName = JOptionPane.showInputDialog(null, message1);
    String newName = JOptionPane.showInputDialog(null, message2);
    System.out.println(oldName);
    if (oldName.isEmpty() || newName.isEmpty()) {
      System.out.println("参数错误,请重试!");
    } else {
      try {
        HDFSUtil.moveDirFromHDFS("/" + oldName, "/" + newName);
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
    System.out.println("移动文件/文件夹成功!");
  }
  private void btnRenameDirOrFiles_Clicked() {
    String message1 = "请输入需要重命名的文件或者文件夹名:\n";
    String message2 = "请输入想要重命后的文件或者文件夹名:\n";
    try {
      List<String> hdfsDir = HDFSUtil.listRemoteDirAndFiles("/");
      for (int k = 0; k < hdfsDir.size(); k++) {
        message1 += hdfsDir.get(k) + "\n";
        message2 += hdfsDir.get(k) + "\n";
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
    String oldName = JOptionPane.showInputDialog(null, message1);
    String newName = JOptionPane.showInputDialog(null, message2);
    System.out.println(oldName);
    if (oldName.isEmpty() || newName.isEmpty()) {
      System.out.println("参数错误,请重试!");
    } else {
      try {
        HDFSUtil.renameFromHDFS("/" + oldName, "/" + newName);
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
    System.out.println("重命名文件/文件夹成功!");
  }
  private void btndeleteDirOrFiles_Clicked() {
    String message = "请输入需要删除的文件或者文件夹名:\n";
    try {
      List<String> hdfsDir = HDFSUtil.listRemoteDirAndFiles("/");
      for (int k = 0; k < hdfsDir.size(); k++) {
        message += hdfsDir.get(k) + "\n";
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
    String deleteName = JOptionPane.showInputDialog(null, message);
    System.out.println(deleteName);
    if (deleteName.isEmpty()) {
      System.out.println("请输入文件或者文件夹名!");
    } else {
      try {
        HDFSUtil.deleteFromHDFS("/" + deleteName);
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
    System.out.println("删除文件/文件夹成功!");
  }
  private void btnListDir_Clicked() {
    int flag = 0;
    System.out.println("listDir");
    try {
      List<String> hdfsDir = HDFSUtil.listRemoteDirAndFiles("/");
//      List<String> hdfsDir = HDFSUtil.listRemoteDir("/");
      List<String> oneDirList = new ArrayList<>();
      DefaultMutableTreeNode oneDir = new DefaultMutableTreeNode();
      DefaultMutableTreeNode twoDir = new DefaultMutableTreeNode();
      for (int i = 0; i < hdfsDir.size(); i++) {
        System.out.println(hdfsDir.get(i));
        String[] arr = hdfsDir.get(i).split("/");
        int length = arr.length;
        // 目前只支持而级目录
        if (length == 2) { // length为2表示只有一个文件或者空文件夹,如:/user
          oneDir = new DefaultMutableTreeNode(arr[1]);
          root.add(oneDir);
        } else if (length == 3) { // length为3表示有两个文件或者两个空文件夹,如:/user/hello.txt
          // 如果一级目录里已经有这个目录,则不添加这个目录
          for (int j = 0; j < oneDirList.size(); j++) {
            if (oneDirList.get(j).equals(arr[1])) {
              flag = 1;
            }
          }
          if (flag == 0) {
            oneDir = new DefaultMutableTreeNode(arr[1]);
            twoDir = new DefaultMutableTreeNode(arr[2]);
            oneDirList.add(arr[1]);
            oneDir.add(twoDir);
            root.add(oneDir);
          } else if (flag == 1) {
            twoDir = new DefaultMutableTreeNode(arr[2]);
            oneDir.add(twoDir);
          }
        }
      }
      System.out.println("列出文件成功!");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  private void btnCreateDir_Clicked() {
    System.out.println("createDir");
    String remoteDirName = JOptionPane.showInputDialog(null, "请输入需要创建的文件夹名:");
    System.out.println(remoteDirName);
    if (remoteDirName.isEmpty()) {
      System.out.println("请输入文件名!");
    } else {
      try {
        HDFSUtil.createDirFromHDFS("/" + remoteDirName);
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
    System.out.println("新建文件夹成功!");
  }
  public static void main(String[] args) {
    JFrame.setDefaultLookAndFeelDecorated(true);
    new MainFram();
    }
}
相关文章
|
3月前
|
分布式计算 Ubuntu Hadoop
百度搜索:蓝易云【Ubuntu搭建全分布式Hadoop】
请注意,以上只是概述,并不包含详细的步骤和指令。搭建全分布式Hadoop是一个复杂的过程,需要对Hadoop的架构和配置有深入的理解,并熟悉Linux系统管理。建议在搭建全分布式Hadoop之前,先学习相关知识并查阅官方文档和教程,以确保正确搭建和配置Hadoop集群。
27 0
|
13天前
|
分布式计算 Hadoop 大数据
大数据技术与Python:结合Spark和Hadoop进行分布式计算
【4月更文挑战第12天】本文介绍了大数据技术及其4V特性,阐述了Hadoop和Spark在大数据处理中的作用。Hadoop提供分布式文件系统和MapReduce,Spark则为内存计算提供快速处理能力。通过Python结合Spark和Hadoop,可在分布式环境中进行数据处理和分析。文章详细讲解了如何配置Python环境、安装Spark和Hadoop,以及使用Python编写和提交代码到集群进行计算。掌握这些技能有助于应对大数据挑战。
|
1天前
|
存储 分布式计算 Hadoop
基于Hadoop分布式数据库HBase1.0部署及使用
基于Hadoop分布式数据库HBase1.0部署及使用
|
5天前
|
分布式计算 Ubuntu 调度
如何本地搭建开源分布式任务调度系统DolphinScheduler并远程访问
如何本地搭建开源分布式任务调度系统DolphinScheduler并远程访问
|
14天前
|
分布式计算 资源调度 监控
Hadoop生态系统深度剖析:面试经验与必备知识点解析
本文深入探讨了Hadoop生态系统的面试重点,涵盖Hadoop架构、HDFS、YARN和MapReduce。了解Hadoop的主从架构、HDFS的读写流程及高级特性,YARN的资源管理与调度,以及MapReduce编程模型。通过代码示例,如HDFS文件操作和WordCount程序,帮助读者巩固理解。此外,文章强调在面试中应结合个人经验、行业动态和技术进展展示技术实力。
|
1月前
|
存储 分布式计算 大数据
现代化数据库技术——面向大数据的分布式存储系统
传统的关系型数据库在面对大规模数据处理时遇到了诸多挑战,而面向大数据的分布式存储系统应运而生。本文将深入探讨现代化数据库技术中的分布式存储系统,包括其优势、工作原理以及在大数据领域的应用。
|
1月前
|
分布式计算 资源调度 Hadoop
Hadoop分布式
基于Java的分布式计算平台,旨在处理海量数据。【2月更文挑战第19天】
25 2
|
1月前
|
消息中间件 存储 NoSQL
【Redis项目实战】使用Springcloud整合Redis分布式锁+RabbitMQ技术实现高并发预约管理处理系统
【Redis项目实战】使用Springcloud整合Redis分布式锁+RabbitMQ技术实现高并发预约管理处理系统
|
1月前
|
存储 Web App开发 运维
原来10张图就可以搞懂分布式链路追踪系统原理
原来10张图就可以搞懂分布式链路追踪系统原理
|
1月前
|
算法 Java 数据中心
分布式ID生成系统之雪花算法详解
在当今的云计算和微服务架构盛行的时代,分布式系统已成为软件开发的重要组成部分。随着系统规模的扩大和业务的复杂化,对数据一致性和唯一性的要求也越来越高,尤其是在全局唯一标识符(ID)的生成上。因此,分布式ID生成系统应运而生,成为保证数据唯一性和提高系统可扩展性的关键技术之一。雪花算法(Snowflake)是Twitter开源的一种算法,用于生成64位的全局唯一ID,非常适用于分布式系统中生成唯一标识符。下面我们将深入探讨雪花算法的原理、结构和实现方式。
98 2
 分布式ID生成系统之雪花算法详解

热门文章

最新文章