基于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();
    }
}
相关文章
|
21天前
|
存储 运维 负载均衡
构建高可用性GraphRAG系统:分布式部署与容错机制
【10月更文挑战第28天】作为一名数据科学家和系统架构师,我在构建和维护大规模分布式系统方面有着丰富的经验。最近,我负责了一个基于GraphRAG(Graph Retrieval-Augmented Generation)模型的项目,该模型用于构建一个高可用性的问答系统。在这个过程中,我深刻体会到分布式部署和容错机制的重要性。本文将详细介绍如何在生产环境中构建一个高可用性的GraphRAG系统,包括分布式部署方案、负载均衡、故障检测与恢复机制等方面的内容。
77 4
构建高可用性GraphRAG系统:分布式部署与容错机制
|
1月前
|
消息中间件 中间件 数据库
NServiceBus:打造企业级服务总线的利器——深度解析这一面向消息中间件如何革新分布式应用开发与提升系统可靠性
【10月更文挑战第9天】NServiceBus 是一个面向消息的中间件,专为构建分布式应用程序设计,特别适用于企业级服务总线(ESB)。它通过消息队列实现服务间的解耦,提高系统的可扩展性和容错性。在 .NET 生态中,NServiceBus 提供了强大的功能,支持多种传输方式如 RabbitMQ 和 Azure Service Bus。通过异步消息传递模式,各组件可以独立运作,即使某部分出现故障也不会影响整体系统。 示例代码展示了如何使用 NServiceBus 发送和接收消息,简化了系统的设计和维护。
48 3
|
1月前
|
消息中间件 存储 监控
消息队列系统中的确认机制在分布式系统中如何实现
消息队列系统中的确认机制在分布式系统中如何实现
|
1月前
|
消息中间件 存储 监控
【10月更文挑战第2天】消息队列系统中的确认机制在分布式系统中如何实现
【10月更文挑战第2天】消息队列系统中的确认机制在分布式系统中如何实现
|
1月前
|
分布式计算 NoSQL Java
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
45 2
|
1月前
|
存储 开发框架 .NET
C#语言如何搭建分布式文件存储系统
C#语言如何搭建分布式文件存储系统
71 2
|
1月前
|
分布式计算 Hadoop
Hadoop-27 ZooKeeper集群 集群配置启动 3台云服务器 myid集群 zoo.cfg多节点配置 分布式协调框架 Leader Follower Observer
Hadoop-27 ZooKeeper集群 集群配置启动 3台云服务器 myid集群 zoo.cfg多节点配置 分布式协调框架 Leader Follower Observer
48 1
|
1月前
|
存储 数据采集 分布式计算
Hadoop-17 Flume 介绍与环境配置 实机云服务器测试 分布式日志信息收集 海量数据 实时采集引擎 Source Channel Sink 串行复制负载均衡
Hadoop-17 Flume 介绍与环境配置 实机云服务器测试 分布式日志信息收集 海量数据 实时采集引擎 Source Channel Sink 串行复制负载均衡
44 1
|
1月前
|
分布式计算 Hadoop 网络安全
Hadoop-08-HDFS集群 基础知识 命令行上机实操 hadoop fs 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
Hadoop-08-HDFS集群 基础知识 命令行上机实操 hadoop fs 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
37 1
|
1月前
|
存储 机器学习/深度学习 缓存
Hadoop-07-HDFS集群 基础知识 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
Hadoop-07-HDFS集群 基础知识 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件
47 1
下一篇
无影云桌面