如何加速一个网站——web性能三方面[转载]

本文探讨了提高网页加载速度的方法,包括前端性能优化、网络性能改进和后端性能提升。介绍了关键渲染路径、网络延迟和横向扩展架构等核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

徐海蛟教学

Building a Shop with Sub-Second Page Loads: Lessons Learned
利用web缓存和NoSQL系统建立一个应对高访问量的快速网上商店。

  • 用户满意度和转化率强相关(hard-wired),并直接影响利润。

如何加速一个网站

有三大驱动力影响网页应用的页面加载时间:

  1. 后端处理:网络服务器需要时间来从数据库中加载数据和组装网页。
  2. 网络延迟:每一个请求需要时间来从客户端传输到服务器再返回(请求延时)。考虑到平均一个网页需要超过100次请求才能完全加载,这就变得更重要了。
  3. 前端处理:前端设备需要时间来渲染页面。

为了加速我们的网站,让我们逐个处理这三个瓶颈。


前端性能
  • 前端性能的最重要因素是关键呈现(渲染)路径(critical rendering path - CRP)。它描述了浏览器对用户呈现页面的5个必要步骤:


    • DOM:当浏览器解析 HTML时,它会逐渐生成一个HTML标签的树状模型,名为文档对象模型document object model - DOM)。它描述了页面的内容。

      html解析过程


      html解析时间
    • CSSOM:一旦浏览器接收到了全部的CSS,CSS 字节会转换为字符,然后转换为符号和节点,最后链接进树状结构上,称为CSS对象模型,它包含样式信息。

      参考: Google开发者--构建对象模型

    • Render Tree:CSSOM 和 DOM 是独立的数据结构,为了将DOM和CSSOM组合起来,浏览器构造了一个渲染树,它包含了页面内容和要应用的样式信息。

    • Layout布局步骤计算显示在屏幕上的网页内容的实际位置和大小。

    • Paint:最后一步就是将布局信息逐像素点绘制到屏幕上。

      参考: Google开发者--渲染树构建、布局及绘制

  • 单独的每一步都是相当直接的,是步骤之间的依赖关系使得事情变得复杂,并限制了性能。DOM和CSSDOM的构建通常具有最大的性能影响。
    下图展示了关键呈现路径以及用箭头表示的等待依赖关系:


  • 在加载完CSS并构建完整的CSSOM之前没有东西会显示给客户端。因此,CSS被称为渲染阻塞,即CSS 被视为阻塞渲染的资源。

    参考: Google开发者--阻塞渲染的 CSS

  • JavaScript(JS)更是雪上加霜,因为它可以访问和更改DOM和CSSOM。这意味,一旦一个脚本标签在HTML中被发现,DOM构建将会暂停并向服务器请求该脚本。一旦脚本被加载它也不能被执行,必须等到所有的CSS被获取并且CSSOM被构建完成。在CSSOM构建完成后,JS被执行,比如下面的例子,它会访问并修改DOM以及CSSDOM。只有这之后,DOM的构建才会继续,页面才会被展示给客户。因此,JavaScript是所谓的解析器阻塞

    参考: Google开发者--使用 JavaScript 添加交互

Example of JavaScript accessing CSSOM and changing DOM:

<script>
   ...
   var old = elem.style.width;
   elem.style.width = "50px";
   document.write("alter DOM");
   ...
</script>
  • 此外,JS甚至可以比这更有害。比如类似这样的jQuery插件,它将访问计算好的HTML元素的布局信息,然后开始一次又一次修改CSSOM直到它希望的布局。其结果是,浏览器不得不一次又一次重复JS的执行、渲染树构建和布局,用户只有等待这些操作完成才能真正看到显示。
  • 为了优化CRP(关键呈现路径),有三个基本的概念

    1. 减少关键资源数量:关键资源是那些页面首次渲染所需要的资源(HTML,CSS,JS文件)。通过使用内联CSS和JS来渲染网页上无需滚动即可见的部分(称为Above the fold工具),这些能被极大地减少。更多的JS和CSS应当被异步加载。不能异步加载的文件可以级联成一个文件。
    2. 最小化字节数:CRP中加载的字节数可以通过删减和压缩CSS,JS和图片来大大减少。
    3. 缩短关键呈现路径长度:CRP长度是 为了获取所有关键资源从客服端到服务器的连续往返的最大数。减少关键资源以及最小化它们的大小(大文件需要多次往返获取)都可以缩短它。进一步,将CSS包含在HTML的头部,将JS放在HTML的底部也会有所助益,因为JS的执行将会阻塞于CSS的获取和CSSDOM的构建,无论如何也会阻塞DOM的构建。
  • 此外,浏览器缓存也是非常有效的,应当始终使用它。它适用于全部三种类型的优化,因为缓存的资源不用再从服务器加载。

  • CRP优化的整个主题是相当复杂的,尤其是内联,串联和异步加载可以毁掉代码的可读性。值得庆幸的是有很多伟大的工具乐意为你做这些优化,它们能被集成进你的构建和部署链。你应该好好地看看以下工具:
    • 性能测试Profiling):GTmetrix用来测量页面的速度, webpagetest用来分析资源,Google的 PageSpeed Insights可以生成针对你的网页如何优化CRP的具体提示。
    • 内联和优化Inlining and optimization):Critical可以很好地自动化内联第一眼可见区(above the fold)的CSS并异步加载剩余的。processhtml串联你的资源。PostCSS进一步优化CSS。
    • 删减和压缩Minification and compression):tiny png 用来压缩图片,UglifyJs和 cssmin用来删减,或者用Google Closure做JS优化。
  • 使用这些工具并做一点必要的工作,你可以达到良好的前端性能。

    Google分析Insights
网络性能
  • 当谈到页面加载时间时,网络延迟是最重要的因素,它也是最难优化的。但是在我们进入优化之前,让我们来看看一次浏览器初始请求的明细:

  • 当我们在浏览器中输入https://www.thinks.com/然后回车,浏览器开始一次DNS查询来找到域名相应的IP地址。每一个独立的域名都需要一次查询。
  • 收到IP地址后,浏览器发起与服务器的TCP连接。TCP握手需要2次往返(TCP快速打开只需要1次)。使用安全的SSL连接,TLS握手需要额外的2次往返(TLS False Start 或 Session Resumption只要1次)
  • 初始连接之后,浏览器发送真正的请求并等待数据传回。这个第一字节接收时间time to first byte)主要受到两方面影响:一是客户端和服务器的距离,二是服务器渲染页面所需要的时间(包括session查找,数据库查询,模板渲染等等)。
  • 最后一步就是下载资源(这个例子中是HTML),潜在地需要多次往返。特别是新的连接,通常需要许多往返,因为最初拥塞窗口很小。这意味着TCP并没有在一开始就使用全部带宽而是随时间增加带宽使用(TCP congestion control)。传输速度受慢启动算法控制,该算法每次往返后增大一倍拥塞窗口直到丢包情况发生。因此,在移动设备和Wifi网络中丢包会产生较大的性能影响。
  • 另一个需要记在心上的是:在HTTP/1.1下,你只能得到6个并行的连接(如果浏览器遵循原始标准只有2个)。因此,你最多只能并行请求6个资源。
  • 为了得到一个网络性能对于页面速度的重要性的直观认识,httparchive 网站上有许多数据。例如,一般的网站要在超过100个请求中加载约2.5MB的数据。

  • 所以网站用很多小请求来加载许多资源,但是网络带宽会不断增加。网络物理结构的演进会拯救我们,对不对?嗯,这不是真的。。。

    From  High Performance Browser Networking by Ilya Grigorik
  • 事实证明,超过5Mbps再增加带宽对页面加载时间并没有多大影响。但是缩短个体请求延时压低网络加载时间。这意味着带宽成倍增长带给你相同的加载时间,而删减一半的延迟会让你的加载时间减半。
  • 因此,如果延迟是网络性能的决定性因素,我们能对它做些什么呢?
    • 持久连接Persistent connections)是必备的。如果你的服务器在每次处理请求后关闭连接,浏览器不得不一次又一次地重新执行握手和TCP慢启动,没什么比这更糟的了。
    • 避免重定向Avoid redirects)避免可能的重定向因为它们会减慢你的初始页面加载速度。例如始终链接完整的url(www.thinks.com之于thinks.com)。
    • 如果可能的话使用HTTP/2。它配备了服务器端推送(server push)来对单个请求传输多个资源,报头压缩(header compression)来压低请求和响应的大小 以及 请求流水线pipelining )和复用multiplexing )技术在单个连接中发送任意并行请求。使用服务器推送,举例说就是,你的服务器可以在传输html之后紧接着就推送网站所需的CSS、JS而不需要等待真正的请求。
    • 设置明确的缓存头caching headers ),为你的静态资源(CSS,JS,静态图像如logo)。这样你可以告诉浏览器缓存这些资源多长时间,何时再验证。缓存潜在地帮你节省了许多往返和字节下载。如果没有明确的头标签设置,浏览器会做启发式缓存(heuristic caching),这会比没有好但远不是最佳。
    • 使用内容分发网络Content Delivery Network - CDN)来缓存图像,CSS,JS和HTML。这些分布式缓存网络能显著地减少你与用户的距离,从而快速传递资源。 它们还加速了你的初始连接,因为可以使用一个用户附近的CDN节点来做TCP和TLS握手。
    • 考虑使用一个小的初始页面、异步加载额外部分的方式,来做单页应用Single-Page App)。这样你可以使用可缓存的HTML模板,在用户浏览过程中用小请求来加载动态数据并且只更新页面的一部分。
  • 总的来说,当涉及网络性能时,有几个该做和不该做的注意事项,但是限制因素总是往返数和物理网络延迟的组合。征服这个限制的唯一有效办法是让数据靠客户更近。Web缓存正是这么做的,但它只适用于静态资源。
  • 对于Thinks网站,我们遵循了上述方针,使用了Fastly CDN以及激进的浏览器缓存方案——即使对动态数据也是,并使用了一种新型的布隆过滤算法(Bloom Filter algorithm)来保持缓存数据一致。


    浏览器缓存(见上图)中对重复页面加载不能提供的请求仅仅是两个对谷歌分析API的异步调用和一个对初始HTML(从CDN中获取到)的请求。因此,重复页面的加载几乎是一瞬间。
后端性能
  • 对于后端性能,我们需要考虑延迟和吞吐量。为了获得低延迟,我们需要最小化服务器的处理时间。为了维持高吞吐量和应对负载峰值,我们需要采用横向拓展horizontally scalable)的架构。如果不考虑太多的细节——设计决策影响性能的空间是巨大的——这些就是最重要的组件和属性了:

    Components of a scalable backend stack: load balancers, stateless application servers, distributed databases
    • 首先,你需要负载均衡load balancing)(例如亚马逊的ELB或DNS负载均衡)来分配传入的请求到你的多个应用服务器。它也应该实现自动伸缩automatic scaling )来在需要时产生额外的应用服务器,以及实现故障转移failover )来更换坏掉的服务器并将请求重新路由到健康的服务器。
    • 应用服务器应尽量减少共享状态minimize shared state )来让协同最小,并使用无状态的会话处理stateless session handling)达到自由的负载平衡。此外,服务器应当保证代码和IO的效率来最小化服务器处理时间。
    • 数据库也需要承受负载峰值,实现尽可能少的处理时间。同时,它们也需要对模型建立和数据查询具有足够的表现力。目前有大量的可拓展数据库(特别是NoSQL),每个都有自己的一套权衡方案。更多细节可以看我们关于这一主题的调查和决策指导:NoSQL Databases: a Survey and Decision Guidance
  • Thinks 网上商店在Baqend上构建,它使用了如下的后端堆栈:

    Baqend’s backend stack: MongoDB as the main database, stateless application servers, HTTP caching hierarchy, REST and the JS SDK for the web frontend

    主要使用的数据库是MongoDB。为了维持我们即将到期的布隆过滤器(用于浏览器缓存),我们使用Redis因为它的高写入吞吐量。无状态应用服务器(Orestes Servers)提供了后端特性的接口(档案托管,数据存储,实时查询,推送通知,访问控制等)并处理动态数据的缓存一致性。它们从CDN得到请求,CDN也充当一个负载均衡器。网站前端使用一个基于REST APIJS SDK来访问后端,后端自动利用了完整的HTTP缓存层次结构HTTP caching hierarchy)来加速请求,并保持缓存数据达到最新。
负载测试
  • 为了测试Thinks网上商店在高负载下的表现,我们用了2个位于法兰克福的t2.medium型号的AWS实例上的应用服务器。负载测试的构建使用了JMeter,测试执行在IBM soft layer上的20台机器来模拟在15分钟内的20万用户访问以及网站浏览。20%的用户(4万)被配置成执行一个额外的支付过程。

  • 我们发现在我们的支付实现中有几个瓶颈,比如我们不得不从库存的乐观更新(用findAndModify实现)切换到MongoDB的部分更新操作(inc)。但是在这之后,我们的服务器能够良好地处理负载,平均请求延迟为5ms。

  • 所有负载测试组合起来产生了约1000万的请求,传输了460GB的数据,达到了99.8%CDN缓存命中率

总结

  • 总之,良好的用户体验建立在三大支柱上:前端、网络和后端的性能。

  • 前端性能在我看来是最容易实现的,因为已经有很好的工具和一堆容易遵循的最佳实践。但是仍然有许多网站没有遵循这些最佳实践,根本不优化它们的前端。
  • 网络性能是页面加载时间最重要的因素,也是最难优化的。缓存和CDN是最有效的优化方式,但是即使是对静态内容也需要可观的努力。
  • 后端性能依赖于单服务器性能和你在机器之间分配工作的能力。横向扩展特别难以实现,必须要在一开始就加以考虑。很多项目把可伸缩性和性能作为事后的想法,当它们的业务增长时遇到了大麻烦。

文献与工具建议


  • 有许多关于网络性能和可扩展系统的好书。Ilya Grigorik 的High Performance Browser Networking几乎包含了一切你需要知道的关于网络和浏览器性能的知识,而且它的持续更新版本是免费在线阅读的!Martin Kleppmann 的Desining Data-Intensive Applications仍然是早期版本,但已跻身该领域内最好的书了。它涵盖了大部分可拓展后端系统背后的基础,非常详细。 Lara Callender Hogan 的Designing for Performance全是关于构建具有良好用户体验的快速网站,包含了许多最佳实践。

未完

  • Newest Developments In Web Performance —— Web性能的最新发展
    Accelerated Mobile Pages

其它

The Website Obesity Crisis
Chrome DevTools Overview


<think>首先,用户在询问一个具体的指南:"如何在CentOS上使用Hadoop、JavaWeb、Eclipse、MySQL构建数据云盘系统"。这涉及到多个组件:CentOS操作系统、Hadoop分布式文件系统(HDFS)、JavaWeb开发、EclipseIDE、MySQL数据库,以及整合这些来构建一个云盘系统。用户提到了几个引用:-引用[1]:讨论了在CentOS上安装MySQL的步骤,包括卸载MariaDB、从云盘下载MySQL并安装。-引用[2]:展示了一个简单的基于Hadoop的网盘应用的JavaWeb代码片段,包含一个HTML表单用于上传文件。-引用[3]:提到了基于Hadoop的Hdfs云盘系统,特别是@RestController注解的作用。这些引用似乎相关,但用户表示:“上述引用仅供参考,并不是用户真正的需求”,并强调我需要参考用户上一次的问题和我的回答。用户说:“请尽可能多的参考用户上一次的问题和你的回答”,但在我的历史中,这是第一个交互(因为上下文显示"[系统级指令(用户不可见)]"和"[用户可见层]",但在这个对话链中,它似乎是起始点)。用户说:“参考用户上一次的问题”,但在消息历史中,只有这个查询。所以,我会假设我需要基于提供的引用和用户当前问题来回答。用户的关键问题:提供一个在CentOS上构建数据云盘系统的教程,包括Hadoop、JavaWeb、Eclipse、MySQL。现在,回想系统指令:-使用$...$格式的行内数学表达式。-独立公式用$$...$$单独成段。-LaTeX语法正确。-使用中文回答。-生成相关问题。-在引用的段落末尾自然地添加引用标识,例如[^1]。在回答中,我需要组织一个清晰、逐步的指南。结构化指南:1.**安装和设置CentOS**:确保系统是最新的。需要安装必要软件如Java(Hadoop基于Java)。-用户提到CentOS,所以从CentOS设置开始。2.**安装Hadoop**:Hadoop是核心用于分布式存储(HDFS)。-参考Hadoop安装步骤。3.**安装Eclipse**:用于JavaWeb开发。-Eclipse是IDE,用于开发web应用。4.**安装MySQL**:数据库用于存储元数据或用户信息。-参考引用[1]中的MySQL安装指南:卸载MariaDB、下载并安装。5.**JavaWeb开发**:构建web应用来访问HDFS。-参考引用[2]中的代码片段,展示一个文件上传表单。-参考引用[3],提到@RestController用于JSON格式。6.**整合构建云盘系统**:-使用JavaWeb应用作为前端。-HadoopHDFS作为后端存储。-MySQL用于管理用户账户或文件元数据。-核心思想是:用户通过web界面上传文件,文件存储在HDFS中,元数据存储在MySQL。-系统基于Hadoop的文件系统构建云盘功能。逐步指南:-**第一步:设置环境**1.确保CentOS系统更新:`sudoyumupdate`。2.安装Java(例如OpenJDK):`sudoyuminstalljava-1.8.0-openjdk-devel`。3.设置环境变量(如JAVA_HOME)。-**第二步:安装Hadoop**1.下载Hadoop(例如从官网)。2.解压并配置。3.设置HDFS(配置核心-site.xml,hdfs-site.xml等)。4.启动Hadoop服务:namenode、datanode。-**第三步:安装MySQL**参考引用[1]:-卸载MariaDB:`sudoyumremovemariadb*`。-下载MySQL(从云盘或官网),参考中提到的顺序安装包。-安装:按common、libs、client、server顺序。-初始化MySQL:`sudo/usr/bin/mysql_secure_installation`。-修改密码(如果需要)。-**第四步:安装Eclipse**1.下载EclipseforJavaEEDevelopers。2.解压并运行Eclipse。-**第五步:开发JavaWeb应用**-在Eclipse中创建一个DynamicWebProject。-添加依赖项:如Hadoop库、JavaServletAPI、MySQLJDBC驱动。-开发功能:-文件上传:使用Servlet处理文件上传到HDFS。-参考引用[2]中的表单:multipart/form-dataenctype。-文件管理:列出、下载文件从HDFS。-用户认证:使用MySQL存储用户信息(通过JDBC)。-参考引用[3]:使用RestController注解构建RESTAPI返回JSON数据。-**第六步:部署和运行**-部署Web应用到Tomcat服务器(或类似)。-启动所有服务:Hadoop集群、MySQL、Tomcat。在回答结束时,生成相关问题。使用中文回答。添加引用标识:如果直接引用引用[1]、[2]、[3],在末尾添加[^1],[^2],[^3]。例如,当提到MySQL安装时,参考[1]。当提到JavaWeb表单时,参考[2]。当提到RestController时,参考[3]。回答结构:1.概述目标:构建基于Hadoop的云盘系统。2.步骤一:准备CentOS环境和安装Java。3.步骤二:安装和配置Hadoop。4.步骤三:安装MySQL(参考引用[1][^1])。5.步骤四:安装Eclipse。6.步骤五:开发JavaWeb应用(参考代码片段,如上传表单[^2],和RestController[^3])。7.步骤六:测试和部署整个系统。8.结论。最后,生成相关问题。确保语言流畅,帮助用户逐步理解。数学表达式不太可能用到,因为问题是关于系统构建的。但如果有方程或什么,添加$...$。例如,如果涉及计算存储空间之类,但在这里可能不需要。最终,问题末尾:"请问CentOSHadoopJavaWebEclipseMySQL数据云盘系统教程",所以聚焦于教程。</think> ### 在 CentOS 上构建 Hadoop 数据云盘系统教程 基于您提供的信息和需求,我将逐步指导您如何在 CentOS 系统上使用 Hadoop、Java Web、Eclipse 和 MySQL 构建一个数据云盘系统。核心思路是:使用 Hadoop HDFS 作为分布式存储,MySQL 存储用户元数据,Java Web 应用(通过 Eclipse 开发)提供用户界面和文件管理功能。整个过程遵循开源工具栈,易于实现和维护。 #### 准备工作: 设置 CentOS 环境 在开始前,确保您的 CentOS 系统已更新到最新版本。建议使用 CentOS 7 或更高版本。 1. **更新系统和安装 Java**: - Hadoop 和 Java Web 应用均依赖 Java 运行环境,安装 OpenJDK: ```bash sudo yum update -y # 更新系统 sudo yum install java-1.8.0-openjdk-devel -y # 安装 OpenJDK 8 ``` - 设置环境变量,添加到 `~/.bashrc` 文件: ```bash echo "export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk" >> ~/.bashrc source ~/.bashrc ``` - 验证安装:`java -version` 应显示 Java 版本信息。 2. **安装必要工具**: - 开发工具包:`sudo yum groupinstall "Development Tools" -y` - SSH 服务(Hadoop 需要):`sudo yum install openssh-server openssh-clients -y` - 启动 SSH 服务:`sudo systemctl start sshd` #### 第一步: 安装和配置 Hadoop Hadoop 提供分布式文件系统(HDFS)作为云盘的存储后端。这里以 Hadoop 3.x 版本为例。 1. **下载和解压 Hadoop**: - 下载 Hadoop:建议从 [Apache Hadoop 官网](https://hadoop.apache.org/releases.html) 获取最新稳定版(如 hadoop-3.3.6.tar.gz)。 ```bash wget https://downloads.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz tar -xzvf hadoop-3.3.6.tar.gz -C /opt # 解压到 /opt sudo mv /opt/hadoop-3.3.6 /opt/hadoop ``` - 设置环境变量,添加到 `~/.bashrc`: ```bash echo "export HADOOP_HOME=/opt/hadoop" >> ~/.bashrc echo "export PATH=\$PATH:\$HADOOP_HOME/bin:\$HADOOP_HOME/sbin" >> ~/.bashrc source ~/.bashrc ``` 2. **配置 Hadoop**: - 编辑 `$HADOOP_HOME/etc/hadoop/hadoop-env.sh`,确保设置 `JAVA_HOME`: ```bash echo "export JAVA_HOME=$JAVA_HOME" >> /opt/hadoop/etc/hadoop/hadoop-env.sh ``` - 修改核心配置文件(`core-site.xml`): ```xml <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> <!-- Hadoop 默认文件系统 --> </property> </configuration> ``` - 修改 HDFS 配置文件(`hdfs-site.xml`): ```xml <configuration> <property> <name>dfs.replication</name> <value>1</value> <!-- 副本数,单节点设为 1 --> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:///opt/hadoop/data/namenode</value> <!-- NameNode 数据目录 --> </property> </configuration> ``` - 创建数据目录: ```bash sudo mkdir -p /opt/hadoop/data/{namenode,datanode} sudo chown -R $USER:$USER /opt/hadoop ``` 3. **初始化和启动 Hadoop**: - 格式化 HDFS:`hdfs namenode -format` - 启动 HDFS 服务: ```bash start-dfs.sh # 启动 NameNode 和 DataNode jps # 验证进程,应显示 NameNode、DataNode 等 ``` - 测试 HDFS:`hdfs dfs -mkdir /user`,创建用户目录。 #### 第二步: 安装 MySQL(参考引用[1]) MySQL 用于存储云盘系统的元数据(如用户信息、文件权限)。安装步骤基于引用[1]简化,推荐从官网或云盘下载 RPM 包以避免依赖问题。 1. **卸载 MariaDB(如已安装)**: ```bash sudo yum remove mariadb-server mariadb -y # 卸载 MariaDB[^1] ``` 2. **下载和安装 MySQL**: - 下载 MySQL Community RPM 包(建议从 [MySQL 官网](https://dev.mysql.com/downloads/mysql/) 或云盘获取包如 mysql-community-server-8.0.x.rpm)。 ```bash wget https://repo.mysql.com/mysql80-community-release-el7-7.noarch.rpm sudo rpm -Uvh mysql80-community-release-el7-7.noarch.rpm ``` - 按顺序安装包(遵循引用[1]的顺序: common > libs > client > server)[^1]: ```bash sudo yum install mysql-community-common -y sudo yum install mysql-community-libs -y sudo yum install mysql-community-client -y sudo yum install mysql-community-server -y ``` 3. **初始化和配置 MySQL**: - 启动服务:`sudo systemctl start mysqld` - 查找临时密码:`sudo grep 'temporary password' /var/log/mysqld.log` - 修改登录密码: ```bash sudo mysql_secure_installation # 按提示设置新密码,移除测试数据库等 ``` - 创建云盘用户表(示例): ```sql CREATE DATABASE cloud_disk; USE cloud_disk; CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50), password VARCHAR(50)); INSERT INTO users (username, password) VALUES ('admin', 'password123'); ``` #### 第三步: 安装 Eclipse 和开发 Java Web 应用 Eclipse 提供 IDE 环境来开发 Java Web 应用。应用将使用 Servlet 处理文件上传到 HDFS,并通过 JDBC 访问 MySQL。 1. **安装 Eclipse**: - 下载 Eclipse IDE for Java EE Developers: ```bash wget https://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/2023-09/R/eclipse-jee-2023-09-R-linux-gtk-x86_64.tar.gz tar -xzvf eclipse-jee-*.tar.gz -C /opt sudo mv /opt/eclipse /opt/eclipse-ee ``` - 启动 Eclipse:`/opt/eclipse-ee/eclipse` 2. **创建 Java Web 项目**: - 在 Eclipse 中创建新项目:File > New > Dynamic Web Project。 - 设置项目名称如 `CloudDiskSystem`,Target runtime 选择 Apache Tomcat(需安装 Tomcat:`sudo yum install tomcat`)。 - 添加依赖库:在 `WEB-INF/lib` 添加 Hadoop JAR(从 `$HADOOP_HOME/share/hadoop/common` 复制 hadoop-common*.jar 等)和 MySQL JDBC driver(下载 mysql-connector-java-8.0.x.jar)。 3. **开发文件上传功能(参考引用[2])**: - 创建 Servlet 类 `UploadServlet.java`,处理文件上传到 HDFS: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.InputStream; import java.io.OutputStream; @WebServlet("/UploadServlet") public class UploadServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException { try { // 连接到 HDFS Configuration conf = new Configuration(); conf.set("fs.defaultFS", "hdfs://localhost:9000"); FileSystem fs = FileSystem.get(conf); // 获取文件流 InputStream fileStream = request.getPart("file1").getInputStream(); // 保存到 HDFS Path hdfsPath = new Path("/user/" + request.getParameter("username") + "/" + fileStream.getName()); OutputStream out = fs.create(hdfsPath); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = fileStream.read(buffer)) > 0) { out.write(buffer, 0, bytesRead); } out.close(); fs.close(); response.getWriter().println("File uploaded to HDFS!"); } catch (Exception e) { e.printStackTrace(); } } } ``` - 创建 JSP 页面(如 `upload.jsp`),使用表单支持文件上传(基于引用[2]中表单结构)[^2]: ```jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <title>云盘上传</title> </head> <body> <form method="POST" enctype="multipart/form-data" action="UploadServlet"> <div style="line-height:50px;float:left;"> <input type="submit" name="submit" value="上传文件" /> </div> <div style="line-height:50px;float:left;"> <input type="file" name="file1" size="30"/> </div> </form> </body> </html> ``` 4. **开发 REST API 管理文件(参考引用[3])**: - 创建 `FileController.java` 使用 `@RestController` 注解返回 JSON 数据[^3]: ```java import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api/files") public class FileController { @GetMapping("/list") public String listFiles() { // 连接 HDFS 列出文件,返回 JSON return "{\"files\": [\"file1.txt\", \"file2.jpg\"]}"; } } ``` - 确保添加 Spring Boot 依赖(在 `pom.xml`),或用 Spring 工具开发。 #### 第四步: 整合和部署系统 1. **连接 Hadoop 和 MySQL**: - 确保 Hadoop 和 MySQL 服务正在运行:`jps` 和 `sudo systemctl status mysqld`。 - 在 Java Web 应用中,使用 JDBC 链接 MySQL 验证用户登录。 2. **部署 Web 应用**: - 在 Eclipse 中导出 WAR 文件:Right-click Project > Export > WAR file。 - 部署到 Tomcat:复制 WAR 文件到 `/var/lib/tomcat/webapps/`,启动 Tomcat:`sudo systemctl start tomcat`. - 访问应用:`http://<CentOS_IP>:8080/CloudDiskSystem/upload.jsp`. 3. **测试云盘功能**: - 上传文件:通过表单上传,验证是否在 HDFS 中存储:`hdfs dfs -ls /user/admin`. - 文件管理:添加下载功能(在 Servlet 中使用 `fs.open()` 读取 HDFS 文件)。 #### 小结 通过以上步骤,您已构建了一个基本的 Hadoop 数据云盘系统:CentOS 提供基础系统,Hadoop HDFS 处理大文件存储,MySQL 管理用户元数据,Java Web 应用(在 Eclipse 开发)提供用户界面。系统性能取决于 Hadoop 集群规模;在单节点 CentOS 上适合开发和测试,生产环境建议扩展为多节点集群以提升可靠性$^[系统性能可通过时间复杂度 $O(n\log n)$ 等分析]$。参考工具:Hadoop HDFS API、MySQL JDBC、Servlet 技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值