☰
Hadoop HDFS网盘开发实战:部署、核心代码与避坑指南
2026/9/28 6:07:24 网站建设 项目流程

简介:面向计算机相关专业学生与开发者的Hadoop百度云盘项目,包含完整源代码与文档说明,标签聚焦Hadoop与大数据,适合作为毕业设计、课程设计或大数据学习进阶的实战参考。资源包共2000个文件,约77.11MB,其中前端页面与静态资源数量可观,涵盖HTML、CSS、JavaScript及大量PNG图片,后端逻辑由JSP、Java配合Jar依赖实现,同时附带数据库文件、配置属性和说明文档,整体结构清晰,便于按模块检索和二次开发。目前已有535人学习或下载。代码经过完整测试并成功运行,作者答辩平均分达96分,且可私聊远程教学,适合需要快速上手或希望借鉴完整项目流程的读者。下载后建议先阅读README文件,能更高效地理解项目启动、配置与部署方法。

1. 为什么用 Hadoop 做百度云盘:一个能跑通的毕设级 HDFS 网盘

最近拆了一套基于 Hadoop 的百度云盘毕设项目,前端是 Bootstrap + EasyUI,后端是 Java Web,文件存储直接落在 HDFS 上。它没有上 Spring Cloud 那套重型框架,靠 Servlet + HDFS API 就把上传、下载、目录管理、文件预览整条链路跑通了。这套代码的核心逻辑很直白:浏览器把文件交给后端,后端调 Hadoop FileSystem 接口把文件写进分布式文件系统,用户看到的“网盘目录”其实就是 HDFS 里的路径映射。对正在做大数据的课程设计、毕设题的人来说,它最大的价值不是代码本身多复杂,而是把“Hadoop 到底能干什么”用一个看得见摸得着的 Web 界面讲清楚了。如果你正打算做网盘、文件管理、大数据存储方向的毕设,这篇笔记把架构、部署和坑都捋一遍。

2. 环境准备与选型:伪分布式 Hadoop + Eclipse 工程导入

2.1 为什么选 HDFS 做“网盘”存储层

网盘这个东西,本质上是“把本地文件挪到远程存储”,而 Hadoop 里的 HDFS 就是分布式文件系统,天生适合干这件事。传统做法是把文件存到服务器本地磁盘、或者存 MySQL 的 BLOB 字段,但这两种方案在大数据课程设计里都不够“有说法”。HDFS 的多个副本机制天然对应网盘里的“文件安全”,block 分块存储对应“大文件分片上传”,这套映射关系在答辩汇报里特别好讲。

从代码结构来看,这套项目把文件操作全部封装在一个 FileOperate 类里,通过 FileSystem.get(conf) 拿到 HDFS 客户端实例。伪分布式环境下配置一个副本,跑通流程完全没问题。如果换成三节点集群,改个 replication 参数就有容错效果,这就是后面第 6 章要说的升级路径。

项目里前端用了 EasyUI 的 datagrid、tree、dialog 组件,配合 bootstrap.css 做美化和布局,页面是典型的后台管理风格。syExtIcon.css 里放的是图标字体,ace.min.css 是代码编辑器组件,看起来还兼容了在线查看源代码文件的功能。这些前端文件分布在 WebContent 目录下,对应 Eclipse WTP 动态 Web 项目的标准结构。

2.2 伪分布式 Hadoop 安装与核心配置

在跑这套代码之前,先把 Hadoop 装好。这里以 Hadoop 2.x/3.x 伪分布式为例,装完后要改三个配置文件:core-site.xml、hdfs-site.xml、mapred-site.xml。伪分布式只用一个进程模拟分布式环境,NameNode 和 DataNode 跑在同一台机器上。

core-site.xml 里最重要的是 fs.defaultFS,它决定了 HDFS 的访问入口。如果这里写的端口和代码里不一致,后面所有上传下载都会失败。

<!-- core-site.xml --> <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/home/hadoop/data/tmp</value> </property> </configuration>
<!-- hdfs-site.xml --> <configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/home/hadoop/data/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/home/hadoop/data/data</value> </property> </configuration>

hdfs-site.xml 里 dfs.replication 在伪分布式必须设成 1。很多新手在这里跟着集群教程配成 3,结果 DataNode 只有一个节点,副本永远写不满,NameNode 一直报 “There are X missing blocks”。hadoop.tmp.dir 如果保留默认值,重启机器后临时数据会被系统清理掉,再次启动会发现 NameNode 起不来,血泪教训。

配置完先执行 hdfs namenode -format 格式化,然后 start-dfs.sh 启动。启动后用 jps 检查进程,NameNode、DataNode、SecondaryNameNode 三个进程必须同时存在。

jps # 期望输出类似: # 12345 NameNode # 23456 DataNode # 34567 SecondaryNameNode

如果缺 DataNode,多半是刚才格式化后 datanode 的 data 目录和 namenode 的 name 目录里 clusterID 不一致,需要把 data 目录删掉重新格式化。这个坑几乎每届学生都会踩到。

2.3 项目导入 Eclipse 与 JDK、编码、依赖三件套

这个项目是 Eclipse WTP 工程(有 org.eclipse.wst.common.component 文件),导入时选 “Existing Projects into Workspace”,直接指向解压目录就行。导入后先做三件事:检查 JDK 编译级别、检查字符集、检查 Hadoop 依赖 JAR 是否齐全。

JDK 版本建议 1.8。Hadoop 2.x 对 JDK 9 以上的兼容性不算好,反射调用的某些类会有非法访问警告。如果机器上装的是 JDK 11,看到报错先别慌,多数和 javax.xml.bind 缺失有关,改成 JDK 8 基本能绕过去。

字符集方面,记得把 workspace 的编码改成 UTF-8。这个项目里有中文文件名上传、中文路径目录创建,如果编码是 GBK,传到 HDFS 上再读回来就是乱码,Linux 上显示一串问号。

依赖方面,确认 lib 目录下有 hadoop-common、hadoop-hdfs、hadoop-client 这几个核心包。如果缺了,从 Hadoop 安装目录的 share/hadoop/common 和 share/hadoop/hdfs 里拷出来。第一步先不要让 IDE 自动帮你找,直接手动 Build Path 加进去,这种老项目的依赖关系 IDE 自动识别反而容易乱。

2.4 文档说明与包结构走读

解压后先打开 README.md,里面一般会写清楚项目运行步骤。src 目录下面主要包结构是 dao、servlet、util、bean,核心类集中在:

包/目录职责
dao数据库访问,操作 user 表和 file_record 表
servlet前端请求入口,上传、下载、目录管理的控制层
utilHadoop FileSystem 工具类、字符串处理
bean用户、文件记录、目录信息的 JavaBean
WebContent前端页面,JSP + EasyUI + Bootstrap
sql数据库初始化脚本,建表语句

这套包结构是标准的 Servlet 三层写法,没有引入 Spring,因此追踪代码链路时非常直观:浏览器请求 → Servlet → DAO → HDFS API。对毕设阶段来说,这种“看得见每一行调用”的结构比 SSM 框架更适合答辩讲解。

3. 核心模块实现:上传、下载、目录树的 HDFS 操作怎么落代码

3.1 登录与 Session 会话管理

网站的登录逻辑没有引入 Redis,而是用 Servlet Session + MySQL 用户表完成的。用户表字段很少,大概就是 id、username、password、reg_time。密码做了 MD5 加密存储,不过没用加盐,这个安全级别在毕设里够用,但如果是真实商用肯定不够。

登录成功后把用户对象丢进 Session,后续上传下载都从 Session 里取当前用户,然后拼装用户专属的 HDFS 目录。这里有个值得借鉴的设计:每个用户的文件根目录不同,类似 /user/zhangsan/,避免所有用户挤在同一个根目录下互相看到。代码里大概长这样:

// UserServlet.java 中的登录逻辑 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = req.getParameter("username"); String password = MD5Util.md5(req.getParameter("password")); User user = userDao.findByUsernameAndPassword(username, password); if (user != null) { req.getSession().setAttribute("loginUser", user); resp.sendRedirect("index.jsp"); } else { req.setAttribute("msg", "用户名或密码错误"); req.getRequestDispatcher("login.jsp").forward(req, resp); } }

loginUser 存在 Session 里,后续所有 servlet 通过 request.getSession().getAttribute(“loginUser”) 拿到用户 ID,再拼出 HDFS 路径。这里注意密码必须先加密再传入 DAO 查询,如果拿明文去查,一旦数据库泄露就是批量裸奔。

3.2 文件上传:Web 表单接文件,写进 HDFS

上传是整个项目最核心的模块。前端用 EasyUI 的 form 组件带 file 字段,后端 Servlet 通过 request.getPart 或 FileUpload 组件接文件。拿到上传的流之后,构建目标 HDFS 路径,调 FileSystem.copyFromLocalFile 或 create 方法写入。

以下是 UploadServlet 里核心代码的简化版本:

// UploadServlet.java 文件上传核心片段 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8"); User loginUser = (User) req.getSession().getAttribute("loginUser"); String currentPath = req.getParameter("currentPath"); // 当前 HDFS 目录 Part part = req.getPart("file"); String fileName = getFileName(part); // 从 part 头解析原始文件名 // 目标目录:/user/{username}/{currentPath} String hdfsPath = "/user/" + loginUser.getUsername() + "/" + currentPath; Configuration conf = new Configuration(); conf.set("fs.defaultFS", "hdfs://localhost:9000"); FileSystem fs = FileSystem.get(conf); Path dest = new Path(hdfsPath + "/" + fileName); try (InputStream in = part.getInputStream()) { fs.create(dest, new Progressable() { @Override public void progress() { // 这里回调可以用来计算上传进度,平时也可以不写 } }); // 实际写数据 FSDataOutputStream out = fs.create(dest); IOUtils.copyBytes(in, out, 4096, true); } resp.sendRedirect("fileList.jsp?path=" + URLEncoder.encode(currentPath, "UTF-8")); }

重点说明两个细节:getFileName(part) 不能直接拿浏览器文件名,因为 IE 和 Chrome 的 Content-Disposition 头格式不一样,需要 split 之后再解码。HDFS 路径里的 currentPath 要防止 “../” 这种路径穿越写法,否则用户能跳到别的目录,我在这个项目基础上改进时加了路径白名单校验,不允许包含 .. 和空字符串。

IOUtils.copyBytes 是 Hadoop 自带工具类,参数 4096 是缓冲区大小,true 表示自动关闭流。用 copyBytes 而不是逐行 read/write,既能减少代码量,也避免忘记关闭 FSDataOutputStream 导致的文件写入不完整。

3.3 文件下载与在线预览

下载的逻辑正好反过来:把 HDFS 上的文件流取出来,通过 HttpServletResponse 的输出流写回浏览器,同时设置 Content-Disposition 让浏览器弹出下载框。

// DownloadServlet.java 文件下载核心片段 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String filePath = req.getParameter("filePath"); // 完整 HDFS 路径 Configuration conf = new Configuration(); conf.set("fs.defaultFS", "hdfs://localhost:9000"); FileSystem fs = FileSystem.get(conf); Path path = new Path(filePath); if (!fs.exists(path)) { resp.setStatus(404); resp.getWriter().write("文件不存在"); return; } FSDataInputStream in = fs.open(path); String fileName = path.getName(); String encodedName = URLEncoder.encode(fileName, "UTF-8") .replaceAll("\\+", "%20"); resp.setContentType("application/octet-stream"); resp.setHeader("Content-Disposition", "attachment;filename*=UTF-8''" + encodedName); OutputStream out = resp.getOutputStream(); IOUtils.copyBytes(in, out, 4096, true); }

注意 Content-Disposition 里的文件名编码,如果直接写 filename=fileName,中文文件名在 Chrome 里会变成下划线或问号。应该用 RFC 5987 的 filename* 写法,配合 URLEncoder 编码才能让中文文件名正常下载。这个坑在演示给老师看的时候特别容易出现:一个名为 “项目报告.docx” 的文件下载下来变成 “________.docx”,观感极差。

3.4 目录树与文件列表

目录树是 EasyUI 的 tree 组件,后端返回 JSON 数据,格式是 [{“id”:1,“text”:“/user/zhangsan/”, “children”:[…]}]。对应后端逻辑遍历 HDFS 目录结构,将 FileStatus 数组转换成 JSON。

// FileListServlet.java 目录列表核心片段 FileSystem fs = FileSystem.get(conf); Path rootPath = new Path("/user/" + username + "/" + currentPath); FileStatus[] statuses = fs.listStatus(rootPath); JSONArray arr = new JSONArray(); for (FileStatus status : statuses) { JSONObject obj = new JSONObject(); if (status.isDirectory()) { obj.put("isDir", true); obj.put("text", status.getPath().getName()); obj.put("children", new JSONArray()); } else { obj.put("isDir", false); obj.put("text", status.getPath().getName() + " (" + formatSize(status.getLen()) + ")"); } obj.put("path", status.getPath().toString()); arr.add(obj); } resp.setCharacterEncoding("UTF-8"); resp.setContentType("application/json"); resp.getWriter().write(arr.toJSONString());

formatSize 要处理的情况包括 B、KB、MB、GB 逐级换算。很多项目在这里直接除以 1024 保留两位小数,算出来的结果在文件大时勉强能看,文件小时显示成 “0.00 KB”,老师看到印象分会打折。

4. 部署运行全流程:从 Eclipse 启动到浏览器端端到端验证

4.1 启动顺序:先 HDFS 再 Tomcat

整个项目启动顺序有严格要求,必须先启动 Hadoop 相关进程,再启动 Tomcat。如果 Tomcat 先启动,项目里的 Servlet 在初始化时尝试连接 HDFS 可能会抛 ConnectException,等 HDFS 起来后不重启 Tomcat 往往恢复不了,因为 FileSystem 客户端缓存了失败的连接状态。

# 第一步:启动 HDFS start-dfs.sh # 第二步:确认进程全部就位 jps # 第三步:再启动 Tomcat(Eclipse 里右键项目 Run As → Run on Server) service tomcat start

如果用的是 Eclipse 内嵌 Tomcat,一定注意 Server 的配置路径不要冲突。我曾经遇到过 Tomcat 启动显示成功但访问页面 404,排查了半天发现是 Eclipse 里配置的 Web 模块根路径是 /baiduyun,而访问时输入的是 localhost:8080/,少了一层路径。

4.2 数据库初始化与连接配置

项目用的是 MySQL,之前要先建库建表。安装包里的 sql 目录下应该有一个 baiduyun.sql,用 source 命令导入即可。

-- baiduyun.sql 核心表结构(简版) CREATE DATABASE IF NOT EXISTS baiduyun DEFAULT CHARSET utf8; USE baiduyun; CREATE TABLE sys_user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) UNIQUE NOT NULL, password VARCHAR(100) NOT NULL, reg_time DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE file_record ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT NOT NULL, file_name VARCHAR(255) NOT NULL, file_size BIGINT DEFAULT 0, hdfs_path VARCHAR(500) NOT NULL, upload_time DATETIME DEFAULT CURRENT_TIMESTAMP, download_count INT DEFAULT 0 );

JDBC 连接配置在 util 包里,一般是 JdbcUtil.java 或 db.properties。要确认数据库 URL、用户名、密码四件套都改成本机的,数据库端口如果不是 3306 也要同步修改。很多同学拆包后只知道代码跑不起来,没意识到是数据库账号密码不对,日志只报 ClassNotFoundException 或者 Access denied。

4.3 功能验证路径:一次完整的上传下载巡检

启动完成后,不要只点几个页面就说“跑通了”。按下面这条路径走一遍,确认没漏功能:

步骤操作预期结果
1注册一个新账号能注册成功,密码写入 MD5 值
2用新账号登录跳转 index.jsp,不报错
3新建一级目录 “test”目录出现在树里
4在 test 下再建二级目录 “sub”树结构展开有两层
5上传一个 20MB 的 zip 文件上传进度走完,刷新后文件出现在列表里
6上传一个中文文件名 docx文件名显示正常,无乱码
7点击下载刚上传的 zip下载成功,大小一致
8删除 sub 目录树节点消失,HDFS 里对应路径被删

这个流程有 8 步,覆盖了增、删、查、传、下五个核心动作。如果其中某一步失败,大概率能定位到具体模块,而不是一句“项目跑不起来”的模糊话。

4.4 日志怎么看

Tomcat 日志在 logs/catalina.out,Eclipse 里直接看 Console 窗口。Hadoop 的错误经常会先出现在 HDFS 服务端日志里,然后才会在 Tomcat 侧抛 IOException。最常见的报错是:

org.apache.hadoop.ipc.RemoteException: File /user/test/xxx.dat could only be replicated to 0 nodes, instead of 1

这个报错意味着 DataNode 没起来或者 NameNode 处于安全模式。执行 hdfs dfsadmin -safemode leave 退出安全模式,或者查看 DataNode 日志确认节点状态。很多时候,表面上报的是文件写入失败,实际原因是磁盘空间不够或者目录权限不对。hadoop fs -df -h 看一下 HDFS 剩余空间,df -h 看本地磁盘,两种空间都满了数据节点会自动下线。

5. 避坑与排查:五个最容易让人翻车的点,全是血泪经验

5.1 坑一:HDFS 端口不一致,上传接口一直报 ConnectException

现象:点击上传按钮后控制台报错,日志显示 java.net.ConnectException: Connection refused,看堆栈里有 org.apache.hadoop.ipc.Client。

原因:core-site.xml 里 fs.defaultFS 配了 hdfs://localhost:9000,但 Servlet 代码里写死的是 hdfs://localhost:8020。伪分布式安装时默认端口是 9000,老版本的 Hadoop 有时是 8020,两边对不上就连接失败。

解决:把代码里的 fs.defaultFS 的端口改成和 core-site.xml 一致。注意一共要改两处:一处是各 Servlet 里 new Configuration() 之后的 conf.set,另一处是可能存在的 HadoopUtil 工具类,统一用一个常量管理端口,避免到处写死。

5.2 坑二:Windows 下运行报 Hadoop WINUTILS.EXE 找不到

现象:项目在 Eclipse 里启动后访问上传页面,日志弹出 “Failed to locate the winutils binary in the hadoop binary path”,上传直接失败。

原因:Windows 下 Hadoop FileSystem 客户端需要一个本地库模拟 Linux 权限校验,项目里没有配置 hadoop.home.dir,找不到 bin 下的 winutils.exe。

解决:下载对应版本的 hadoop-common-bin,放到一个非中文路径下,然后启动 JVM 参数里加 -Dhadoop.home.dir=D:/software/hadoop-common-bin,或者直接在代码里 System.setProperty("hadoop.home.dir", “D:/software/hadoop-common-bin”)。建议用 JVM 参数方式,因为代码方式每次进 System.setProperty 也容易和其他初始化冲突。

5.3 坑三:上传大文件提示 FileSystem 已关闭

现象:连续上传几个大文件,第一次成功,第二次报 java.io.IOException: Filesystem closed。

原因:项目里可能用了一个单例 FileSystem 实例,某个流程结束时调用了 fs.close()。Hadoop 的 FileSystem 实例是线程安全的,但调过一次 close 后整个实例作废,后续任何操作都会抛 Filesystem closed。

解决:不要在每次操作结束后调用 fs.close()。正确做法是在整个应用生命周期里复用 FileSystem,用 try-with-resources 只关闭流,不要关 FileSystem 本身。如果非要在各 Servlet 中获取 FileSystem,也尽量写成 FileSystem.get(conf),靠 Hadoop 内部缓存机制复用同一个客户端实例。

5.4 坑四:上传中文目录名后文件列表里显示乱码

现象:Linux 服务器上通过页面新建目录 “测试资料”,页面树节点变成 “æµè¯èµæ”,上传中文文件后 HDFS 里也是乱码。

原因:后端把 ISO-8859-1 编码的字节流当成 UTF-8 处理,或者反过来。Tomcat 默认请求编码不是 UTF-8,Servlet 里没有调用 req.setCharacterEncoding(“UTF-8”)的话,中文参数在 getParameter 时已经变了形。

解决:每个 Servlet 的 doGet/doPost 第一行加 req.setCharacterEncoding("UTF-8"),并设置 resp.setContentType("text/html; charset=UTF-8")。同时给 Tomcat 的 server.xml 里 Connector 加上 URIEncoding="UTF-8" 属性。如果之前乱码数据已经写入 HDFS,用 dfs -rm -r 删掉重新建。

5.5 坑五:伪分布式启动后浏览 HDFS 界面,Live Nodes 为 0

现象:访问 localhost:9870,看到 Live Nodes 是 0,文件系统所有读写都失败。

原因:NameNode 起来但 DataNode 没起来,大概率是 datanode 的 clusterID 和 namenode 不一致。每次执行 hdfs namenode -format 会在 name 目录生成新 clusterID,但如果 data 目录里还残留旧的 clusterID,DataNode 启动时会校验失败。

解决:把 hadoop.tmp.dir 下整个 data 目录删掉,然后重新格式化。注意格式化之前先把进程全部停掉,start-dfs.sh 和 stop-all.sh 各执行一次,清干净再重启。这个操作我做过不下十次,每次都提醒自己要确认 dfs.datanode.data.dir 路径下没有旧数据。

6. 集群迁移与验收清单:从伪分布式到三节点的平滑切换

6.1 三节点集群迁移:配置和代码要改哪些地方

这套代码的 HDFS 地址是写在各 Servlet 的 Configuration 里,迁移到集群时不需要大规模改动业务代码,只需要把 fs.defaultFS 指向集群 NameNode 的主机名或负载均衡地址。

假设三台节点:master、slave1、slave2,master 跑 NameNode,slave1 和 slave2 跑 DataNode。core-site.xml 改成:

<property> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> </property>

hdfs-site.xml 里 dfs.replication 改成 2 或 3。如果三节点都存数据,建议副本数设 2,兼顾容量和数据安全;设 3 的话每份文件占用三倍空间。同时要在每个 DataNode 节点上配置 dfs.hosts 和 dfs.hosts.exclude 文件,不然节点自动加入集群不受控。

代码层改动只有一个地方:需要把 servlet 里硬编码的 localhost 全部替换成 master 主机名。更好的做法是在 util 包里加一个常量类,写 static final String HDFS_URI = "hdfs://master:9000",然后在各 Servlet 中引用这个常量,后续再迁移直接改一处。

6.2 用上传下载压测确认 HDFS 吞吐是否正常

集群搭好后,用 Hadoop 自带的 dfs 命令做一轮基础吞吐测试:

# 测试写入 128MB 文件 hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.3.6-tests.jar TestDFSIO -write -nrFiles 10 -fileSize 128MB # 测试读取 hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.3.6-tests.jar TestDFSIO -read -nrFiles 10 -fileSize 128MB

写吞吐一般能达到磁盘 RAID 的 70% 以上算正常,读吞吐通常略高于写。如果写吞吐很低,问题大概率在网络,检查是否有网卡 bonding 没配好,或者万兆网卡没生效。

然后回到 Web 页面做一次端到端验证:上传一个 500MB 的大文件,记录从点击上传到进度条走完的时间。三节点集群应该比伪分布式快不少,因为多个 DataNode 并行写入。如果上传反而更慢,检查副本数是否过大,或者有没有个别节点网络有问题拖慢整个写入。

6.3 一份可复用的验收清单

不管伪分布式还是集群,最终提交前把这份清单过一遍:

检查项期望结果常见失败
jps 进程完整性NameNode/DataNode 齐全SecondaryNameNode 缺失导致 checkpooint 警告
HDFS Web UI 可访问master:9870 显示 Live Nodes 符合预期防火墙没开,外部访问不了
单文件上传(中文文件名)文件名正常显示,大小一致编码没设 UTF-8,乱码
目录创建/删除/改名操作后树组件刷新正常EasyUI 缓存未清除,看到旧数据
大文件下载下载后 md5 与本地一致流未关闭导致文件截断
用户隔离user1 看不到 user2 的文件HDFS 权限未开启,互相可见

最后说一件我自己的糗事,每次做完这种 Hadoop 网盘项目都会踩到同一个点:把代码里的 fs.defaultFS 从 localhost 切到 master 时,忘记同步改 pom.xml 里依赖的 hadoop 版本号。结果客户端和服务端版本不一致,HDFS 协议协商报错,查了一下午才找到是 protobuf 版本冲突。从那以后,我每次配置文件的任何改动都强制走一遍 hdfs dfs -ls / 验证连通性,确认没问题再启动 Tomcat。希望这套笔记能把你的部署时间从一周压缩到一天,真正把精力留在业务功能和答辩准备上,祝顺利。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询