Spark环境搭建与配置

创建虚拟机
先打开vmware虚拟机 点击左上角文件 新建虚拟机

默认典型 下一步
点击浏览 选择映像文件ubuntu 点击下一步

全名 用户名 密码均设为spark 然后点击下一步


虚拟机名字和位置 可以默认 或自己调整 点击下一步


最后直接点完成,也可以在自定义硬盘中设置自己的喜好,或者在使用过程中在调整。

完成虚拟机安装后,会自动启动Ubuntu20.04的安装,稍等几分钟后,会出现Ubuntu20.04的登陆界面。

如果前期安装过程有错,可以删除虚拟机重装,先关闭虚拟机,点击上方虚拟机,点击管理,再点击从磁盘中删除,点击确定就可以了。

进入登陆界面后,点击spark,输入密码spark,点击回车,就进入到了初始界面。

点击右上角的skip和next,直至最后一个窗口,点击done完成。如果出现一下图面上的更新窗口,点击don’t upgrade 不要更新,当前版本即可。


为了以后方便操作,要整理一下图标,鼠标右击点击左侧垂直栏里的蓝色问号图标,点击remove from favorites。

完成之后如图所示

之后鼠标右击桌面中间的空白部分(不要点到程序图标),点击菜单中的open in terminal,启动linux终端。

之后右击左侧任务栏中的终端,选择菜单中的add to favorites(将虚拟机固定到任务栏)。以后使用linux终端可以直接点击他。

之后点击右上角的电源图标,选择power off/log out菜单下的power off 按钮,关闭当前的虚拟机。 会出现一个关闭提示画面,再点击power off。

点击此虚拟机的编辑虚拟机选项,调整内存和处理器数量(考虑到本虚拟机要运行hadoop和spark等程序,内存数量必须要2GB以上,不然会出现蓝屏或者崩溃现象)。


Ubuntu基本设置
设置完成后,打开此虚拟机,在虚拟机中打开一个linux终端窗口,按照一下红色字进行输入回车。
spark@ubuntu:~$ sudo apt update (更新安装源)

[sudo] password for spark: (在这里输入)spark(回车)

Hit:1 http://security.ubuntu.com/ubuntu focal-security InRelease

Hit:2 http://us.archive.ubuntu.com/ubuntu focal InRelease

Hit:3 http://us.archive.ubuntu.com/ubuntu focal-updates InRelease

Hit:4 http://us.archive.ubuntu.com/ubuntu focal-backports InRelease

Reading package lists... Done

Building dependency tree       

Reading state information... Done

450 packages can be upgraded. Run 'apt list --upgradable' to see them.

spark@ubuntu:~$ sudo apt -y upgrade(升级安装源)

[sudo] password for spark: (在这里输入)spark(回车)

spark@ubuntu:~$ sudo apt -y remove openssh-client(避免版本冲突,先卸载)

等待加载完成

spark@ubuntu:~$ sudo apt -y install openssh-server(安装匹配版本)

等待加载完成

spark@ubuntu:~$ sudo apt -y install vim(安装vim)

[sudo] password for spark: (在这里输入)spark(回车)(根据系统需要输入密码,不一定)

spark@ubuntu:~$ sudo ufw disable(关闭防火墙)

Firewall stopped and disabled on system startup

Windows自带一个记事本,Ubuntu20.04的桌面环境也有类似的文本编辑器(text editor),在第二页,如果翻页不了,可以点击搜索找到。


使用这个图形化的文本编辑器,保存文件可能需要权限,可以使用gedit命令,获取root权限,后面加上文件名。
spark@ubuntu:~$ gedit a.txt (创建或者打开a.txt文件)

Vi编辑器
spark@ubuntu:~$ cd 
spark@ubuntu:~$ vi或者vim(启动vi)

提示:

MobaXterm 远程连接工具(MobaXterm remote connection tool)
下载地址:MobaXterm Xserver with SSH, telnet, RDP, VNC and X11 - Download


下载完成后 打开文件 解压缩 点击应用程序

将MobaXterm便携版解压缩到Windows的一个目录中,然后启动里面的MobaXterm_Personal可执 行文件,就会打开MobaXterm窗体的初始界面。

在linux终端打入ip addr,查看自己的ip。

选择SSH,输入需要连接的远程服务器地址(上个图中,你自己的ip),登陆所用的账号spark,再点击ok。


会弹出一个窗口,勾选最下面的do not show this message again,之后点击accept。
 
输入密码spark,回车,在弹出的窗口点击no(不保存登陆密码),进入下图中的页面后,可以直接在红圈处输入linux命令,还可以通过左侧SFTP 将Windows 本地的文件上传到远程服务器。(如果失败,后面弹出红色字exit,关闭这个界面,注意不是这个系统界面,是黑色框的界面,点击确定,然后再双击自己的ip,再次输入密码,就成功了)

一定要将hadoop,jdk,spark文件传入到里面,选中后拖拽进去即可。

使用完毕要退出远程登录的话,只需按下Ctrl+D键或输入exit命令即可(然后回车)。,或者在保存的连接信息上点击鼠标右键,选择弹出菜单中的Edit session(编 辑)、Delete session(删除)等还可以对连接信息进行管理。

Hadoop伪分布集群环境搭建
JDK的安装配置
打开一个Linux 终端,在其中执行以下命令,将JDK解压缩到/usr/local目录中, 并创建一个软链接指向JDK目录(相当于Windows的快捷方式)。
spark@ubuntu:~$ sudo tar -zxf jdk-8u201-linux-x64.tar.gz -C /usr/local

[sudo] password for spark: 输入spark 回车

然后输入下图所示(有红色标识的,和紧挨着的下一行 表示成功)

修改/etc/profile 文件,在其中添加有关JDK的环境变量设置,保存后退出。
spark@ubuntu:/usr/local$ sudo vi /etc/profile

输入:export JAVA_HOME=/usr/local/jdk1.8.0_201

export PATH=$JAVA_HOME/bin:$PATH

如图所示  保存退出

保存退出vi编辑器,回到Linux终端测试一下JDK的配置是否正常。如果出现以下 信息,说明JDK的配置是正确的,JDK的安装也就完成了。

JDK 安装完毕,最好重新启动一下Ubuntu20.04 虚拟机,这样设置的环境变量就会 在Linux 系统全局生效。

Linux免密登录
继续在Linux终端窗体中执行以下命令,因为远程登录服务sshd已经在运行,因此 先在本机通过ssh命令执行一下远程连接,测试一下是否正常。
输入密码spark

之后输入exit 回车 退出

通过ssh-keygen生成免密登录所需的密钥信息。红色标注地方按回车

通过ssh-copy-id 命令,可以把本地主机的公钥复制到远程主机的authorized_keys 文件上,以便双方连接通信时使用。
输入密码

在本机通过ssh命令再次执行一下远程连接,测试一下是否能够免密登录,正常的 话此时就不再需要输入密码,ssh就能够连接成功。

Hadoop安装
打开Linux终端窗体,先解压缩hadoop-2.6.5.tar.gz这个软件包,然后像JDK一 样建立一个软链接文件。
红色抹掉处不用在意,直接打命令

如图所示,有红色圈内容的表示成功


将解压的hadoop-2.6.5 目录的用户和组权限设一下,方便启动Hadoop的时候能够 完全控制这个目录,避免因为文件的访问权限导致出现问题。
如果需要输入密码 就输入密码

spark@ubuntu:/usr/local$ sudo chown -R spark:spark hadoop-2.6.5

测试Hadoop是否能够正常使用。(version 前不要加-)

4.HDFS的配置
切换到Hadoop的配置文件目录,先修改其中的hadoop-env.sh运行环境文件,找到 里面的JAVA_HOME 变量。Hadoop 没有使用 Linux 操作系统设置的JAVA_HOME环境变量,而 是内部重新定义了一个JAVA_HOME,所以就要告知Hadoop所依赖的JDK安装位置。

目录这样子改

下面这张图只是标识位置

修改Hadoop 核心配置文件core-site.xml,在里面增加 HDFS 地址端口和临时工作 目录信息。

添加以下代码 如图所示 保存退出(这些代码放在configuration中间,后面类似的都是)

<property>

        <name>fs.defaultFS</name>

        <value>hdfs://localhost:9000</value>

</property>

<property>

        <name>hadoop.tmp.dir</name>

        <value>/usr/local/hadoop/tmp</value>

</property>

如下图所示

修改HDFS设置文件hdfs-site.xml,指定 NameNode 和 DataNode 的数据保存位置。 其中,NameNode负责文件系统管理,DataNode负责数据存储。

添加以下代码 如图所示 保存退出

<property>

        <name>dfs.namenode.name.dir</name>

        <value>/usr/local/hadoop/tmp/dfs/name</value>

</property>

<property>

        <name>dfs.datanode.data.dir</name>

        <value>/usr/local/hadoop/tmp/dfs/data</value>

</property>

<property>

        <name>dfs.replication</name>

        <value>1</value>

</property>

如下图所示

最后查看一下slaves配置文件的内容,这个文件中有运行DateNode进程的节点信 息。这里配置的是单节点,里面默认就是localhost即本机,故不用任何修改。

配置文件修改完毕,首次运行之前还要初始化HDFS的文件系统,相当于平时的磁盘 格式化操作,这个工作只执行一次。如果要重新初始化,应先清除相关目录中的内容(HDFS 存储过的数据会丢失),否则执行会失败。

接下来启动HDFS服务程序,执行过程中会分别运行NameNode、SecondaryNameNode 以及DataNode进程。

使用 jps 命令查看 HDFS 的进程是否正常运行,Java 进程列表中应有 NameNode、 DataNode、SecondaryNameNode 这三个程序在运行,就说明HDFS启动正常。

.YARN的配置
打开yarn-env.sh,找到其中的JAVA_HOME变量进行修改。


打开yarn-site.xml 文件,在其中增加与内存检查相关的设置。因为虚拟机使用的 内存和CPU资源受限,若要求必须有多少内存和CPU核的话,一些应用程序可能就无法正常 启动,在生产环境这两个参数应去掉。

添加以下内容后保存

 <property>

        <name>yarn.resourcemanager.hostname</name>

        <value>192.168.163.138(更换为你自己的ip地址)</value>

        <description>ResourceManager 的主机名或 IP 地址。</description>

    </property>

    <property>

        <name>yarn.resourcemanager.address</name>

        <value>${yarn.resourcemanager.hostname}:8032</value>

        <description>ResourceManager 的 RPC 地址。</description>

    </property>

    <property>

        <name>yarn.resourcemanager.scheduler.address</name>

        <value>${yarn.resourcemanager.hostname}:8030</value>

        <description>ResourceManager 的调度器地址。</description>

</property>

<property>

        <name>yarn.resourcemanager.resource-tracker.address</name>

        <value>${yarn.resourcemanager.hostname}:8031</value>

        <description>ResourceManager 的资源跟踪器地址。</description>

    </property>

    <property>

        <name>yarn.resourcemanager.admin.address</name>

        <value>${yarn.resourcemanager.hostname}:8033</value>

        <description>ResourceManager 的管理接口地址。</description>

    </property>

    <property>

        <name>yarn.resourcemanager.webapp.address</name>

        <value>${yarn.resourcemanager.hostname}:8088</value>

        <description>ResourceManager 的 Web UI 地址。</description>

    </property>

<property>

        <name>yarn.nodemanager.aux-services</name>

        <value>mapreduce_shuffle</value>

        <description>NodeManager 的辅助服务。</description>

    </property>

    <property>

        <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>

        <value>org.apache.hadoop.mapred.ShuffleHandler</value>

        <description>MapReduce Shuffle 的处理类。</description>

    </property>

    <property>

        <name>yarn.nodemanager.resource.memory-mb</name>

        <value>8192</value>

        <description>NodeManager 可用的物理内存总量(MB)。</description>

    </property>

 <property>

        <name>yarn.nodemanager.resource.cpu-vcores</name>

        <value>8</value>

        <description>NodeManager 可用的 CPU 核心数。</description>

    </property>

    <!-- 日志聚合配置 -->

    <property>

        <name>yarn.log-aggregation-enable</name>

        <value>true</value>

        <description>是否启用日志聚合功能。</description>

    </property>

    <property>

        <name>yarn.nodemanager.remote-app-log-dir</name>

        <value>/tmp/logs</value>

        <description>聚合日志的存储目录。</description>

    </property>

<property>

        <name>yarn.scheduler.maximum-allocation-mb</name>

        <value>8192</value>

        <description>单个容器可申请的最大内存(MB)。</description>

    </property>

    <property>

        <name>yarn.scheduler.maximum-allocation-vcores</name>

        <value>8</value>

        <description>单个容器可申请的最大 CPU 核心数。</description>

    </property>

<property>

        <name>yarn.nodemanager.pmem-check-enabled</name>

        <value>false</value>

</property>

配置完毕,可以启动YARN服务相关的程序,执行过程中会分别运行ResourceManager 和NodeManager 这两个进程。(在正确的目录下进行)

如果出错,可以通过检查日志,将错误的代码发给deepseek来查找问题。

HDFS和YARN测试
考虑到后续还会经常执行一些Hadoop的相关命令,为方便起见这里先把Hadoop的bin 目录设置到PATH环境变量中。
使用vi编辑器修改/etc/profile文件,在其中添加有关Hadoop环境变量设置。

spark@ubuntu:/usr/local/hadoop$ cd

spark@ubuntu:~$ sudo vi /etc/profile

添加export HADOOP_HOME=/usr/local/jdk

export PATH=$HADOOP_HOME/bin:$PATH

如图所示:

通过source命令使/etc/profile的内容修改生效。注意:如果新开一个终端窗体, 需要在新终端重新执行一次source命令,除非重启动虚拟机才会全局有效。
spark@ubuntu:~$ source /etc/profile

现在可以测试是否能够正常操作HDFS,比如创建目录,上传文件等。
spark@ubuntu:~$ touch hello.txt

spark@ubuntu:~$ echo "hello,hello" >> hello.txt

spark@ubuntu:~$ hdfs dfs -mkdir /mydata

spark@ubuntu:~$ hafs dfs -put hello.txt /mydata

spark@ubuntu:~$ hdfs dfs -put hello.txt /mydata

spark@ubuntu:~$ hdfs dfs -ls /mydata/*

-rw-r--r--   1 spark supergroup         12 2025-02-28 22:06 /mydata/hello.txt

还可以在Ubuntu20.04 里面启动浏览器,访问http://localhost:50070 查看HDFS 的WebUI 管理页面,如图1-38所示。如果是在Windows的浏览器访问,则需要将网址中的 localhost 改成Ubuntu20.04 虚拟机的ip地址(通过Linux终端命令ip addr可以找到)。


在 Ubuntu20.04 浏览器中访问http://localhost:8088 ,查看YARN的WebUI管理页 面,如图1-39所示。如果是在Windows的浏览器访问,则需要将网址中的localhost改成 Ubuntu20.04 虚拟机的IP地址才行。

因为我们这里没有配置Hadoop中的MapReduce组件模块,因此YARN暂时还无法真 正测试,待Spark环境搭建完毕,到时就可以提交Spark应用程序到YARN上面运行了。

Spark单机运行环境搭建
Spark的安装配置
打开一个Linux终端,在其中执行以下命令将Spark软件包解压到/usr/local目录 中,并创建一个软链接文件指向Spark目录并修改目录的用户属性。
spark@ubuntu:~$ sudo tar -zxf spark-2.4.8-bin-without-hadoop.tgz -C /usr/local

spark@ubuntu:~$ cd /usr/local

spark@ubuntu:/usr/local$ sudo ln -s spark-2.4.8-bin-without-hadoop/ spark

spark@ubuntu:/usr/local$ sudo chown -R spark:spark spark-2.4.8-bin-without-hadoop

spark@ubuntu:/usr/local$ ll

有红色圈表示成功


接下来开始配置Spark运行环境,相比而言Spark的配置更简单,所有配置文件均 位于conf目录。
spark@ubuntu:/usr/local$ cd /usr/local

spark@ubuntu:/usr/local$ cd spark/conf

spark@ubuntu:/usr/local/spark/conf$cp spark-env.sh.template spark-env.sh

spark@ubuntu:/usr/local/spark/conf$ vi spark-env.sh

添加:export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath)

如图所示

使用vi编辑器修改/etc/profile文件,在其中添加有关Spark的环境变量设置。
添加:export SPARK_HOME=/usr/local/spark

export PATH=$SPARK_HOME/bin:$PATH

如图所示

通过source命令使/etc/profile的内容修改生效。注意:如果新开一个终端窗体, 需要在新终端重新执行一次source命令,除非重启动虚拟机才会全局有效。
spark@ubuntu:/usr/local/spark/conf$ source /etc/profile

初步测试一下配置好的Spark能否正常工作。
spark@ubuntu:/usr/local/spark/conf$ cd /usr/local/spark

spark@ubuntu:/usr/local/spark$ bin/run-example SparkPi

如果一切正常的话,终端上会输出计算得到的pi近似值,这个值不固定,所以每次运 行输出的pi值是会变化的。

SparkShell交互编程环境
打开Linux终端窗体,输入spark-shell命令启动SparkShell交互式编程环境。启 动过程中可能会出现一个NumberFormatException的异常信息,这个问题不影响使用。
spark@ubuntu:/usr/local/spark$ cd

spark@ubuntu:~$ spark-shell

等待一段时间后 如图下所示

Spark 是用Scala语言开发的,当SparkShell启动后就支持运行Scala代码。我们 先输入下面两行简单的Scala代码(不理解也没关系):
scala>  val rdd = sc.textFile("file:///home/spark/hello.txt")

rdd: org.apache.spark.rdd.RDD[String] = file:///home/spark/hello.txt MapPartitionsRDD[3] at textFile at <console>:24

scala> rdd.first

res1: String = hello,hello     

正常的话,运行完毕就会打印输出hello.txt文件中的内容,说明Spark可以正常读取 本地磁盘的文件。

再新开一个Linux终端,在里面输入jps命令查看HDFS服务是否在运行,如果没有 运行就要先将HDFS服务启动,正如在配置HDFS服务时所做的那样。

如果jps命令输出的进程名中不包含HDFS服务的三个程序,说明HDFS服务没有运行(比 如可能重启过虚拟机),要使用start-dfs.sh命令将其启动。

现在可以验证Spark能否正常访问HDFS上的文件。前面测试HDFS时已经上传过一 个文件,路径为:/mydata/hello.txt,下面准备测试在SparkShell中读取这个文件。请转 至运行SparkShell的终端窗体,输入下面的代码:
scala> val rdd = sc.textFile("hdfs:///mydata/hello.txt")

rdd: org.apache.spark.rdd.RDD[String] = hdfs:///mydata/hello.txt MapPartitionsRDD[5] at textFile at <console>:24

scala> rdd.first

res3: String = hello,hello

通过上述的测试,说明Spark的安装配置是正确的。要退出SparkShell交互编程环 境,可以按下键盘上的Ctrl+D快捷键,或输入“:quit”并回车(冒号输入也包含在内)

Python3.6的安装
先查看Ubuntu20.04上已安装的Python相关程序文件:
spark@ubuntu:~$ ll /usr/bin/python*

从输出的文件列表可以看出,python3实际是一个软链接文件,指向python3.8执行程 序。我们可以分别运行python3和python3.8命令,以确认它们是否为同一个:


现在面临两个选择,一是将系统默认安装的Python3.8 卸载替换成Python3.6,这 种做法存在一定风险,因为可能影响到其它一些程序的使用。还有一种做法,就是在系统中 同时保留多个Python版本,然后根据实际需要切换使用(有现成工具辅助Python的多版本 管理)。这里准备采取第二种做法,即保留预装的Python3.8,另外安装一个Python3.6 运 行环境到系统中。

在安装Python3.6之前,先执行一下apt软件源的更新工作:
spark@ubuntu:~$ sudo apt update

[sudo] password for spark: 输入spark密码

由于Ubuntu软件源不含Python3.6的预编译版本,所以就要使用一个非常优秀的第 三方软件源Deadsnakes PPA。请按照下面步骤将其安装进来。
spark@ubuntu:~$ sudo apt install software-properties-common

spark@ubuntu:~$ sudo add-apt-repository ppa:deadsnakes/ppa

现在可以开始安装 Python 3.6,安装完毕查看一下Python3.6的启动程序

注意到,当 Python3.6 成功安装后,在/usr/bin 目录中会多出两个执行程序,即 python3.6 和 python3.6m,其中后者在内存分配方式上做了优化,实际使用时任选其一即可。

在介绍SparkShell 时,曾经提到过Spark有一个名为pyspark的交互式编程工具,它 要求在Python语言的运行环境中才能使用。为了使得pyspark脚本能够找到正确的Python 运行环境,可以在运行脚本之前设置一下PYSPARK_PYTHON的环境变量。为方便起见我们将 其添加到/etc/profile文件(或者在Spark中的spark-env.sh文件配置也可以):
添加:export PYSPARK_PYTHON=python3

PySparkShell交互编程环境
当Python3.6 运行环境准备就绪,现在就可以启动PySparkShell交互编程环境了。
输入pyspark 回车 如果输出错误,下面是解决方案:

输入 sudo  vi  /etc/profile

将3.6m  改为3.7(因为3.7版本兼容性好)

如下图所示

之后输入pyspark,如下图所示则表示成功  ,(进入pyspark输入quit()表示退出)

从PySparkShell 启动输出的提示信息可以看出,Spark2.4.8使用的是Python3.6,这 也再次证明之前的配置是正确的。

类似SparkShell 读取文件数据的做法,在这里同样测试一下PySparkShell中访问 本地和HDFS文件。请先确认一下HDFS服务是否正常运行,具体步骤参考前述内容即可,这 里假定HDFS已正常运行。请在PySparkShell中输入以下代码执行:
>>> rdd=sc.textFile("file:///home/spark/hello.txt")

>>> rdd.first()

'hello,hello'                                                                   

>>> rdd=sc.textFile("hdfs:///mydata/hello.txt")

>>> rdd.first()

'hello,hello'

如果不出意外的话,应该会打印输出从文件中读取到的数据。

测试完毕,直接按下Ctrl+D快捷键,或者输入“quit()”就可以退出PySparkShell 交互编程环境的界面。
Pip的安装配置
在Linux终端执行下面的命令安装pip工具,然后查看一下pip的版本信息,以及 和对应管理的Python版本。
spark@ubuntu:~$ sudo apt -y install python3-pip

spark@ubuntu:~$ sudo apt -y install python3.6-distutils

spark@ubuntu:~$ which pip

/usr/bin/pip

spark@ubuntu:~$ which pip3

/usr/bin/pip3

spark@ubuntu:~$ ll /usr/bin/pip*

-rwxr-xr-x 1 root root 365 Oct 29 07:02 /usr/bin/pip*

-rwxr-xr-x 1 root root 367 Oct 29 07:02 /usr/bin/pip3*

spark@ubuntu:~$ pip -V

pip 20.0.2 from /usr/lib/python3/dist-packages/pip (python 3.8)

spark@ubuntu:~$ pip3 -V

pip 20.0.2 from /usr/lib/python3/dist-packages/pip (python 3.8)

在Linux终端继续执行下面的命令:
在Linux终端继续执行下面的命令:
输入spark@ubuntu:~$ sudo ln -sf /usr/bin/python3.6 /usr/bin/python  回车

spark@ubuntu:~$ sudo vi /usr/bin/pip

spark@ubuntu:~$ sudo vi /usr/bin/pip3

现在可以验证pip和pip3的设置是否达到了预期目标。

当pip包管理工具安装配置好之后,考虑到实际使用时需要访问网络下载软件,下 面将pip源改成国内镜像(如阿里云、清华镜像站点等),以加快下载速度。
进入 sudo vi /etc/pip.conf

输入:

[global]

index-url=https://pypi.tuna.tsinghua.edu.cn/simple

trusted-host=pypi.tuna.tsinghua.edu.cn

[list]

format = columns

当pip镜像源配置文件修改完毕,可以通过下面的命令进行验证是否有效:
spark@ubuntu:~$ pip config list -v

Spark框架目录结构
当安装好了Spark之后,在Spark的系统目录中包含有一系列的文件和子目录内容,每 个目录都有其特定的目的和用途。Spark安装目录的内容结构如图所示。

————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.youkuaiyun.com/2401_87241283/article/details/146374696

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值