教你手工安装开源Hadoop集群

第1章         Hadoop的部署
1.1.   环境部署
1.1.1.   环境配置
1.1.1.1.  硬件配置
Memory: 32G
CPU: Intel(R) Xeon(R) 2.00GHz 4CPU 24Core
1.1.1.2.  软件配置
OS: Oracle Enterprise Linux 6.6 x86_64(Red Hat Enterprise Linux Server release 6.6)
File System: Ext4
1.1.2.   软件安装
1.1.2.1.  JDK安装及配置环境变量
JDK采用绿色解压缩版server-jre-7u76-linux-x64.tar.gz。
命令:tar zxvf server-jre-7u76-linux-x64.tar.gz -C /opt/
解压完成后配置环境变量
命令:vi  /ect/profile
添加如下配置:
export JAVA_HOME=/opt/jdk1.7.0_76
export JAVA_BIN=/opt/jdk1.7.0_76/bin
exportCLASSPATH=.:$JAVA_HOME/lib/tools.jar
:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH
退出保存执行source /ect/profile
 
1.1.2.2.  CDH安装及配置
1.1.2.2.1.修改主机名
1) 修改/etc/sysconfig/network文件:
NETWORKING=yes
HOSTNAME=master.hadoop
NETWORKING_IPV6=no
GATEWAY=192.168.64.1
  1. 其中HOSTNAME与主机名一致。主机名如果跟系统安装时不一致请执行hostname命令让其立即生效,否则会影响各节点互相访问。修改/etc/hosts文件,添加:
172.18.166.251 master.hadoop
172.18.166.252 datanode
复制hosts文件到每个节点上
3) 执行如下命令:service network restart
1.1.2.2.2.打通SSH(所有节点)
ssh -p6208 bi-MN00
1) 这里master节点和其他datanode节点会略有区别。 首先所有节点均执行如下命令,遇到提示一路回车即可:
ssh-keygen -t rsa
2) 然后在所有节点执行以下命令:
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
3) scp文件到所有datenode节点:
scp ~/.ssh/authorized_keys root@datanode1:~/.ssh/
chmod 600 ~/.ssh/authorized_keys  
1.1.2.2.3.关闭防火墙(所有节点)
1) 防火墙会引起hadoop相关组件通讯的各种异常。 防火墙:
service iptables stop (临时关闭)
chkconfig iptables off (重启后生效)
2) SELINUX:
setenforce 0 (临时生效)
修改/etc/selinux/config 下的 SELINUX=disabled (重启后生效)。
 
1.1.2.2.4.安装NTP服务(所有节点)
集群中所有主机必须保持时间同步,如果时间相差较大会引起各种问题。具体思路如下:
master节点作为ntp服务器与外界对时中心同步时间,随后对所有datanode节点提供时间同步服务;所有datanode节点以master节点为基础同步时间;所有节点安装相关组件:ntp与ntpdate。按顺序安装即可,完成后,配置开机启动:
chkconfig ntpd on
检查是否设置成功:
chkconfig --list ntpd
其中2-5为on状态就代表成功。
1.1.2.2.5.配置内网NTP服务器(master节点)
1) 在配置之前,先使用ntpdate手动同步一下时间,免得本机与对时中心时间差距太大,使得ntpd不能正常同步。这里选用65.55.56.206作为对时中心。
ntpdate -u 65.55.56.206
2) ntp服务只有一个配置文件/etc/ntp.conf,配置好了就OK。这里只给出有用的配置,不需要的配置都用#注掉,这里就不在给出:
restrict default nomodify notrap
server 65.55.56.206 prefer
3) 配置文件完成,保存退出,启动服务,执行如下命令:
service ntpd start
chkconfig ntpd on (设置开机启动)
4) 检查是否成功,用ntpstart命令查看同步状态,出现以下状态代表启动成功:
synchronised to NTP server () at stratum 2
time correct to within 74 ms
polling server every 128 s
如果出现异常请等待几分钟,一般等待5-10分钟才能同步。
1.1.2.2.6.配置ntp客户端(所有datanode节点)
server master.hadoop
ok保存退出,请求服务器前,请先使用ntpdate手动同步一下时间:
ntpdate -u 172.18.166.251 (内网ntp服务器)
这里可能出现同步失败的情况,请不要着急,一般是本地的ntp服务器还没有正常启动,一般需要等待5-10分钟才可以正常同步。启动服务:
service ntpd start
chkconfig ntpd on
因为是连接内网,这次启动等待的时间会比master节点快一些,但是也需要耐心等待一会儿。
1.1.2.2.7.查看SELinux状态:
1、/usr/sbin/sestatus -v      ##如果SELinux status参数为enabled即为开启状态
SELinux status:                 enabled
2、getenforce                    ##也可以用这个命令检查
关闭SELinux:
1、临时关闭(不用重启机器):
setenforce 0                      ##设置SELinux 成为permissive模式
                      ##setenforce 1 设置SELinux 成为 enforcing模式
2、修改配置文件需要重启机器:
修改/etc/selinux/config 文件
将SELINUX=enforcing改为SELINUX=disabled
重启机器即可
1.1.2.3.  配置MySQL 5.1.72
1.1.2.3.1.安装mysql5.1.72
安装Server端:
     chmod 755 MySQL-server-community-5.1.72-1.rhel5.x86_64.rpm
     rpm -ivh MySQL-server-community-5.1.72-1.rhel5.x86_64.rpm --nodeps --force
替换mysql.cnf文件:
     chmod 755 mysql.cnf
     cp mysql.cnf /usr/share/mysql/my-medium.cnf
     cp mysql.cnf /etc/my.cnf
安装Client端:
     chmod 755 MySQL-client-community-5.1.72-1.rhel5.x86_64.rpm
     rpm -ivh MySQL-client-community-5.1.72-1.rhel5.x86_64.rpm --nodeps --force
1.1.2.3.2.修改mysql密码:
mysqladmin flush-privileges password 'root'
1.1.2.3.3.配置远程访问:
连接mysql:mysql -h localhost -u root –p   回车后输入登陆密码即可。
use  mysql;
select Host,User from user;
UPDATE user SET Host = '%' WHERE User= 'root' LIMIT 1;
flush privileges;

1.1.2.5.  yum遇到的问题解决
rm -f /var/run/yum.pid    #杀死yum进程
yum clean all
yum makecache
1.1.2.6.  Hadoop2.2.0安装及配置
1.1.2.6.1.在linux编译hadoop2.4.1的源码
  1. 首先安装google的protobuf
yum install glibc-headers
yum install gcc
yum install gcc-c++
yum install make
yum install cmake
yum install openssl-devel
yum install ncurses-devel
  1.  安装protobuf-2.5.0.tar.gz
./configure && make && make check && make install
  1.  配置maven的环境变量,编译hadoop源码
mvn package -DskipTests -Pdist,native
1.1.2.6.2.伪分布搭建
HDFS伪分布搭建
修改配置文件etc/hadoop/hadoop-env.sh:
JAVA_HOME=/opt/jdk1.7.0_76
 
修改配置文件etc/hadoop/core-site.xml:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master.hadoop:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/local/hadoop/tmp</value>
    </property>
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
</configuration>
 
修改配置文件etc/hadoop/hdfs-site.xml:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
格式化文件系统:
  $ bin/hdfs namenode -format
 
启动HDFS集群:
  $ sbin/start-dfs.sh
 
访问web浏览器:
    NameNode - http://localhost:50070/
练习:
  创建目录:
  $ bin/hdfs dfs -mkdir /user
  $ bin/hdfs dfs -mkdir /user/root
  复制文件:
  $ bin/hdfs dfs -put /etc/profile input
关闭集群:
  $ sbin/stop-dfs.sh
Yarn伪分布安装
修改配置文件etc/hadoop/mapred-site.xml:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
 
修改配置文件etc/hadoop/yarn-site.xml:
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
启动Yarn集群:
  $ sbin/start-yarn.sh
 
访问web浏览器:
ResourceManager - http://localhost:8088/
 
运行例子:
  $bin/hadoopjar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar wordcount input output
 
查看结果:
  $ bin/hdfs dfs -cat output/*
 
关闭Yarn集群:
  $ sbin/stop-yarn.sh
 
-----------------------------
1.1.2.6.3.搭建手工切换HA(high availibility)的HDFS集群
namenode:master和dataslave
datanode:dataslave1
journalnode:master、dataslave、dataslave1
 
1.0 配置linux环境
1.0.1 确保虚拟机直接可以ping成功
       ping 192.168.1.181
1.0.2 设置hostname
       vi /etc/sysconfig/network
1.0.3 配置/etc/hosts
       vi /etc/hosts
1.0.4 关闭防火墙
       service iptables stop
       chkconfig iptables off
1.0.5 实现ssh免密码登录
1.0.6 jdk安装(前面已经讲述)
 
1.1 配置文件(hadoop-env.sh、core-site.xml、hdfs-site.xml、slaves)
1.1.1 hadoop-env.sh
  export JAVA_HOME=/usr/local/jdk1.7.0-45
1.1.2 core-site.xml
 
<property>
<name>fs.defaultFS</name>
<value>hdfs://cluster</value>
</property>
 
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
 
1.1.3 hdfs-site.xml
 
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
 
<property>
<name>dfs.nameservices</name>
<value>cluster</value>
</property>
 
<property>
<name>dfs.ha.namenodes.cluster</name>
<value>master,dataslave</value>
</property>
 
<property>
<name>dfs.namenode.rpc-address.cluster.master</name>
<value>master:9000</value>
</property>
 
<property>
<name>dfs.namenode.http-address.cluster.master</name>
<value>master:50070</value>
</property>
 
<property>
<name>dfs.namenode.rpc-address.cluster.dataslave</name>
<value>dataslave:9000</value>
</property>
 
<property>
<name>dfs.namenode.http-address.cluster.dataslave</name>
<value>dataslave:50070</value>
</property>
 
<property>
<name>dfs.ha.automatic-failover.enabled.cluster</name>
<value>false</value>
</property>
 
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master:8485;dataslave:8485;dataslave1:8485/cluster</value>
</property>
 
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/local/hadoop/tmp/journal</value>
</property>
 
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
 
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
 
<property>
<name>dfs.client.failover.proxy.provider.cluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
 
1.1.6 slaves
master
dataslave
dataslave1
dataslave2
 
1.1.7 把master上的hadoop文件夹复制到dataslave、dataslave1、dataslave2节点
 
1.2 启动journalnode集群
  在master、dataslave、dataslave1上分别执行hadoop/sbin/hadoop-daemon.sh start journalnode
1.3 格式化namenode、启动namenode
  在master上执行hadoop/bin/hdfs namenode -format
  在master上分别执行hadoop/sbin/hadoop-daemon.sh start namenode
  在dataslave上执行hadoop/bin/hdfs namenode -bootstrapStandby
  在dataslave上分别执行hadoop/sbin/hadoop-daemon.sh start namenode
  在master上执行hadoop/bin/hdfs haadmin -failover --forceactive dataslave master
1.4 启动datanode
  在master上分别执行hadoop/sbin/hadoop-daemons.sh start datanode
1.1.2.6.4.搭建自动切换HA(high availibility)的HDFS集群
zookeeper:mast缩,重命名为zookeeper,把conf/zoo_sample.cfg重命名为conf/zoo.cfg
  修改文件conf/zoo.cfger、dataslave、dataslave1
namenode:master和dataslave
datanode:dataslave1
journalnode:master、dataslave、dataslave1
 
2.0 搭建zookeeper集群,并启动
 2.0.1  在master上解压
  (1)dataDir=/opt/local/zookeeper/data
  (2)增加以下内容
     server.1=master:2888:3888
     server.2=dataslave:2888:3888
     server.3=dtaslave1:2888:3888
  创建目录mkdir zookeeper/data
  写入文件echo 1 zookeeper/data/myid
 
  复制zookeeper文件夹到hadoop2、hadoop3上
  scp -rq zookeeper  hadoop2:/usr/local
  scp -rq zookeeper  hadoop3:/usr/local
 
  在hadoop2上执行命令echo 2 zookeeper/data/myid
  在hadoop3上执行命令echo 3 zookeeper/data/myid
 2.0.2 启动
  在master、dataslave、dtaslave1上,分别执行命令zookeeper/bin/zkServer.sh start
 2.0.3 验证
  执行命令zookeeper/bin/zkCli.sh
  进入后执行ls /
2.1 配置文件(hadoop-env.sh、core-site.xml、hdfs-site.xml、slaves)
2.1.1 hadoop-env.sh
  export JAVA_HOME=/usr/local/jdk1.7.0-45
2.1.2 core-site.xml
 
<property>
<name>fs.defaultFS</name>
<value>hdfs://cluster1</value>
</property>
 
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
 
<property>
<name>ha.zookeeper.quorum</name>
<value>master:2181,dataslave:2181,dataslave1:2181</value>
</property>
 
2.1.3 hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
 
<property>
<name>dfs.nameservices</name>
<value>cluster1</value>
</property>
 
<property>
<name>dfs.ha.namenodes.cluster1</name>
<value>master,dataslave</value>
</property>
 
<property>
<name>dfs.namenode.rpc-address.cluster1.master</name>
<value>master:9000</value>
</property>
 
<property>
<name>dfs.namenode.http-address.cluster1.master</name>
<value>master:50070</value>
</property>
 
<property>
<name>dfs.namenode.rpc-address.cluster1.dataslave</name>
<value>dataslave:9000</value>
</property>
 
<property>
<name>dfs.namenode.http-address.cluster1.dataslave</name>
<value>dataslave:50070</value>
</property>
 
<property>
<name>dfs.ha.automatic-failover.enabled.cluster1</name>
<value>true</value>
</property>
 
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://dataslave:8485;dataslave:8485/cluster1</value>
</property>
 
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/local/hadoop/tmp/journal</value>
</property>
 
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
 
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
 
<property>
<name>dfs.client.failover.proxy.provider.cluster1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
 
2.1.6 slaves
dataslave
dataslave1
2.1.7 删除其他节点的hadoop文件夹,然后把master上的hadoop文件夹复制到其他节点
2.2 格式化zk集群
  在master上执行hadoop/bin/hdfs zkfc -formatZK
2.3 启动journalnode集群
  在master、dataslave、dataslave1上分别执行hadoop/sbin/hadoop-daemon.sh start journalnode
2.4 格式化namenode、启动namenode
  在master上执行hadoop/bin/hdfs namenode -format
  在master上分别执行hadoop/sbin/hadoop-daemon.sh start namenode
  在dataslave上执行hadoop/bin/hdfs namenode -bootstrapStandby
  在dataslave上分别执行hadoop/sbin/hadoop-daemon.sh start namenode
2.5 启动datanode
  在master上分别执行hadoop/sbin/hadoop-daemons.sh start datanode
2.6 启动ZKFC
  在master、dataslave上启动zkfc,执行命令hadoop/sbin/hadoop-daemon.sh start zkfc
1.1.2.6.5.搭建实现federation的HDFS集群
3.搭建实现federation的HDFS集群(多了federation配置)
----------------------------------------------------------------------------------------------
zookeeper:hadoop1、hadoop2、hadoop3
cluster1的namenode:hadoop1、hadoop2
cluster3的namenode:hadoop3、hadoop4
datanode:hadoop3、hadoop4、hadoop5、hadoop6
journalnode:hadoop1、hadoop2、hadoop3
 
3.1 配置文件(hadoop-env.sh、core-site.xml、hdfs-site.xml、slaves)
3.1.1 hadoop-env.sh
  export JAVA_HOME=/usr/local/jdk1.7.0-45
3.1.2 core-site.xml
 
<property>
<name>fs.defaultFS</name>
<value>hdfs://cluster1</value>
</property>
 
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
 
<property>
<name>fs.viewfs.mounttable.default.link./cluster1</name>
<value>hdfs://hadoop1:9000/</value>
</property>
<property>
<name>fs.viewfs.mounttable.default.link./cluster3</name>
<value>hdfs://hadoop3:9000</value>
</property>
 
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>
 
3.1.3 hdfs-site.xml
 
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
 
<property>
<name>dfs.nameservices</name>
<value>cluster1,cluster3</value>
</property>
 
<property>
<name>dfs.ha.namenodes.cluster1</name>
<value>hadoop1,hadoop2</value>
</property>
 
<property>
<name>dfs.namenode.rpc-address.cluster1.hadoop1</name>
<value>hadoop1:9000</value>
</property>
 
<property>
<name>dfs.namenode.http-address.cluster1.hadoop1</name>
<value>hadoop1:50070</value>
</property>
 
<property>
<name>dfs.namenode.rpc-address.cluster1.hadoop2</name>
<value>hadoop2:9000</value>
</property>
 
<property>
<name>dfs.namenode.http-address.cluster1.hadoop2</name>
<value>hadoop2:50070</value>
</property>
 
<property>
<name>dfs.ha.namenodes.cluster3</name>
<value>hadoop3,hadoop4</value>
</property>
 
<property>
<name>dfs.namenode.rpc-address.cluster3.hadoop3</name>
<value>hadoop3:9000</value>
</property>
 
<property>
<name>dfs.namenode.http-address.cluster3.hadoop3</name>
<value>hadoop3:50070</value>
</property>
 
<property>
<name>dfs.namenode.rpc-address.cluster3.hadoop4</name>
<value>hadoop4:9000</value>
</property>
 
<property>
<name>dfs.namenode.http-address.cluster3.hadoop4</name>
<value>hadoop4:50070</value>
</property>
 
<property>
<name>dfs.ha.automatic-failover.enabled.cluster1</name>
<value>true</value>
<description>2个集群的配置中该地方不同</description>
</property>
 
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/cluster1</value>
<description>2个集群的配置中该地方不同</description>
</property>
 
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/local/hadoop/tmp/journal</value>
</property>
 
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
 
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
 
<property>
<name>dfs.client.failover.proxy.provider.cluster1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
<description>2个集群的配置中该地方不同</description>
</property>
 
3.1.6 slaves
hadoop3
hadoop4
hadoop5
hadoop6
 
3.1.7 删除其他节点的hadoop文件夹,然后把hadoop1上的hadoop文件夹复制到其他节点
3.2 在hadoop1、hadoop2、hadoop3上,分别执行命令zookeeper/bin/zkServer.sh start
3.3 格式化zk集群
  在hadoop1、hadoop3上执行hadoop/bin/hdfs zkfc -formatZK
3.4 启动journalnode集群
  在hadoop1、hadoop2、hadoop3上分别执行hadoop/sbin/hadoop-daemon.sh start journalnode
 
3.5 格式化namenode、启动namenode
  在hadoop1上执行hadoop/bin/hdfs namenode -format  -clusterId cid
  在hadoop1上分别执行hadoop/sbin/hadoop-daemon.sh start namenode
  在hadoop2上执行hadoop/bin/hdfs namenode -bootstrapStandby
  在hadoop2上分别执行hadoop/sbin/hadoop-daemon.sh start namenode
 
  在hadoop3上执行hadoop/bin/hdfs namenode -format  -clusterId cid
  在hadoop3上分别执行hadoop/sbin/hadoop-daemon.sh start namenode
  在hadoop4上执行hadoop/bin/hdfs namenode -bootstrapStandby
  在hadoop4上分别执行hadoop/sbin/hadoop-daemon.sh start namenode
3.6 启动datanode
  在hadoop1上分别执行hadoop/sbin/hadoop-daemons.sh start datanode
3.7 启动ZKFC
  在hadoop1、hadoop2、hadoop3、hadoop4上启动zkfc,执行命令hadoop/sbin/hadoop-daemon.sh start zkfc
 
 
4.验证:
 
viewFS是跨隶属于同一个federation的多个hdfs的文件管理系统。
 
使用hadoop1:50070/dfsclusterhealth.jsp查看集群情况
使用hadoop/bin/hdfs dfs -ls viewfs:///统一查看联邦中的数据内容
 
1.1.2.6.6.Yarn集群搭建
修改配置文件 yarn-site.xml
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop1</value>
</property>
 
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
 
修改配置文件 mapred-site.xml
 
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
启动在master上执行 hadoop/sbin/start-yarn.sh
 
1.在mapred-site中配置
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
<description>MapReduce JobHistory Server host:port.    Default port is 10020.</description>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
<description>MapReduce JobHistory Server Web UI host:port. Default port is 19888.</description>
</property>
<property>
<name>mapreduce.jobhistory.intermediate-done-dir</name>
<value>/opt/local/hadoop/tmp/mr_history</value>
<description>Directory where history files are written by MapReduce jobs.</description>
</property>
<property>
<name>mapreduce.jobhistory.done-dir</name>
<value>/opt/local/hadoop/tmp/mr_history</value>
<description>Directory where history files are managed by the MR JobHistory Server.</description>
</property>
 
2.在yarn-site.xml中配置
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
3.复制到集群的其他节点
4.重新启动yarn平台
  sbin/stop-yarn.sh
  sbin/start-yarn.sh
 
 最后执行sbin/mr-jobhistory-daemon.sh start historyserver

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柒嘴八舌

你的鼓励将是我创造最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值