zoukankan      html  css  js  c++  java
  • CDH5.8.2最详细安装教程

    1 软件准备

    安装环境:系统是CentOS7,64位,安装过程中的所有软件需适应这个系统。本文是使用root用户安装。

    使用linux命令可查看自己的操作系统:

    注意:如果在虚拟机上安装CentOS7,使用了最小安装,在启动CM的时候可能可能会报pstree找不到的错误。

    1 [root@master ~]# uname -a
    2 Linux master 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

    注意:本文中的linux命令如果直接复制执行容易导致不可用。

    整体把握:对所有节点:解压cm到/opt目录下,解压后会生成两个目录

    1、cloudera  

    2、cm-5.8.2

    其中cloudera目录下有两个空目录csd 和 parcel-repo ,其中parcel-repo是用来存放parcels(三个)文件的

    或者也可以仅在master上解压,然后scp到其它节点。

    所以,master需要手动安装的是CM和parels(三个文件), 而slave只需要安装CM, 在CDH初始化的过程中会自动把parces等文件复制到slave节点上。

    集群节点设定:

    master,slave01 ,slave02,slave03

    1.1 离线下载CDH和CM软件包

    以下软件最好先离线下载好:

    (1)到官网下载CDH的parcels,包括三个文件(每个版本都需要对应的以下三个文件),这三个文件是CDH主程序运行包,所有hadoop框架就在这些包中,仅需要在hadoop集群上的master节点上安装的:

    CDH-5.8.2-1.cdh5.8.2.p0.3-el7.parcel

    CDH-5.8.2-1.cdh5.8.2.p0.3-el7.parcel.sha1

    manifest.json

    (2)在官网下载CDH管理包CM,这个是在hadoop集群的所有节点上都需要安装的管理集群的软件包。

    cloudera-manager-centos7-cm5.8.2_x86_64.tar.gz

    (3) CDH依赖jdk,需要下载比较新的版本的jdk,本安装使用1.8版本:需要在hadoop集群的所有节点上安装jdk。

    jdk-8u45-linux-x64.tar.gz

    (4)安装mysql数据库服务,至少需要一个节点安装mysql数据库,为了平衡集群压力,可以在所有节点安装msyql服务,把有些服务分散放在其它节点上。 mysql服务的安装可能有多种方式。本教程通过rpm和yum结合的方式。需要注意:mysql数据库需要和(5)中的java驱动版本匹配。(可以参考博文:https://www.cnblogs.com/junzi/p/6893122.html

    (5)在安装了mysql服务的节点上安装mysql数据库的java驱动程序:

    mysql-connector-java-5.1.46.tar.gz

    2 基础环境搭建

    2.1 创建一台linux虚拟主机,我的是CentOS7系统

    (1)VMware中新建一台虚拟linux电脑。建立过程中一定要记录下来IP,子网掩码,网关,DNS 。推荐虚拟机配置如下

    (2)开机后使用ip add命令查看ip等信息

    (3)更新yum源。执行命令:yum -y update 。如果更新或下载的网速较慢,可以更换为阿里的yum源或网易的yum源,这些国内的源。阿里云的yum源地址:

    文件下载地址: http://mirrors.aliyun.com/repo/Centos-7.repo

    备份并替换系统的repo文件

    cp Centos-7.repo /etc/yum.repos.d/ 
    cd /etc/yum.repos.d/ 
    mv CentOS-Base.repo CentOS-Base.repo.bak 
    mv Centos-7.repo CentOS-Base.repo
    #更新
    yum clean all 
    #服务器的包信息下载到本地电脑缓存起来
    yum makecache 
    yum update -y

    (4) 修改hostnamemaster 。使用命令:

    hostnamectl set-hostname master
    #使用hostname命令查看生效
    master

     

    (5)修改静态IP。(省略)

    (6)关闭防火墙

    #查看防火墙状态:
    firewall-cmd --state
    #关闭防火墙:
    systemctl stop firewalld.service
    #禁止防火墙开机启动: 
    systemctl disable firewalld.service
    #查看服务是否开机启动: 
    systemctl is-enabled firewalld.service

    (7)关闭SELINUX

    #查看关闭状态
    /usr/sbin/sestatus -v
    #关闭方法
    vi /etc/selinux/config
    #修改文件里的SELINUX=disabled

    (8)打开句柄限制,使用进入编辑配置文件命令:

    vi /etc/security/limits.conf
    #根据当前用户名,添加
    root soft nproc 20470
    root hard nproc 163840
    root soft nofile 10240
    root hard nofile 655360
    root soft stack 10240
    #执行命令,编辑login配置文件
    vi /etc/pam.d/login
    #添加
    session    required     pam_limits.so

    (9)修改hosts文件。此步骤需要最好提前安排好其它节点的ip和hostname,提前添加到hosts配置文件中。在后面的步骤中能省略

    示例:

     

    #执行命令: 
    vi /etc/hosts
    #添加信息:
    192.168.30.136 master
    192.168.30.137 slave01
    192.168.30.138 slave02
    192.168.30.139 slave03

     

    (10)如果是root用户,需要各节点的root用户的ssh。则需要额外修改一下配置:允许root用户ssh,且不需要密码。

    #执行命令:
    vi /etc/ssh/sshd_config
    #调整PermitRootLogin参数值为yes

    调整PermitRootLogin参数值为yes,并打开选项

     ②PermitEmptyPasswords选项打开,并修改值为yes

    需要重启ssh服务:

    service sshd restart 
    # 或者   
    /etc/initd.d/sshd restart

    2.2 克隆集群所需的机器

     

    将以上2.1操作的主机作为master主机,完整克隆机器master, 克隆出来3台节点机器。三台节点机的hostname分别设定为:slave01 ,  slave02 ,  slave03。对所有节点机器,slave01 ,  slave02 ,  slave03。分别设置静态ip,执行命令。

    #修改主机名
    hostnamectl set-hostname slave0x
    #修改静态IP,修改ip分别为137,138,139等指定ip
    vi /etc/sysconfig/network-scripts/ifcfg-ens33

    2.3 打通master到其它节点的root用户的ssh

    ssh可以使用root用户,也可以使用非root用户。本教程使用root用户安装,执行root的ssh配置。CDH的ssh配置,仅需要master的单向ssh即可。即:master可以免密访问其它slave节点。以下所有操作都是使用root用户。感觉建立一个hadoop用户,使用hadoop用户安装比较好。但是如果使用非root用户,需要配置非root用户和root用户的免密切换。使用root用户安装会更顺利,不会有权限问题。但即使是root用户,在CDH中使用命令行的时候,也需要非root用户,比如hdfs用户,yarn用户。

    • 登陆master节点

    执行命令,产生密钥

    ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
    cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
    • 登陆其它slave节点
    #在当前节点的当前用户下生成.ssh目录
    ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
    • 再登陆master节点
    #执行远程复制命令,将master的公钥放在其它slave节点上
    scp ~/.ssh/authorized_keys root@slave0X:~/.ssh/
    • 再登陆所有节点(包括master和slaves)
    #修改目录权限
    chmod 600 ~/.ssh/authorized_keys
    chmod 700 ~/.ssh

    最后,验证ssh命令是否生效。在master上分别免密登陆所有节点,包括自己。

    2.4下载安装所需辅助软件或有用工具

    所有集群的节点创建好后,并且分配了静态ip后,开始执行安装。【注意:软件安装需要在所有节点上分别独立执行。如果是先安装再克隆的话可能在后续中会报各种惊喜的错误】。这些软件不一定全部会使用到,感兴趣可以仔细研究。为了方便,我把这些软件作为大数据应用上linux的常用软件。总之,软件有冗余,也是为了防止在安装和使用CDH的时候不报错。自定义安装某些常用工具,执行命令:

    yum install -y openssh-server vim gcc gcc-c++ glibc-headers bzip2-devel lzo-devel curl wget openssh-clients zlib-devel autoconf automake cmake libtool openssl-devel fuse-devel snappy-devel telnet unzip zip net-tools.x86_64 firewalld systemd lrzsz bzip2
    #安装第二批依赖包(即使与前面有重复也不影响)
    yum -y install chkconfig python bind-utils psmisc libxslt zlib sqlite cyrus-sasl-plain cyrus-sasl-gssapi fuse fuse-libs redhat-lsb

     2.5 在所有节点上安装jdk

    需要在集群的所有节点上安装jdk,【登录所有节点】在所有节点上操作:

    #查看是否自带OpenJDK:
    rpm -qa | grep java
    #如果有,卸载自带的JDK
    rpm -e --nodeps 包名

    开始安装jdk:

    • 情况1:可以使用rpm安装包安装:

         先离线下载rpm安装包 jdk-8u45-linux-x64.rpm  /usr/local/src中。执行命令:

     

    rpm -ivh jdk-8u145-linux-x64.rpm
    #-ivh:安装时显示安装进度
    #安装目录默认在  /usr/java, 配置环境变量在 /etc/profile 文件中,在文件尾部追加环境变量
    export JAVA_HOME=/usr/java/jdk1.8.0_145
    export JRE_HOME=$JAVA_HOME/jre
    export PATH=$PATH:$JAVA_HOME/bin
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    • 情况2: 使用离线安装包jdk-8u45-linux-x64.tar.gz

    cd /usr/local/src
    #上传安装包
    rz
    #解压
    tar –xzf /usr/local/src/jdk-8u45-linux-x64.tar.gz –C /usr/java/
    #配置环境变量
    vim /etc/profile
    #在文件末尾添加配置信息:
    export JAVA_HOME=/usr/java/jdk1.8.0_145
    export JRE_HOME=$JAVA_HOME/jre
    export PATH=$PATH:$JAVA_HOME/bin
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

    以上两种情况保存后刷新,执行命令:

    source /etc/profile

    完成后,在所有节点上验证jdk是否安装成功:执行命令:

     

    java -version

     

    2.6 安装MySQL服务

    只需要在master节点上安装mysql服务。CDH的配置依赖mysql数据库,当然也可以使用Oracle数据库。

    注意:最好在每个节点上都安装mysql服务,因为有些hadoop的组件的服务依赖数据库,这样可以把这个组件的服务安装到任何一个节点上,分担master节点的压力。

     【登陆所有节点,本次在所有节点上都安装mysql】

    #进入资源目录
    cd /usr/local/src
    #获取mysql源安装包
    wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm 
    #安装mysql源
    rpm -ivh mysql57-community-release-el7-11.noarch.rpm
    #检查mysql源是否安装成功
    yum repolist enabled | grep "mysql.*-community.*"
    #用yum命令安装mysql
    yum install mysql-community-server
    #配置mysql的文件目录,查看MYSQL配置文件加载顺序:
    mysqld --help --verbose | grep -A1 -B1 cnf

      修改/etc/my.cnf 配置文件内的文件目录

    datadir=/data/mysql/data
    sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    log-error=/data/mysql/log/mysqld.log
     
    其中:
    SQL_MODE:通过对其正确的设置可以完成一些约束检查的工作,设置时,在配置文件my.cnf 中配置进行全局的设置。
    STRICT_TRANS_TALES(严格模式):
            只对支持事务的表启用严格模式
    NO_AUTO_CREATE_USER:
            禁止GRANT创建密码为空的用户。
    NO_ENGINE_SUBSTITUTION:
            启用后,若需要的存储引擎被禁用或未编译,则抛出错误;未启用时将用默认的存储引擎代替,并抛出一个异常。

     创建mysql文件目录

    [root@localhost jar]# mkdir -p /data/mysql/data
    [root@localhost jar]# mkdir -p /data/mysql/log

    生成首次登录随机密码

    mysqld --initialize
    通过上面命令会在 /data/mysql/log/mysqld.log 中生成随机码,随机码用来首次登录mysql。
    ujkq0>4*/yMD

     修改mysql 文件目录所有者为 mysql 用户

    chown -R mysql:mysql /data/mysql

    启动mysql

    systemctl start mysqld.service

    在使用启动命令后如果报错: Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.

    可能是没有关闭SELinux。 解决办法:vim /etc/selinux/config    修改SELINUX=disabled  。然后重启即可

    关闭并重启mysql

    systemctl stop mysqld.service
    systemctl start mysqld.service

    如果再次启动报错,就重启Linux 系统。

    用生成的随机密码登录mysql

    mysql -uroot -p'ujkq0>4*/yMD'

    登录后进入mysql 命令行

    卸载mysql

    如果启动报错,根据错误查看原因,如果实在解决不了,卸载mysql 重新装。
    查看已经安装过的组件
    rpm -qa | grep -i mysql

     

     用yum -y remove 卸载所有mysql

    yum -y remove mysql57-community-release-el7-11.noarch yum -y remove mysql-community-common-5.7.19-1.el7.x86_64
    卸载后再用 rpm -qa | grep -i mysql 查看,直至全部卸载
    删除/data/mysql 目录
    rm -rf /data/mysql

    可参考: http://www.cnblogs.com/wy123/archive/2017/06/02/6932166.html

    修改ROOT用户密码

    用生成的随机密码登录进入 mysql 命令行后,需要重置密码。重置密码前,先查看validate_password插件是否安装,可通过查看参数,如果没有安装,则输出将为空。
    SHOW VARIABLES LIKE 'validate_password%';

    如果不为空,在重置时不想密码设置得那么复杂。需要设置validate_password_policy 参数:

    set global validate_password_policy=0;
    这样,判断密码的标准就基于密码的长度了。这个由validate_password_length参数来决定。
    validate_password_length默认是8所以密码长度必须大于8。
    如果为空,可直接设置密码,密码长度可小于8。
    设置密码:
    set password=PASSWORD('12345678'); 

     设置完密码后,需要用新密码重新登录

     修改user表,把Host表内容修改为%

    进入mysql

    use mysql;
    update user set host='%' where host='localhost';
    -- 删除root用户的其他host

    创建CDH相关数据库

    create database hive DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
    create database amon DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
    create database oozie DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
    create database hue default charset utf8 collate utf8_general_ci; -- 授权: grant all privileges on *.* to 'root'@'%' identified by '12345678' with grant option; flush privileges;

     2.7 ntp时钟同步(必须root用户)

     集群设置:master是管理机,所有其它slave节点不能连网同步时间,仅通过与master主机连接实现与master的时间同步。在所有节点上安装ntp服务。在master节点上开通ntp服务器功能,提供同步时间。参考博文:https://www.cnblogs.com/harrymore/p/9566229.html

     【登录所有节点,包括master和slaves】

    (1)检查ntp是否安装

    rpm -qa|grep ntp

    (2)如果没有安装,进行安装

    yum -y install ntp

    (3)修改ntp配置文件

    【登录master节点】

    vi /etc/ntp.conf

    修改内容如下:

    a) 修改1(授权192.168.1.0网段上的所有机器可以从这台机器上查询和同步时间)

    #restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap 修改为
    restrict 192.168.30.0 mask 255.255.255.0 nomodify notrap
    #ip地址根据自己的网段进行配置

    b) 修改2(集群在局域网中,不使用其他的网络时间

    server 0.centos.pool.ntp.org iburst
    server 1.centos.pool.ntp.org iburst
    server 2.centos.pool.ntp.org iburst
    server 3.centos.pool.ntp.org iburst  为
    #server 0.centos.pool.ntp.org iburst
    #server 1.centos.pool.ntp.org iburst
    #server 2.centos.pool.ntp.org iburst
    #server 3.centos.pool.ntp.org iburst

    c) 添加3 (当该节点丢失网络连接,依然可以作为时间服务器为集群中的其他节点提供时间同步

    server 127.127.1.0
    fudge 127.127.1.0 stratum 10

    d) 修改/etc/sysconfig/ntpd 文件

    vim /etc/sysconfig/ntpd
    #增加内容如下(让硬件时间与系统时间一起同步)
    SYNC_HWCLOCK=yes

    e) 重新启动ntpd服务

    service ntpd status
    service ntpd start
    #在master上设置ntpd服务开机启动:
    chkconfig ntpd on

    【登录其它所有slaves节点上】

    a) 在slave节点上设置ntpd服务开启,且开机启动

    #在slave节点上设置ntpd服务关闭,且关闭开机启动
    service ntpd start
    chkconfig ntpd on

    b) 其它slave节点的同步设置,同步master的时间 【必须root用户操作】

    #配置10分钟与时间服务器同步一次
    crontab –e
    #编写定时任务如下:
    */10 * * * * /usr/sbin/ntpdate master
    #修改任意机器的时间,验证同步功能
    date -s "2017-9-11 11:11:11"
    #十分钟后查看机器是否与时间服务器同步
    date

     遇到的问题:以上ntp服务配置完成后,可能在CM管理界面会出现slaves节点的 “时钟偏差” 报错提示。虽然设定了定时同步时间,但是CM会检查每个节点上的ntp服务是否使用,因为以上的配置中我们关闭了。之所以关闭也是因为,如果开启了ntp服务,那么在从节点上执行ntpdate master的命令时会报错:

    [root@slave01 ~]# ntpdate master
    19 Dec 22:07:14 ntpdate[9787]: the NTP socket is in use, exiting

    可能是ntp的端口冲突问题。解决办法:

    #step1: 将定时任务的命令修改为
    */10 * * * * /usr/sbin/ntpdate -u master
    #step2:开启slaves所有节点的ntp服务并开机启动
    service ntpd start
    chkconfig ntpd on

    以上两步操作完稍等片刻,CM界面就不报错了。

    参考:https://blog.csdn.net/qq_28351465/article/details/82995616

    3 Cloudera Manager的安装

    CM用于管理集群,需要将cloudera-manager-centos7-cm5.8.2_x86_64.tar.gz   上传到所有节点。

    3.1 上传并解压CM安装包

    【登录所有节点,包括master和slaves】,所有集群中的机器都需要安装。

    解压cm到/opt目录下,生成两个目录

    1、cloudera   2、cm-5.8.2 。

    其中cloudera目录下有两个空目录csd 和 parcel-repo ,其中parcel-repo是用来存放CDH主程序的,即parcels(三个)文件。也可以仅上传到master后再解压,然后scp到其它节点的 /opt目录下

    #先上传到master节点的/usr/local/src目录下
    #切换目录
    cd /usr/local/src
    #上传
    rz
    #scp到其它所有机器上的/usr/local/src目录下
    #复制到slave01节点
    scp /usr/local/src/cloudera-manager-centos7-cm5.8.2_x86_64.tar.gz root@slave01:/usr/local/src/
    #复制到slave02节点
    scp /usr/local/src/cloudera-manager-centos7-cm5.8.2_x86_64.tar.gz root@slave02:/usr/local/src/
    #复制到slave03节点
    scp /usr/local/src/cloudera-manager-centos7-cm5.8.2_x86_64.tar.gz root@slave03:/usr/local/src/
    #解压所有的CM包在各自节点的/opt目录下,在所有节点上执行
    tar -xzf /usr/local/src/cloudera-manager-centos7-cm5.8.2_x86_64.tar.gz -C /opt

    3.2 创建cloudera-scm用户

    【登录所有节点】,在所有节点上创建cloudera-scm用户

    useradd --system --home=/opt/cm-5.8.2/run/cloudera-scm-server --no-create-home --shell=/bin/false --comment "Cloudera SCM User" cloudera-scm 

             --system 创建一个系统账户

             --home 指定用户登入时的主目录,替换系统默认值/home/<用户名>

             --no-create-home 不要创建用户的主目录

             --shell 用户的登录 shell 名

             --comment 用户的描述信息

            注意:

             Cloudera Manager默认用户为cloudera-scm,创建具有此名称的用户是最简单的方法。 安装完成后,将自动使用此用户

    3.3 配置CM-agent

    【登录所有节点】

    vim /opt/cm-5.8.2/etc/cloudera-scm-agent/config.ini
    #修改server_host为master
    server_host=master

    3.4 配置CM的数据库

    【登录所有安装mysql的节点】

     添加mysql connector包

    #先登录master
    cd /usr/local/src
    rz
    #上传mysql-connector-java-5.1.46.tar.gz
    #分发到其它节点
    scp /usr/local/src/mysql-connector-java-5.1.46.tar.gz root@slave01:/usr/local/src
    scp /usr/local/src/mysql-connector-java-5.1.46.tar.gz root@slave02:/usr/local/src
    scp /usr/local/src/mysql-connector-java-5.1.46.tar.gz root@slave03:/usr/local/src
    #对所有节点解压
    tar -xzf mysql-connector-java-5.1.46.tar.gz
    #移动jar包
    mkdir /usr/share/java
    cd /usr/local/src/mysql-connector-java-5.1.46
    cp mysql-connector-java-5.1.46-bin.jar /usr/share/java
    cd /usr/share/java
    #必须修改为名称为mysql-connector-java.jar的包名,否则找不到
    ln -s mysql-connector-java-5.1.46-bin.jar mysql-connector-java.jar

    【只登录master】,集群中cm库只能有一个。所以只在一个节点上操作

    在mysql中创建cm库

    执行命令:

    /opt/cm-5.8.2/share/cmf/schema/scm_prepare_database.sh mysql cm -hmaster -uroot -p12345678 --scm-host master scm scm scm

    参数解释依次是:

    mysql数据库用的是mysql,如果安装过程中用的oracle,那么该参数就应该改为oracle

    cm:表示在mysql数据库中创建cm database

    -h:Database host 表示安装数据库的主机名 (我是在在master上安装的MySQL数据库,所以我指定了master)

    -u: mysql数据库用户名

    -p: mysql数据库登录密码

    --scm-host master :CMS的主机,一般是和mysql安装的主机是在同一个主机上

    最后三个scm参数是:数据库名,数据库用户名,数据库密码 

    执行完创建cm库的命令后,只有当看到All done, your SCM database is configured correctly!这句话时,表明命令操作是成功的.在执行这行命令后,会遇到很多问题,最常见到的是用户权限问题,这个自行百度吧,或者查看我的另一篇博客:安装CDH过程中所遇到的问题整理。

     3.5 将cdh三个安装文件上传到master的parcel-repo目录下

    【登录master节点】

    cd /opt/cloudera/parcel-repo/
    rz
    #上传CDH-5.8.2-1.cdh5.8.2.p0.3-el7.parcel
    #上传CDH-5.8.2-1.cdh5.8.2.p0.3-el7.parcel.sha1
    #上传manifest.json
    #修改CDH-5.8.2-1.cdh5.8.2.p0.3-el7.parcel.sha1的文件名为CDH-5.8.2-1.cdh5.8.2.p0.3-el7.parcel.sha
    mv CDH-5.8.2-1.cdh5.8.2.p0.3-el7.parcel.sha1 CDH-5.8.2-1.cdh5.8.2.p0.3-el7.parcel.sha

    3.6 启动CM:

    【在master节点上】启动cm-server

    [root@master parcel-repo]# /opt/cm-5.8.2/etc/init.d/cloudera-scm-server start
    Starting cloudera-scm-server:                              [  确定  ]
    [root@master parcel-repo]# 

    【在所有节点上,包括master和slaves】启动cm-agent

    /opt/cm-5.8.2/etc/init.d/cloudera-scm-agent start

    注意:启动过程非常慢,Manager 启动成功需要等待一段时间,过程中会在数据库中创建对应的表需要耗费一些时间。

    一段时间过后,可以使用下列命令在master上查看7180端口是否已经启动:  netstat -anp | grep 7180   如果查看被占用则表示安装成功了!!!

    进入浏览器输入地址,例如:http://192.168.30.136:7180  可以登录cm管理集群,安装cdh子功能。

     

     

  • 相关阅读:
    使用frp工具实现内网穿透以及配置多个ssh和web服务
    axios下载pdf
    itextpdf freemarker渲染
    腾讯云函数免费搭建onedrive网盘
    Ajax请求携带Cookie
    GitHub通过access token来clone代码
    web网页动态分享facebook和twitter
    python smtplib在linux上发送邮件失败解决方式
    java如何关闭钩子(ShutdownHook)
    VS Code运行SpringBoot项目
  • 原文地址:https://www.cnblogs.com/yoyowin/p/12041334.html
Copyright © 2011-2022 走看看