搭建Hadoop集群(完全分布式运行模式)

news2024/11/15 11:44:20

目录

  • 一、准备模板机(最小化安装)
  • 二、配置一台纯净的模板机
    • 修改主机名
    • 固定IP地址
    • 通过yum安装方式安装必要的软件
    • 关闭防火墙且禁止自启
    • 修改hosts映射文件
    • 创建普通用户 并让他能用sudo命令
    • 在/opt下创建software和module
    • 完成
  • 三、搭建完全分布式运行模式
    • 3.1克隆第一台机器hadoop102 完成相应配置
      • 建议统一管理好
      • 修改hadoop102的主机名和IP地址
      • 之后 就可以用Xshell登录了
      • 在102上安装jdk并配置环境变量
      • 在102上安装hadoop
      • hadoop目录结构
      • 本地模式测试
    • 3.2克隆hadoop103 hadoop104 完成相应配置
      • 修改主机名和IP
      • 用scp分发102的软件给103和104
      • 编写集群分发脚本xsync
      • 分发my_env给103 104
    • 3.3Hadoop集群规划
    • 3.4修改Hadoop配置文件
      • Hadoop配置文件介绍
      • coresite.xml
      • hdfs-site.xml
      • yarn-site.xml
      • mapred-site.xml
      • 分发配置文件到103 104
    • 3.5群起/群停集群
      • 配置ssh免密登录
      • 配置workers文件
      • 格式化
      • 群起集群
      • 群停集群
      • 查看Web端界面
      • 完全分布式模式测试
      • 单点启动的指令

一、准备模板机(最小化安装)

安装Linux系统参考:安装Linux操作系统详细步骤(附VMware16+CentOS7下载地址)

  • 模板机只是为了将来克隆使用 这台磨板机安装之后 做常规化的统一配置 比如关闭防火墙 静态IP 安装必要的软件等
  • 为了更契合实际开发场景 需要创建一个普通用户 所以也需要配置普通用户能够使用sudo获得root权限
  • 把磨板机配置好 克隆三台出来 作为集群真正需要的机器

在这里插入图片描述
在这里插入图片描述

二、配置一台纯净的模板机

修改主机名

vi /ect/hostname
#主机名改完要重启才会生效 可以用hostname指令看看当前主机名是什么

固定IP地址

vi /etc/sysconfig/network-scripts/ifcfg-ens33

在这里插入图片描述

systemctl restart network #重启网络服务 就会生效

在这里插入图片描述

完成这些配置后
接下来的操作 就可以用xshell远程连接
最小化安装用着还是很别扭的

通过yum安装方式安装必要的软件

分别指令下面两条命令

yum install -y epel-release
yum install -y psmisc nc net-tools rsync vim lrzsz ntp libzstd openssl-static tree iotop git

关闭防火墙且禁止自启

systemctl stop firewalld
systemctl disable firewalld

修改hosts映射文件

改Windows为了Xshell连接能用主机名
在这里插入图片描述

改Linux
因为不同主机之间的通信 还是希望用主机名来通信而不是IP地址
vim /etc/hosts
在这里插入图片描述

创建普通用户 并让他能用sudo命令

在这里插入图片描述

这里还是要在root用户下的
在这里插入图片描述

在这里插入图片描述

在/opt下创建software和module

software放软件安装包
然后把软件解压到module里
在这里插入图片描述

修改所有者和所属组 因为前面说了 后面会用普通用户zcy来登录
在这里插入图片描述

完成

至此 纯净模板机就配置好了
接下来 他的作用就是克隆新的机器
然后完成对应的配置
开始搭建Hadoop集群

三、搭建完全分布式运行模式

3.1克隆第一台机器hadoop102 完成相应配置

建议统一管理好

  • 在hadoop102上 先安装一些必要的软件比如jdk hadoop 配置好hadoop环境 先了解一下本地模式
  • 然后注意 这里103 104机器 继续基于模板机来克隆 而不是基于hadoop102去克隆
  • 然后通过102 用Linux提供的分发技术 把102配置好的东西分发给104 103

克隆可以参考:
VMware16如何克隆虚拟机
在这里插入图片描述

修改hadoop102的主机名和IP地址

主机名改成hadoop102
IP地址改成.162
改完记得reboot才会生效
在这里插入图片描述

之后 就可以用Xshell登录了

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在102上安装jdk并配置环境变量

先把两个安装包传输到software下
在这里插入图片描述

解压jdk到上一层的module下
tar -zxvf jdk-8u212-linux-x64.tar.gz -C …/module/
在这里插入图片描述

配置jdk的环境变量
vim /etc/profile在这里插入图片描述
在这里插入图片描述

配置profile.sh
先 cd /etc/profile.d/在这里插入图片描述
在这里插入图片描述

重新加载一下/etc/profile 环境变量就会生效
(我曾经有一个疑问 为什么不是加载profile.d 会看前面才发现 profile它里面有代码来读取到profile.h下面的sh脚本)
在这里插入图片描述

在102上安装hadoop

先解压到module

tar -zxvf hadoop-3.1.3.tar.gz -C ../module/

在这里插入图片描述

sudo vim /etc/profile.d/my_env.sh

在这里插入图片描述

重新加载一下环境变量生效(重启也可以)
在这里插入图片描述

hadoop目录结构

  • bin目录:存放对Hadoop相关服务(HDFS,YARN)进行操作的脚本
  • etc目录:Hadoop的配置文件目录,存放Hadoop的配置文件
  • lib目录:存放Hadoop的本地库(对数据进行压缩解压缩功能)
  • sbin目录:存放启动或停止Hadoop相关服务的脚本
  • share目录:存放Hadoop的依赖jar包、文档、和官方案例

本地模式测试

Hadoop的运行模式介绍:

  • 本地模式:hadoop默认安装后启动就是本地模式 就是将来的数据存在Linux本地并且运行MR程序的时候也是在本地机器上运行

  • 伪分布式模式:伪分布式其实就只在一台机器上启动HDFS集群 启动YARN集群 并且数据存在HDFS集群上 以及运行MR程序也是在YARN上运行 计算后的结果也是输出到HDFS上 本质上就是利用一台服务器中多个java进程去模拟多个服务

  • 完全分布式:完全分布式其实就是多台机器上分别启动HDFS集群 启动YARN集群 并且数据存在HDFS集群上的以及运行MR程序也是在YARN上运行 计算后的结果也是输出到HDFS上

上面安装好之后
就可以跑本地模式了
在这里插入图片描述

3.2克隆hadoop103 hadoop104 完成相应配置

修改主机名和IP

克隆之后 先修改IP和主机名 再用Xshell连接
在这里插入图片描述

hadoop103的主机名改成hadoop103 IPADDR改成.163
hadoop104的主机名改成hadoop104 IPADDR改成.164
记得reboot生效
改完就可以用Xshell登录了
各服务器之间也能ping通
在这里插入图片描述

用scp分发102的软件给103和104

这个时候103 和 104上面都是没有jdk这些软件的 需要从102分发过来
前提:在 hadoop102 hadoop103 hadoop104 都已经创建好 /opt/module 和 /opt/software 两个目录(因为是模板机克隆的 所以我这里是有的)
并且已经把这两个目录修改为zcy:zcy
sudo chown zcy:zcy -R /opt/module
下面 再介绍另一种分发的方法 自己写一个脚本
可以选择这两种方式的中的一种

#在102上让102分发给103
#在hadoop102上执行:
scp -r ./* zcy@hadoop103:/opt/module/

#在103上让102分发给104
#在hadoop103上执行:
scp -r zcy@hadoop102:/opt/module/* zcy@hadoop104:/opt/module/

#当然 也可以在104上拉取102上的东西

编写集群分发脚本xsync

上面的分发方式 存在一定问题:如果集群机器特别多 怎么办?
这时候要是有一个脚本 执行它就遍历所有机器去同步分发就好了!!

去一台我们经常使用的机器上写这个脚本
而且希望该脚本能在任意位置执行
那也就要配置环境变量了!
在这里插入图片描述

那我把bin创建出来 在这里面写脚本!! 这样的话 就不需要我再手动配置环境变量了!! 这是对规则的合理利用
在这里插入图片描述

#!/bin/bash

#1. 判断参数个数
if [ $# -lt 1 ]
then
  echo "Not Enough Arguement!"
  #退出当前脚本
  exit
fi

#2. 遍历集群所有机器
for host in hadoop103 hadoop104
do
  #3. 遍历所有目录,挨个发送
  for file in $@
  do
    #4. 判断文件是否存在
    if [ -e $file ]
    then
      #5. 获取父目录 同时防止传参是软链接
      pdir=$(cd -P $(dirname $file); pwd)
      #6. 获取当前文件的名称 因为我也可能传绝对路径进来
      fname=$(basename $file)
      #7.登录目标机器 创建统一的目录结果
      ssh $host "mkdir -p $pdir"
      #8.依次把要分发的文件和目录进行分发
      rsync -av $pdir/$fname $host:$pdir
    else
      #文件不存在
      echo "$file does not exists!"
      exit
    fi
  done
done

分发my_env给103 104

zcy[普通用户]相对my_env文件进行分发(肯定有写操作)
应该看后三位 发现根本没有权限
所以不能用刚刚写的脚本
用scp手动发一下就行
在这里插入图片描述
在这里插入图片描述

分发完 同样要在103 104上source一下才生效
在这里插入图片描述

3.3Hadoop集群规划

HDFS集群和yarn集群包含多个服务
启动在哪个机器 由自己来决定(改配置文件就行)

  • NameNode和SecondaryNameNode不要安装在同一台服务器
  • ResourceManager很消耗内存 不要和NameNode SecondaryNameNode配置在同一台机器上
    在这里插入图片描述

3.4修改Hadoop配置文件

Hadoop配置文件介绍

集群规划完之后 就要搭建集群了(说白了就是要修改配置文件)
hadoop的默认配置文件:

  • core-default.xml
  • hdfs-default.xml
  • mapread-default.xml
  • yarn-default.xml

hadoop提供可自定义的配置文件:

  • core-site.xml
  • hdfs-site.xml
  • mapread-site.xml
  • yarn-site.xml

当Hadoop集群启动后 先加载默认配置 然后再加载自定义配置文件 自定义的配置信息会覆盖默认配置

coresite.xml

vim /opt/module/hadoop-3.1.3/etc/hadoop/coresite.xml

<configuration>
        <!-- 指定NameNode的地址 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop102:9820</value>
    </property>
       <!-- 指定hadoop数据的存储目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/module/hadoop-3.1.3/data</value>
    </property>

       <!-- 配置HDFS网页登录使用的静态用户为zcy -->
    <property>
        <name>hadoop.http.staticuser.user</name>
        <value>zcy</value>
    </property>

       <!-- 配置该atguigu(superUser)允许通过代理访问的主机节点 -->
    <property>
        <name>hadoop.proxyuser.zcy.hosts</name>
        <value>*</value>
    </property>
           <!-- 配置该atguigu(superUser)允许通过代理用户所属组 -->
    <property>
        <name>hadoop.proxyuser.zcy.groups</name>
        <value>*</value>
    </property>
           <!-- 配置该atguigu(superUser)允许通过代理的用户-->
    <property>
        <name>hadoop.proxyuser.zcy.groups</name>
        <value>*</value>
   </property>
</configuration>

hdfs-site.xml

vim /opt/module/hadoop-3.1.3/etc/hadoop/hdfs-site.xml

	<!-- nn web端访问地址-->
	<property>
        <name>dfs.namenode.http-address</name>
        <value>hadoop102:9870</value>
    </property>
	<!-- 2nn web端访问地址-->
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop104:9868</value>
    </property>

yarn-site.xml

vim /opt/module/hadoop-3.1.3/etc/hadoop/yarn-site.xml

        <!-- 指定MR走shuffle -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
<!-- 指定ResourceManager的地址-->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop103</value>
    </property>
<!-- 环境变量的继承 -->
    <property>
        <name>yarn.nodemanager.env-whitelist</name>
        <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
    </property>
<!-- yarn容器允许分配的最大最小内存 -->
    <property>
        <name>yarn.scheduler.minimum-allocation-mb</name>
        <value>512</value>
    </property>
    <property>
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>4096</value>
   </property>
<!-- yarn容器允许管理的物理内存大小 -->
    <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>4096</value>
    </property>
<!-- 关闭yarn对物理内存和虚拟内存的限制检查 -->
    <property>
        <name>yarn.nodemanager.pmem-check-enabled</name>
        <value>false</value>
    </property>
    <property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
    </property>

mapred-site.xml

vim /opt/module/hadoop-3.1.3/etc/hadoop/mapred-site.xml

	<!-- 指定MapReduce程序运行在Yarn上 -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>

分发配置文件到103 104

在这里插入图片描述

在这里插入图片描述

3.5群起/群停集群

配置ssh免密登录

  • 之前做一些操作 经常需要我们输入密码 不方便
  • 配置免密登录之后 才能使用Hadoop提供的群起群停脚本
    在这里插入图片描述

在102上 先生成密钥对
在这里插入图片描述

然后给102 103 104 都授权
在这里插入图片描述
在这里插入图片描述

上面两步 同样的操作 在103 104都做一遍
在103上 先生成密钥对 然后授权给102 103 104
在104上 先生成密钥对 然后授权给102 103 104

配置workers文件

当我们用脚本启动的时候
肯定是在一台机器上执行这个脚本就行了
假如在102上群起hdfs
启动的时候一定会读取Hadoop的配置文件 它就知道在102上要启动nn
但是并没有指定在哪台机器启动dn(yarn的nm也是一样的)
这个时候 脚本是通过读取
/opt/module/hadoop-3.1.3/etc/hadoop/workers来确定要在哪里启动dn和nm

在这里插入图片描述
别忘记分发workers文件
在这里插入图片描述

格式化

如果集群是第一次启动,需要在hadoop102节点格式化NameNode

如果集群在运行过程中报错 需要重新格式化NameNode的话 一定要先停止namenode和datanode进程 并且要删除所有机器的data和logs目录 然后再进行格式化
因为格式化NameNode 会产生新的集群id 导致NameNode和DataNode的集群id不一致 集群找不到已往数据

hdfs namenode -format

在这里插入图片描述

群起集群

这些群起群停的脚本 都在sbin里
在这里插入图片描述
根据自己集群的规划来启动hdfs和yarn(先后无所谓 但是要在正确的位置执行)

在hadoop102(nn在这)上启动hdfs start-dfs.sh
在这里插入图片描述

在hadoop103(rm在这)上启动yarn start-yarn.sh
在这里插入图片描述

群停集群

在hadoop102(nn在这)上停止hdfs stop-dfs.sh
在这里插入图片描述

在hadoop103(rm在这)上启动yarn stop-yarn.sh
在这里插入图片描述

查看Web端界面

http://hadoop102:9870
Web端查看HDFS的NameNode 查看HDFS上存储的数据信息

http://hadoop103:8088
Web端查看YARN的ResourceManager 查看YARN上运行的Job信息

完全分布式模式测试

在这里插入图片描述

在这里插入图片描述


这里就有一个疑问
为什么同样的测试代码
这次就跑去找HDFS上的数据而不是本地Linux的数据了呢?
这和配置文件有关
在这里插入图片描述

在这里插入图片描述


本地模式:
/wcinput被解析成file:///wcinput(配置文件没改 默认)

hadoop jar share/hadoop/...jar wordcount file:///wcinput file:///wcoutput

完全分布式模式:
/wcinput被解析成hdfs://hadoop102:9820/wcinput
/wcoutput被解析成hdfs://hadoop102:9820/wcoutput

hadoop jar share/hadoop/...jar wordcount hdfs://hadoop102:9820/wcinput hdfs://hadoop102:9820/wcoutput

当MR程序在集群运行的时候
/代表的是HDFS的根目录 这是有core-site.xml中的配置信息决定的

			<property>
				<name>fs.defaultFS</name>
				<value>hdfs://hadoop102:9820</value>
		    </property>

单点启动的指令

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1528369.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024-3-18-C++day6作业

1>思维导图 2>试编程 要求: 封装一个动物的基类&#xff0c;类中有私有成员&#xff1a;姓名&#xff0c;颜色&#xff0c;指针成员年纪 再封装一个狗这样类&#xff0c;共有继承于动物类&#xff0c;自己拓展的私有成员有&#xff1a;指针成员&#xff1a;腿的个数&a…

面试算法-52-对称二叉树

题目 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 解 class Solution {public boolean isSymmetric(TreeNode root) {return dfs(root, root);}public boolean dfs(Tr…

长安链正式发布三周年,技术更迭支撑产业变革

导语&#xff1a; 2024年1月27日长安链正式发布三周年&#xff0c;开源社区借开年之际与大家一同回顾长安链三年来的技术发展历程&#xff0c;每一个里程碑的建设都得益于与长安链同行的合作伙伴与开发者&#xff0c;希望在2024年可以共同携手继往开来&#xff0c;为数字经济发…

第三门课:结构化机器学习项目-机器学习策略

文章目录 1 机器学习策略一1.1 为什么是ML策略&#xff1f;1.2 正交化1.3 单一数字评估指标1.4 满足和优化指标1.5 训练、开发及测试集划分1.6 开发集和测试集的大小1.7 什么时候改变开发、测试集和指标&#xff1f;1.8 为什么是人的表现&#xff1f;1.9 可避免偏差1.10 理解人…

STM32第九节(中级篇):RCC(第三节)—— 使用HSE配置系统时钟并使用MCO输出监控系统时钟

前言 这节课我们开始学习使用HSE配置系统时钟并使用MCO输出监控系统时钟&#xff0c;上节课我们讲了固件库里的系统时钟配置函数&#xff0c;是机器写的&#xff0c;我们现在自己来写一个。 STM32第九节&#xff08;中级篇&#xff09;&#xff1a;RCC&#xff08;第三节&…

【人工智能】Gitee AI 天数智芯有奖体验开源AI模型,一定能有所收货,快来体验吧

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章。 这是《人工智能》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 目录 前言两大赛道天数智芯1.模型地址2.天数智芯专区3.选择模型4.模型详情页5.部署模型6.成功部署7.执行例子8.移除模型 千模盲…

被大家低估的Excel函数扫地僧choose函数

今天我们要跟大家介绍Excel函数界的又一个世外高手——引用函数CHOOSE。 首先来看下它的基本语法&#xff1a; CHOOSE(索引值,参数1,[参数2],…[参数254]) CHOOSE函数主要用于根据索引值从一组数据中返回相应位置的数值。索引值是介于1到254之间的数字&#xff0c;或者是包含…

2024全网最全的完整的性能测试流程!

完整的性能测试流程 一、准备工作 在什么阶段开展性能测试工作&#xff1f;一般情况下&#xff0c;是在被测系统已完成功能测试、系统趋于稳定的情况下&#xff0c;才会进行性能测试。 1. 组建测试团队 根据被测系统的实际情况&#xff0c;组建一个性能测试团队&#xff0c;团…

[QJS xmake] 非常简单地在Windows下编译QuickJS!

文章目录 前言准备C编译器xmake编译包 工程准备修改版本号第一遍编译第二遍编译效果 前言 quickjs是个很厉害的东西啊&#xff0c;我一直想编译一下的&#xff0c;奈何一直没成功。现在找了点时间成功编译了&#xff0c;写篇文章记录一下。当前版本&#xff1a;2024-1-13 应该…

STM32CubeIDE基础学习-LED闪烁实验

STM32CubeIDE基础学习-LED闪烁实验 文章目录 STM32CubeIDE基础学习-LED闪烁实验前言第1章 硬件介绍第2章 新建工程2.1 基础工程配置部分2.2 工程外设配置部分2.3 生成工程代码部分2.4 输出HEX文件、编译下载 第3章 代码编写3.1 方式1&#xff1a;IO翻转3.2 方式2&#xff1a;调…

“西安大重澳生物科技有限公司”——甄选优质企业品牌入围央媒

西安大重澳生物科技有限公司&#xff0c;一家专注于生物科技研发的企业&#xff0c;自2017年成立以来&#xff0c;致力于开发革命性的肤用肽制剂产品。近日&#xff0c;成功入围央视新媒体直播盛典。在持续的创新与努力下&#xff0c;畅夫泰R畅肤肽品牌已成为备受瞩目的名副其实…

园区配电监测信息系统

园区配电监测信息系统是一款集成了高科技、数据分析和管理的系统&#xff0c;旨在实时监测和控制园区内的电力供应&#xff0c;提高电力使用效率&#xff0c;减少能源浪费&#xff0c;确保电力安全。该系统通过现代通信技术、自动控制技术和计算机技术&#xff0c;实现对园区配…

码云简化版使用教程

码云简化版使用教程 ①创建本地项目 ②在本地项目根目录下创建git相关目录及文件 ③在码云上创建新的仓库 ④在本地项目中配置仓库地址&#xff0c;提交项目内容 下面直接从第二步开始讲解 在本地项目根目录下创建git相关目录及文件 1、打开项目根目录&#xff0c;进入cmd界…

Huggingface 笔记:大模型(Gemma2B,Gemma 7B)部署+基本使用

1 部署 1.1 申请权限 在huggingface的gemma界面&#xff0c;点击“term”以申请gemma访问权限 https://huggingface.co/google/gemma-7b 然后接受条款 1.2 添加hugging对应的token 如果直接用gemma提供的代码&#xff0c;会出现如下问题&#xff1a; from transformers i…

邮箱验证码api接口申请流程?有哪些条件?

邮箱验证码API服务如何选择&#xff1f;怎么正确设置邮箱验证码&#xff1f; 邮箱验证码API接口在保障用户账号安全、提高用户体验方面发挥着至关重要的作用。AokSend将详细介绍邮箱验证码API接口的申请流程&#xff0c;帮助您顺利集成这一功能&#xff0c;增强应用的安全性。…

【ADF4351】使用FPGA进行SPI寄存器配置、使用FPGA计算各个频率的频点,ADF4351配置程序

简介 特性 输出频率范围&#xff1a;35 MHz至4,400 MHz 小数N分频频率合成器和整数N分频频率合成器 具有低相位噪声的VCO 可编程的1/2/4/8/16/32/64分频输出 典型抖动&#xff1a;0.3 ps rms EVM(典型值&#xff0c;2.1 GHz)&#xff1a; 0.4% 电源&#xff1a;3.0 V至3.6 V …

基于spring boot框架的发艺美发店管理系统

摘 要 系统根据现有的管理模块进行开发和扩展&#xff0c;采用面向对象的开发的思想和结构化的开发方法对发艺美发店管理的现状进行系统调查。采用结构化的分析设计&#xff0c;该方法要求结合一定的图表&#xff0c;在模块化的基础上进行系统的开发工作。在设计中采用“自下而…

算法详解——选择排序和冒泡排序

一、选择排序 选择排序算法的执行过程是这样的&#xff1a;首先&#xff0c;算法遍历整个列表以确定最小的元素&#xff0c;接着&#xff0c;这个最小的元素被置换到列表的开头&#xff0c;确保它被放置在其应有的有序位置上。接下来&#xff0c;从列表的第二个元素开始&#x…

Java进阶 Maven基础

资料格式 配置文件 com.itheima Java代码 Statement stat con.createStatement(); 示例 com.itheima 命令 mvn test - Maven简介 传统项目管理状态分析 Maven 是什么 Maven的本质是一个项目管理工具&#xff0c;将项目开发过程抽象成一个项目对象模型&#xff08;POM&…

如何使用phpStudy在Windows系统部署静态站点并实现无公网IP远程访问

文章目录 使用工具1. 本地搭建web网站1.1 下载phpstudy后解压并安装1.2 打开默认站点&#xff0c;测试1.3 下载静态演示站点1.4 打开站点根目录1.5 复制演示站点到站网根目录1.6 在浏览器中&#xff0c;查看演示效果。 2. 将本地web网站发布到公网2.1 安装cpolar内网穿透2.2 映…