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

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

(2)编写HDFS代码: HDFSUtil


package com.bigdata.mapreduce.utils;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.* ;
public class HDFSUtil {
  private static String hdfsURL="hdfs://localhost:9000";
  private static Configuration conf;
  static {
    conf = new Configuration();
    conf.set("fs.defaultFS", hdfsURL);
  }
  // 从HDFS上下载文件
  public static void downloadFromHDFS(String remoteFile,String localFile) throws Exception {
      FileSystem fs = FileSystem.get(conf);
      Path remotePath = new Path(remoteFile);
      Path localPath = new Path(localFile);
      fs.copyToLocalFile(remotePath, localPath);
      fs.close();
  }
  // 上传文件到HDFS
  public static void uploadToHDFS(String localfile,String remotefile) throws Exception {
    FileSystem fs = FileSystem.get(conf);
    Path remotePath = new Path(remotefile);
    Path localPath = new Path(localfile);
    fs.copyFromLocalFile(localPath, remotePath);
    fs.close();
  }
  // 创建HDFS文件夹
  public static void createDirFromHDFS(String remoteDir) throws Exception {
    FileSystem fs = FileSystem.get(conf);
    Path remotePath = new Path(remoteDir);
    //调用mkdirs函数创建目录
    fs.mkdirs(remotePath);
    fs.close();
  }
  // 删除文件和文件夹
  public static void deleteFromHDFS(String remoteDir) throws Exception {
    FileSystem fs = FileSystem.get(conf);
    Path remotePath = new Path(remoteDir);
    //调用mkdirs函数创建目录,true表示循环递归删除
    fs.delete(remotePath, true);
    fs.close();
  }
  // 重命名文件
  public static void renameFromHDFS(String oldName, String newName) throws Exception {
    FileSystem fs = FileSystem.get(conf);
    Path hdfsOldName = new Path(oldName);
    Path hdfsNewName = new Path(newName);
    fs.rename(hdfsOldName, hdfsNewName);
    fs.close();
  }
  // 查看文件夹
  public static void ListHDFSDir(String remoteDir) throws Exception {
    FileSystem fs = FileSystem.get(conf);
    Path dirPath = new Path(remoteDir);
    /*递归获取目录下的所有文件*/
    RemoteIterator<LocatedFileStatus> remoteIterator = fs.listFiles(dirPath, true);
    /*输出每个文件的信息*/
    while (remoteIterator.hasNext()) {
      FileStatus s = remoteIterator.next();
      System.out.println("路径: " + s.getPath().toString());
      System.out.println("权限: " + s.getPermission().toString());
      System.out.println("大小: " + s.getLen());
      /*返回的是时间戳,转化为时间日期格式*/
      Long timeStamp = s.getModificationTime();
      SimpleDateFormat format = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss");
      String date = format.format(timeStamp);
      System.out.println("时间: " + date);
      System.out.println();
    }
    fs.close();
  }
  // 列出文件
  public static List<String> listRemoteDirAndFiles(String remoteDir) throws Exception {
    List<String> remoteDirList = new ArrayList<>();
    FileSystem fs = FileSystem.get(conf);
    Path dirPath = new Path(remoteDir);
    /*递归获取目录下的所有文件*/
    RemoteIterator<LocatedFileStatus> remoteIterator = fs.listFiles(dirPath, true);
    /*输出每个文件的信息*/
    while (remoteIterator.hasNext()) {
      FileStatus s = remoteIterator.next();
      String myPath = s.getPath().toString().substring(21);
      remoteDirList.add(myPath);
    }
    fs.close();
    return remoteDirList;
  }
  // 列出文件夹
  public static List<String> listRemoteDir(String remoteDir) throws Exception {
    List<String> remoteDirList = new ArrayList<>();
    FileSystem fs = FileSystem.get(conf);
    Path dirPath = new Path(remoteDir);
    FileStatus[] fileStatus = fs.listStatus(dirPath);
    for (FileStatus file : fileStatus) {
      if (file.isDirectory()) {
        listRemoteDir(file.getPath().toString());
        remoteDirList.add(file.getPath().toString().substring(21));
      } else {
        remoteDirList.add(file.getPath().toString().substring(21));
      }
    }
    fs.close();
    return remoteDirList;
  }
  // 移动文件夹
  public static void moveDirFromHDFS(String oldPath, String newPath) throws Exception {
    FileSystem fs = FileSystem.get(conf);
    Path hdfsOldName = new Path(oldPath);
    Path hdfsNewName = new Path(newPath);
    fs.rename(hdfsOldName, hdfsNewName);
    fs.close();
  }
  // 测试
//  public static void main(String[] args) {
//    try {
      // 1、列出文件
//      List<String> list = HDFSUtil.listRemoteDirAndFiles("/");
//      for (int i = 0; i < list.size(); i++) {
//        System.out.println(list.get(i));
//      }
      // 2、重名文件
//      HDFSUtil.renameFromHDFS("/start-dfs.cmd", "/start-dfs.sh");
      // 3、创建文件夹
//      HDFSUtil.createDirFromHDFS("/hive");
      // 4、移动文件夹(把/路径下的hive文件夹,放到/user路径)
//      HDFSUtil.moveDirFromHDFS("/hive", "/user");
      // 5、删除文件或者文件夹
//      HDFSUtil.deleteFromHDFS("/user");
//      HDFSUtil.deleteFromHDFS("/user/hive/start-dfs.sh");
//    } catch (Exception e) {
//      e.printStackTrace();
//    }
//  }
}


3. 运行效果

很多的功能都已经实现,虽然不是特别地实用。

直接运行MainFram类就可以看到运行效果:


微信图片_20220619205341.png


4. 实现说明

(1)如果需要修改HDFS的链接,可以修改代码的值:

private static String hdfsURL="hdfs://localhost:9000";


(2)目前目录树其实是还不规范的,只是站在零基础同学角度的一个实现方案,需要自行完善。


0xFF 总结


  1. 通过本教程,可以扩展大家的思维,其实我们学了HDFS的API操作,并不是一无是处的,我们其实是可以自己写一个简单的小工具来使用的。
  2. 关注本博主,学习更多有趣的知识。
相关文章
|
8天前
|
机器学习/深度学习 存储 运维
分布式机器学习系统:设计原理、优化策略与实践经验
本文详细探讨了分布式机器学习系统的发展现状与挑战,重点分析了数据并行、模型并行等核心训练范式,以及参数服务器、优化器等关键组件的设计与实现。文章还深入讨论了混合精度训练、梯度累积、ZeRO优化器等高级特性,旨在提供一套全面的技术解决方案,以应对超大规模模型训练中的计算、存储及通信挑战。
33 4
|
1月前
|
存储 运维 负载均衡
构建高可用性GraphRAG系统:分布式部署与容错机制
【10月更文挑战第28天】作为一名数据科学家和系统架构师,我在构建和维护大规模分布式系统方面有着丰富的经验。最近,我负责了一个基于GraphRAG(Graph Retrieval-Augmented Generation)模型的项目,该模型用于构建一个高可用性的问答系统。在这个过程中,我深刻体会到分布式部署和容错机制的重要性。本文将详细介绍如何在生产环境中构建一个高可用性的GraphRAG系统,包括分布式部署方案、负载均衡、故障检测与恢复机制等方面的内容。
98 4
构建高可用性GraphRAG系统:分布式部署与容错机制
|
14天前
|
机器学习/深度学习 人工智能 分布式计算
【AI系统】分布式通信与 NVLink
进入大模型时代后,AI的核心转向大模型发展,训练这类模型需克服大量GPU资源及长时间的需求。面对单个GPU内存限制,跨多个GPU的分布式训练成为必要,这涉及到分布式通信和NVLink技术的应用。分布式通信允许多个节点协作完成任务,而NVLink则是一种高速、低延迟的通信技术,用于连接GPU或GPU与其它设备,以实现高性能计算。随着大模型的参数、数据规模扩大及算力需求增长,分布式并行策略,如数据并行和模型并行,变得至关重要。这些策略通过将模型或数据分割在多个GPU上处理,提高了训练效率。此外,NVLink和NVSwitch技术的持续演进,为GPU间的高效通信提供了更强的支持,推动了大模型训练的快
31 0
|
2月前
|
消息中间件 中间件 数据库
NServiceBus:打造企业级服务总线的利器——深度解析这一面向消息中间件如何革新分布式应用开发与提升系统可靠性
【10月更文挑战第9天】NServiceBus 是一个面向消息的中间件,专为构建分布式应用程序设计,特别适用于企业级服务总线(ESB)。它通过消息队列实现服务间的解耦,提高系统的可扩展性和容错性。在 .NET 生态中,NServiceBus 提供了强大的功能,支持多种传输方式如 RabbitMQ 和 Azure Service Bus。通过异步消息传递模式,各组件可以独立运作,即使某部分出现故障也不会影响整体系统。 示例代码展示了如何使用 NServiceBus 发送和接收消息,简化了系统的设计和维护。
58 3
|
2月前
|
消息中间件 存储 监控
消息队列系统中的确认机制在分布式系统中如何实现
消息队列系统中的确认机制在分布式系统中如何实现
|
2月前
|
消息中间件 存储 监控
【10月更文挑战第2天】消息队列系统中的确认机制在分布式系统中如何实现
【10月更文挑战第2天】消息队列系统中的确认机制在分布式系统中如何实现
|
2月前
|
分布式计算 NoSQL Java
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
48 2
|
2月前
|
存储 开发框架 .NET
C#语言如何搭建分布式文件存储系统
C#语言如何搭建分布式文件存储系统
77 2
|
2月前
|
分布式计算 Hadoop
Hadoop-27 ZooKeeper集群 集群配置启动 3台云服务器 myid集群 zoo.cfg多节点配置 分布式协调框架 Leader Follower Observer
Hadoop-27 ZooKeeper集群 集群配置启动 3台云服务器 myid集群 zoo.cfg多节点配置 分布式协调框架 Leader Follower Observer
50 1
|
2月前
|
存储 数据采集 分布式计算
Hadoop-17 Flume 介绍与环境配置 实机云服务器测试 分布式日志信息收集 海量数据 实时采集引擎 Source Channel Sink 串行复制负载均衡
Hadoop-17 Flume 介绍与环境配置 实机云服务器测试 分布式日志信息收集 海量数据 实时采集引擎 Source Channel Sink 串行复制负载均衡
52 1