阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

VMware上CentOS7.0+Hadoop3.1伪分布式搭建

195次阅读
没有评论

共计 14363 个字符,预计需要花费 36 分钟才能阅读完成。

最近要搭建一个 Hadoop 做实验,因为版本的问题遇到不少的坑,本文记录 VMware 上搭建的 CentOS7.0+Hadoop3.1 伪分布式的整个过程。

CentOS7.0 安装这里不赘述。

Hadoop 下载 3.1。

JDK 需要安装 1.8。

一、VM

网络采用 NAT 模式,毕竟后续搭建分布式方便。

取消 DHCP,NAT 里的 dns 设置成虚拟的网关 IP(192.168.31.2,可以加上外网的解析地址 114.114.114.114)

VMware 上 CentOS7.0+Hadoop3.1 伪分布式搭建

VMware 上 CentOS7.0+Hadoop3.1 伪分布式搭建

VMware 上 CentOS7.0+Hadoop3.1 伪分布式搭建

二、IP 设置
使用 NAT 模式设置 IP
默认宿主机 ip192.168.31.1  # 不同的 PC,这里的 IP 不一样,但是宿主机一般都是.1,网关机(虚拟机的)一般都是.2

宿主机的虚拟网卡 VMnet8 有时候 IP 会出问题,建议手工设置 IP:192.168.31.1
默认虚拟机网关 192.168.31.2,虚拟机自动虚拟出来的。
虚拟机 ip 手动设置为 192.168.31.10  #这里随意设置,不要和宿主机和网关相同就可以,确保在一个网段。

以上 IP 和原本宿主机的局域网 IP 不在一个网段。

VMware 上 CentOS7.0+Hadoop3.1 伪分布式搭建

linux 的 IP

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

# 注意这里,不同的 linux 版本网卡名字可能不一样,通常可能是 eth0,CentOS7.0 是 ens33

以下是 ifcfg-ens33 里的内容:
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
##IPV6INIT=yes
##IPV6_AUTOCONF=yes
##IPV6_DEFROUTE=yes
##IPV6_FAILURE_FATAL=no
##IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=45fe5552-7117-4c84-9742-c87adfa222b9
DEVICE=ens33
ONBOOT=yes
ZONE=public #这里设置 ZONE 方便后面设置防火墙
IPADDR=192.168.31.10
NETMASK=255.255.255.0
GATEWAY=192.168.31.2
DNS1=192.168.31.2

虚拟机 ifconfig

VMware 上 CentOS7.0+Hadoop3.1 伪分布式搭建

宿主机 ipconfig

VMware 上 CentOS7.0+Hadoop3.1 伪分布式搭建

设置到这里,宿主机可以 ping 通虚拟机,虚拟机可以 ping 通宿主机和网关。如果相互 ping 不同就需要检查宿主机和虚拟机的防火墙。

三、设置主机名

修改 hostname
vi /etc/sysconfig/network

NETWORKING=yes  #使用网络
HOSTNAME=bigdata-senior01.home.com  #设置主机名

配置 hosts
vi /etc/host
127.0.0.1  localhost localhost.localdomain localhost4 localhost4.localdomain4
::1        localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.31.10 bigdata-senior01.home.com

配置完 linux 的主机名,在 windows 的 hosts 里也需要配置一下 192.168.31.10 bigdata-senior01.home.com

一定要设置主机名,一定要配置 hosts,曾经被坑在这里。

四、关闭 selinux

selinux 是 Linux 一个子安全机制,但是,请关闭它。

vi /etc/sysconfig/selinux

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#    enforcing – SELinux security policy is enforced.
#    permissive – SELinux prints warnings instead of enforcing.
#    disabled – No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
#    targeted – Targeted processes are protected,
#    mls – Multi Level Security protection.
SELINUXTYPE=targeted

 五、Hadoop 的用户设置

1、创建 hadoop 的普通用户

 useradd hadoop
 passwd hadoop

2、给 hadoop 用户 sudo 权限

 vi /etc/sudoers

设置权限(非生产环境可以随意点)

root    ALL=(ALL)      ALL
hadoop ALL=(root) NOPASSWD:ALL

3、切换到 hadoop 用户
 su – hadoop

4、创建存放 hadoop 文件的目录

 sudo mkdir /opt/modules
 
5、将 hadoop 文件夹的所有者指定为 hadoop 用户

如果存放 hadoop 的目录的所有者不是 hadoop,之后 hadoop 运行中可能会有权限问题。

 sudo chown -R hadoop:hadoop /opt/modules

六、解压 Hadoop 目录文件
      自行百度 hadoop 下载
1、复制 hadoop-3.1.0.tar.gz 到 /opt/modules 目录下。

2、解压 hadoop-3.1.0.tar.gz

 cd /opt/modules
 tar -zxvf hadoop-3.1.0.tar.gz

七、配置 hadoop 环境变量

1、环境变量

 vi /etc/profile

java 的配置这里也提一下:

#set java environment
JAVA_HOME=/home/java/jdk1.8.0_172
JRE_HOME=/home/java/jdk1.8.0_172/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
 
hadoop 追加配置:

export HADOOP_HOME=”/opt/modules/hadoop-3.1.0″
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

执行:source /etc/profile 使得配置生效

验证 HADOOP_HOME 参数:

echo $HADOOP_HOME
/opt/modules/hadoop-3.1.0
或者使用 env 检查一下所有的配置情况。

2、配置 hadoop-env.sh 文件的 JAVA_HOME 参数
 sudo vi  ${HADOOP_HOME}/etc/hadoop/hadoop-env.sh

修改 JAVA_HOME 参数为:
export JAVA_HOME=”/opt/modules/jdk1.8.0_172″ #这里一定要使用绝对路径

3、配置 core-site.xml
vi ${HADOOP_HOME}/etc/hadoop/core-site.xml

(1)fs.defaultFS 参数配置的是 HDFS 的地址。

<property>
<name>fs.defaultFS</name>
<value>hdfs://bigdata-senior01.home.com:9000</value>
</property>

(2)hadoop.tmp.dir 配置的是 Hadoop 临时目录,比如 HDFS 的 NameNode 数据默认都存放这个目录下,查看 core-default.xml 等默认配置文件,就可以看到很多依赖 ${hadoop.tmp.dir}的配置。

    创建临时目录:

sudo mkdir -p /opt/data/tmp

    将临时目录的所有者修改为 hadoop:

sudo chown –R hadoop:hadoop /opt/data/tmp

    修改 hadoop.tmp.dir

 <property>
  <name>hadoop.tmp.dir</name>
    <value>/opt/data/tmp</value>
  </property>

最后 core-site.xml
<configuration>
 <property>
      <name>fs.defaultFS</name>
      <value>hdfs://bigdata-senior01.home.com:9000</value>
      <description>HDFS 的 URI,文件系统://namenode 标识: 端口号 </description>
  </property>
  <property>
  <name>hadoop.tmp.dir</name>
    <value>/opt/data/tmp</value>
    <description>namenode 上本地的 hadoop 临时文件夹 </description>
  </property>
</configuration>

八、配置 HDFS,启动 HDFS

1、配置 hdfs-site.xml
vi ${HADOOP_HOME}/etc/hadoop/hdfs-site.xml

    <property>
      <name>dfs.replication</name>
      <value>1</value>
        <description> 副本个数,配置默认是 3, 应小于 datanode 机器数量 </description>
 </property>
    </property>

dfs.replication 配置的是 HDFS 存储时的备份数量,因为这里是伪分布式环境只有一个节点,所以这里设置为 1。

其他配置,如果不配置以下属性,hadoop 将会在之前配置的临时文件下面创建 name 和 data 目录
<property>
    <name>dfs.name.dir</name>
    <value>/opt/hadoop/hdfs/name</value>
    <description>namenode 上存储 hdfs 名字空间元数据 </description>
 </property>

 <property>
    <name>dfs.data.dir</name>
    <value>/opt/hadoop/hdfs/data</value>
    <description>datanode 上数据块的物理存储位置 </description>
 </property>

2、格式化 HDFS

 hdfs namenode –format #只需要在第一次的时候执行

格式化是对 HDFS 这个分布式文件系统中的 DataNode 进行分块,统计所有分块后的初始元数据的存储在 NameNode 中。

格式化后,查看 core-site.xml 里 hadoop.tmp.dir(/opt/data 目录)指定的目录下是否有了 dfs 目录,如果有,说明格式化成功。

注意权限设置,最好把 Hadoop 设置成 /opt/data 目录的所有者
sudo chown -R hadoop:hadoop /opt/data

    查看 NameNode 格式化后的目录。

 ll /opt/data/tmp/dfs/name/current

3、启动 NameNode
${HADOOP_HOME}/sbin/hadoop-daemon.sh start namenode
系统会告警,建议采用:hdfs –daemon start namenode

4、启动 DataNode
${HADOOP_HOME}/sbin/hadoop-daemon.sh start datanode
系统会告警,建议采用:hdfs –daemon start datanode

5、启动 SecondaryNameNode
 ${HADOOP_HOME}/sbin/hadoop-daemon.sh start secondarynamenode
系统会告警,建议采用:hdfs –daemon start secondarynamenode

6、JPS 命令查看是否已经启动成功,有结果就是启动成功了。

jps
1267 NameNode
1380 DataNode
1559 Jps
1528 SecondaryNameNode

7、HDFS 上测试创建目录、上传、下载文件

HDFS 上创建目录
hdfs dfs -mkdir /demo

上传本地文件到 HDFS 上
hdfs dfs -put ${HADOOP_HOME}/etc/hadoop/core-site.xml /demo

 
读取 HDFS 上的文件内容
hdfs dfs -cat /demo/core-site.xml
 
从 HDFS 上下载文件到本地
hdfs dfs -get /demo/core-site.xml

查看目录
$ hdfs dfs -ls /demo

也可以使用 hadoop fs -mkdir /mydata 这样的命令

VMware 上 CentOS7.0+Hadoop3.1 伪分布式搭建

九、配置和启动 YARN

1、配置 mapred-site.xml

vi ${HADOOP_HOME}/etc/hadoop/mapred-site.xml

添加配置如下:

<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>

指定 mapreduce 运行在 yarn 框架上。

2、配置 yarn-site.xml
vi ${HADOOP_HOME}/etc/hadoop/yarn-site.xml
添加配置如下:

<property>
  <name>yarn.nodemanager.aux-services</name>
  <value>mapreduce_shuffle</value>
</property>
<property>
    <name>yarn.resourcemanager.hostname</name>
    <value>bigdata-senior01.home.com</value>
 </property>

   
    yarn.nodemanager.aux-services 配置了 yarn 的默认混洗方式,选择为 mapreduce 的默认混洗算法。

    yarn.resourcemanager.hostname 指定了 Resourcemanager 运行在哪个节点上。

3、启动 Resourcemanager

 ${HADOOP_HOME}/sbin/yarn-daemon.sh start resourcemanager
系统会告警,建议采用:yarn –daemon start resourcemanager

4、启动 nodemanager

[hadoop@bigdata-senior01 hadoop-3.1.0]$ ${HADOOP_HOME}/sbin/yarn-daemon.sh start nodemanager
系统会告警,建议采用:yarn –daemon start nodemanager

5、查看是否启动成功
[hadoop@localhost sbin]$ jps
1395 DataNode
1507 SecondaryNameNode
2150 Jps
2075 NodeManager
1292 NameNode
1628 ResourceManager

6、YARN 的 Web 页面

YARN 的 Web 客户端端口号是 8088,通过 http://192.168.31.10:8088/ 可以查看。
如果防火墙没有关闭,还需要添加端口:
firewall-cmd –zone=public –add-port=8088/tcp –permanent

HDFS 的 web 页面:
http://192.168.31.10:9870/
firewall-cmd –zone=public –add-port=9870/tcp –permanent

# 注意这里,hadoop3.0 以前 hdfs 的端口号不是 9870

以后类似需要端口访问的 web 管理页面,都需要在防火墙里添加端口,也可以直接关闭防火墙。

移除端口:firewall-cmd –zone=public –remove-port=8088/tcp –permanent

VMware 上 CentOS7.0+Hadoop3.1 伪分布式搭建

十、运行 MapReduce Job
在 Hadoop 的 share 目录里,自带了一些 jar 包,里面带有一些 mapreduce 实例小例子,位置在 $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.0.jar,可以运行这些例子体验刚搭建好的 Hadoop 平台,我们这里来运行最经典的 WordCount 实例。版本不同,这个 jar 包的名字也有点区别。
1、添加类库路径

因为运行的是 hadoop 自带的例子,所以例子里的类库要加入
编辑 Hadoop 安装目录下 etc/hadoop/mapred-site.xml 文件,在  <configuration> 标签和 </configuration> 标签之间添加如下配置:
<property>
  <description>CLASSPATH for MR applications. A comma-separated list
  of CLASSPATH entries. If mapreduce.application.framework is set then this
  must specify the appropriate classpath for that archive, and the name of
  the archive must be present in the classpath.
  If mapreduce.app-submission.cross-platform is false, platform-specific
  environment vairable expansion syntax would be used to construct the default
  CLASSPATH entries.
  For Linux:
  $HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*,
  $HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*.
  For Windows:
  %HADOOP_MAPRED_HOME%/share/hadoop/mapreduce/*,
  %HADOOP_MAPRED_HOME%/share/hadoop/mapreduce/lib/*.
  If mapreduce.app-submission.cross-platform is true, platform-agnostic default
  CLASSPATH for MR applications would be used:
  {{HADOOP_MAPRED_HOME}}/share/hadoop/mapreduce/*,
  {{HADOOP_MAPRED_HOME}}/share/hadoop/mapreduce/lib/*
  Parameter expansion marker will be replaced by NodeManager on container
  launch based on the underlying OS accordingly.
  </description>
  <name>mapreduce.application.classpath</name>
  <value>/opt/modules/hadoop-3.1.0/share/hadoop/mapreduce/*, /opt/modules/hadoop-3.1.0/share/hadoop/mapreduce/lib-examples/*</value>
</property>
注意,这一点非常重要,必须填写完整的路径,即必须是绝对路径,不能包含变量。

2、内存配置:
—–
安装虚拟机的时候内存原本是 1G,运行 job 一直出错,各种修改配置文件里的内存都不行,最后把虚拟机内存调整成 2G 以运行成功。
关于内存这块,要非常熟悉 hadoop 的各类配置才好下手,新手入门还是先不折腾。
—–

 3、创建测试用的 Input 文件

创建输入目录:
hdfs dfs -mkdir -p /wordcountdemo/input

创建原始文件:

在本地 /opt/data 目录创建一个文件 mydata.input, 内容如下:
cat /opt/data/mydata.input
abc def kkk
abc kkk sss
ddd abc sss
abc abc sss

将 wc.input 文件上传到 HDFS 的 /wordcountdemo/input 目录中:

hdfs dfs -put /opt/data/mydata.input /wordcountdemo/input

运行 WordCount MapReduce Job

yarn jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.0.jar wordcount /wordcountdemo/input /wordcountdemo/output

2018-05-29 22:18:34,201 INFO client.RMProxy: Connecting to ResourceManager at bigdata-senior01.home.com/192.168.31.10:8032
2018-05-29 22:18:35,314 INFO mapreduce.JobResourceUploader: Disabling Erasure Coding for path: /tmp/hadoop-yarn/staging/hadoop/.staging/job_1527603486527_0001
2018-05-29 22:18:36,437 INFO input.FileInputFormat: Total input files to process : 1
2018-05-29 22:18:37,402 INFO mapreduce.JobSubmitter: number of splits:1
2018-05-29 22:18:37,472 INFO Configuration.deprecation: yarn.resourcemanager.system-metrics-publisher.enabled is deprecated. Instead, use yarn.system-metrics-publisher.enabled
2018-05-29 22:18:37,834 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1527603486527_0001
2018-05-29 22:18:37,845 INFO mapreduce.JobSubmitter: Executing with tokens: []
2018-05-29 22:18:38,124 INFO conf.Configuration: resource-types.xml not found
2018-05-29 22:18:38,124 INFO resource.ResourceUtils: Unable to find ‘resource-types.xml’.
2018-05-29 22:18:38,671 INFO impl.YarnClientImpl: Submitted application application_1527603486527_0001
2018-05-29 22:18:38,737 INFO mapreduce.Job: The url to track the job: http://bigdata-senior01.home.com:8088/proxy/application_1527603486527_0001/
2018-05-29 22:18:38,738 INFO mapreduce.Job: Running job: job_1527603486527_0001
2018-05-29 22:18:51,002 INFO mapreduce.Job: Job job_1527603486527_0001 running in uber mode : false
2018-05-29 22:18:51,003 INFO mapreduce.Job:  map 0% reduce 0%
2018-05-29 22:18:57,124 INFO mapreduce.Job:  map 100% reduce 0%
2018-05-29 22:19:04,187 INFO mapreduce.Job:  map 100% reduce 100%
2018-05-29 22:19:06,209 INFO mapreduce.Job: Job job_1527603486527_0001 completed successfully
2018-05-29 22:19:06,363 INFO mapreduce.Job: Counters: 53
        File System Counters
                FILE: Number of bytes read=94
                FILE: Number of bytes written=425699
                FILE: Number of read operations=0
                FILE: Number of large read operations=0
                FILE: Number of write operations=0
                HDFS: Number of bytes read=202
                HDFS: Number of bytes written=60
                HDFS: Number of read operations=8
                HDFS: Number of large read operations=0
                HDFS: Number of write operations=2
        Job Counters
                Launched map tasks=1
                Launched reduce tasks=1
                Data-local map tasks=1
                Total time spent by all maps in occupied slots (ms)=4455
                Total time spent by all reduces in occupied slots (ms)=4530
                Total time spent by all map tasks (ms)=4455
                Total time spent by all reduce tasks (ms)=4530
                Total vcore-milliseconds taken by all map tasks=4455
                Total vcore-milliseconds taken by all reduce tasks=4530
                Total megabyte-milliseconds taken by all map tasks=4561920
                Total megabyte-milliseconds taken by all reduce tasks=4638720
        Map-Reduce Framework
                Map input records=4
                Map output records=11
                Map output bytes=115
                Map output materialized bytes=94
                Input split bytes=131
                Combine input records=11
                Combine output records=7
                Reduce input groups=7
                Reduce shuffle bytes=94
                Reduce input records=7
                Reduce output records=7
                Spilled Records=14
                Shuffled Maps =1
                Failed Shuffles=0
                Merged Map outputs=1
                GC time elapsed (ms)=172
                CPU time spent (ms)=1230
                Physical memory (bytes) snapshot=388255744
                Virtual memory (bytes) snapshot=5476073472
                Total committed heap usage (bytes)=165810176
                Peak Map Physical memory (bytes)=242692096
                Peak Map Virtual memory (bytes)=2733621248
                Peak Reduce Physical memory (bytes)=145563648
                Peak Reduce Virtual memory (bytes)=2742452224
        Shuffle Errors
                BAD_ID=0
                CONNECTION=0
                IO_ERROR=0
                WRONG_LENGTH=0
                WRONG_MAP=0
                WRONG_REDUCE=0
        File Input Format Counters
                Bytes Read=71
        File Output Format Counters
                Bytes Written=60

查看输出结果目录

hdfs dfs -ls /wordcountdemo/output
– 用命令:hadoop fs -cat /wordcountdemo/output/part-r-00000,也可以,上面也一样
Found 2 items
-rw-r–r–  1 hadoop supergroup          0 2018-05-29 22:19 /wordcountdemo/output/_SUCCESS
-rw-r–r–  1 hadoop supergroup        60 2018-05-29 22:19 /wordcountdemo/output/part-r-00000

    output 目录中有两个文件,_SUCCESS 文件是空文件,有这个文件说明 Job 执行成功。

    part-r-00000 文件是结果文件,其中 -r- 说明这个文件是 Reduce 阶段产生的结果,mapreduce 程序执行时,可以没有 reduce 阶段,但是肯定会有 map 阶段,如果没有 reduce 阶段这个地方有是 -m-。

    一个 reduce 会产生一个 part-r- 开头的文件。

    查看输出文件内容。
hdfs dfs -cat /wordcountdemo/output/part-r-00000

在虚拟机上,因为内存不足这里经常会出现的情况就是内存溢出,然后 hadoop 的运行容器被 kill。

 十一、开启历史服务

Hadoop 开启历史服务可以在 web 页面上查看 Yarn 上执行 job 情况的详细信息。可以通过历史服务器查看已经运行完的 Mapreduce 作业记录,比如用了多少个 Map、用了多少个 Reduce、作业提交时间、作业启动时间、作业完成时间等信息。

mr-jobhistory-daemon.sh start historyserver、
此命令已经被弃用,建议使用:mapred –daemon start historyserver
 

开启后,可以通过 Web 页面查看历史服务器:

http://bigdata-senior01.home.com:19888/

历史服务器的 Web 端口默认是 19888,可以查看 Web 界面。

VMware 上 CentOS7.0+Hadoop3.1 伪分布式搭建

十二、节点免密登录

是指通过证书认证的方式登陆,使用一种被称为 ” 公私钥 ” 认证的方式来进行 ssh 登录

如果我们需要使用 hadoop 目录 sbin/ 下的便捷脚本运行 hadoop,就需要配置免密登录

root 用户下:

ssh-keygen -t rsa 一路回车下去

 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys #.ssh 这个隐藏目录的权限要求是 700。
  chmod 600 ~/.ssh/authorized_keys #这个文件需要特殊的权限要求。

这样就可以运行诸如:start-all.sh,start-dfs.sh 这些脚本。

最后,说说 hadoop3.0 后端口的变化:

Namenode 端口:
50470 –> 9871
50070 –> 9870
8020 –> 9820

Secondary NN 端口:
50091 –> 9869
50090 –> 9868

Datanode 端口:
50020 –> 9867
50010 –> 9866
50475 –> 9865
50075 –> 9864

Hadoop2.3-HA 高可用集群环境搭建  https://www.linuxidc.com/Linux/2017-03/142155.htm
Hadoop 项目之基于 CentOS7 的 Cloudera 5.10.1(CDH)的安装部署  https://www.linuxidc.com/Linux/2017-04/143095.htm
Hadoop2.7.2 集群搭建详解(高可用)https://www.linuxidc.com/Linux/2017-03/142052.htm
使用 Ambari 来部署 Hadoop 集群(搭建内网 HDP 源)https://www.linuxidc.com/Linux/2017-03/142136.htm
Ubuntu 14.04 下 Hadoop 集群安装  https://www.linuxidc.com/Linux/2017-02/140783.htm
CentOS 6.7 安装 Hadoop 2.7.2  https://www.linuxidc.com/Linux/2017-08/146232.htm
Ubuntu 16.04 上构建分布式 Hadoop-2.7.3 集群  https://www.linuxidc.com/Linux/2017-07/145503.htm
CentOS 7 下 Hadoop 2.6.4 分布式集群环境搭建  https://www.linuxidc.com/Linux/2017-06/144932.htm
Hadoop2.7.3+Spark2.1.0 完全分布式集群搭建过程  https://www.linuxidc.com/Linux/2017-06/144926.htm

更多 Hadoop 相关信息见Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计14363字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中