Hadoop集群搭建详细教程

Hadoop环境搭建

1. 环境准备

1. 首先创建一台模板机

所谓的模板机是进行了一些最基础的配置,比如说进行主机名修改、网络配置、下载一些插件等准备工作。

不会创建虚拟机的可以通过Centos7.5安装配置及虚拟机搭建详细教程进行虚拟机创建。

1.1 网络测试

[root@hadoop101 ~]# ping www.baiu.com

如果ping不通百度,可能是网络配置没有配置好,可以通过配置文件等修改。

1.2 修改IP地址

//进入ip配置文件进行修改
[root@hadoop101 ~]# vim /etc/sysconfig/network-scripts/ifcfg-
ens33

关闭DHCP自动分配地址功能,并手动添加IPADDR、GETWAY、DNS1配置。其中,IPADDR是自己指定的ip地址,GETWAY是网关,DNS1是域名解析器。

网络配置文件

1.3 修改主机名

//进入主机名配置文件:
[root@hadoop101 ~]# vim /etc/hostname

修改主机名为hadoop101

修改主机名

1.4 重启模板机

修改完之后重启虚拟机:

[root@hadoop101 ~]# reboot

1.5 关闭防火墙

注意:在企业开发时,通常单个服务器的防火墙是关闭的。公司整体对外会设置非常安全的防火墙
1、查看防火墙状态

[root@hadoop101 ~]# systemctl status firewalld

如果是活跃状态会如下图所示:
防火墙开启状态
如果是活跃装态需要我们手动先关闭之后再设置成开机不自启状态,保证我们以后开机之后防护墙是关闭的。

//关闭防火墙
[root@hadoop101 ~]# systemctl stop firewalld

关闭之后再查看装态:
防火墙关闭状态

//设置防火墙开机不自启
[root@hadoop101 ~]# systemctl disable firewalld

查看防火墙开机不自启是否设置成功:

[root@hadoop101 ~]# systemctl is-enabled firewalld

当显示如下图所示即说明设置成功:
设置防火墙开机不自启

1.6 安装必要的插件

安装插件之前必须保证虚拟机可以正常上网。

1.6.1 安装epel-release

注:Extra Packages for Enterprise Linux是为“红帽系”的操作系统提供额外的软件包,适用于RHEL、CentOS和Scientific Linux。相当于是一个软件仓库,大多数rpm包在官方 repository 中是找不到的)

[root@hadoop101 ~]# yum install -y epel-release
1.6.2 安装其它插件

注意:如果Linux安装的是最小系统版,还需要安装如下工具;如果安装的是Linux桌面标准版,不需要执行如下操作。

[root@hadoop101 ~]# yum install -y  vim net-tools psmisc  nc  rsync  lrzsz  ntp libzstd openssl-static tree iotop git

1.7 创建普通用户

1.7.1 创建用户
//创建自定义用户
[root@hadoop101 ~]# useradd zy
//设置密码
[root@hadoop101 ~]# passwd 123456
1.7.2 配置用户具有root用户权限

方便后期加sudo执行root权限的命令

//编辑etc目录下的sudoers文件
[root@hadoop101 ~]# vim /etc/sudoers

在文件中添加创建的用户并添加zy ALL=(ALL) NOPASSWD:ALL,如下图所示:
sudoers配置文件

1.8 创建modulesoftware目录

1.8.1 创建目录
//进入到根目录下的opt目录 并创建新的目录
[root@hadoop101 opt]# mkdir module
[root@hadoop101 opt]# mkdir software
[root@hadoop101 opt]# ll
1.8.2 修改文件夹的所有者和所属组
[root@hadoop101 opt]# chown zy:zy /opt/module
[root@hadoop101 opt]# chown zy:zy /opt/software
// 查看文件所有者和所属组
[root@hadoop101 opt]# ll -ls

1.9 卸载虚拟机自带的JDK

注意:如果你的虚拟机是最小化安装不需要执行这一步。

[root@hadoop101 opt]# rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps

参数说明

rpm -qa查询所安装的所有的rpm软件包
grep -i忽略大小写
xargs -n1表示每次只传递一个参数
rpm -e --nodeps强制卸载软件

1.10 设置模板及的hosts映射文件

文件中的ip地址以及域名 自己根据自己的实际情况填写

192.168.100.101 hadoop101
192.168.100.102 hadoop102
192.168.100.103 hadoop103
192.168.100.104 hadoop104
192.168.100.105 hadoop105
192.168.100.106 hadoop106
192.168.100.107 hadoop107
192.168.100.108 hadoop108

至此,模板机正式创建完毕!

2. 克隆三台虚拟机

2.1 克隆虚拟机

关闭hadoop101,克隆出三台虚拟机,分别是:hadoop102、hadoop103、hadoop104,具体克隆过程这里不再赘述。

2.2 配置虚拟机

分别启动三台虚拟机,并修改三台虚拟机的ip地址、主机名等信息,修改完成之后,重启虚拟机。具体修改细节参考第1章的内容。

2.3 修改windows的hosts文件

windows中hosts文件路径为:C:\Windows\System32\drivers\etc。配置完成之后才可以使用远程连接工具例如Xshell连接服务器进行操作。

3.安装hadoop并进行配置

3.1 卸载虚拟机自带JDK

具体卸载命令及操作,参见第一章,这里不再赘述。

3.2 安装JDK

3.2.1 解压

因为Hadoop程序是用Java语言开发的,因此需要JDK环境才能运行。将XXX.tar.gz安装包上传到/opt/software上,并解压到/opt/module文件夹下。

//解压到指定目录下
[zy@hadoop102 software]$ tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/

3.2.2 配置环境变量

将hadoop的bin目录以及sbin目录配置到环境变量文件中,但是原则上不要修改系统自带的环境变量文件,使用另外提供的配置文件路径。

[zy@hadoop102 software]$ cd /etc/profile.d/
[zy@hadoop102 profile.d]$ sudo touch my_env.sh
[zy@hadoop102 profile.d]$ sudo vim my_env.sh

添加环境变量:

# 配置jdk的环境变量
export JAVA_HOME=/opt/module/jdk-8u212/
export PATH=$PATH:$JAVA_HOME/bin

配置完之后,重写加载配置文件使其生效

[zy@hadoop102 ~]$ source /etc/profile

检查jdk是否配置成功:

[zy@hadoop102 ~]$ jdk -version

3.3 安装Hadoop

3.3.1 解压

同jdk的上传解压方法一样。

3.3.2 配置环境变量

同样是将hadoop的环境变量添加到my_env.sh文件中

export HADOOP_HOME=/opt/module/hadoop-3.3.4/
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

同样需要source一下,使其生效。

3.3.3 检查是否配置成功

[zy@hadoop102 ~]$ hadoop version

3.4 本地模式运行

执行一个简单的MR程序进行测试:

[zy@hadoop102 hadoop-3.3.4]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar wordcount wcinput wcoutput

3.4 分发

分发之前需要将module下所有文件和文件夹所属组和所属者改为zy

[zy@hadoop102 hadoop-3.3.4]$ sudo chown zy:zy -R /opt/module

将hadoop102上的/opt/module目录下的jdk以及hadoop都分发给hadoop103和hadoop104。
同时需要分发my_env.sh环境变量,该拷贝需要用到scp命令。

[zy@hadoop102 ~]$ scp -r /opt/module/ zy@hadoop103:/opt/module
[zy@hadoop102 ~]$ scp -r /opt/module/ zy@hadoop104:/opt/module
[zy@hadoop102 ~]$ sudo scp /etc/profile.d/my_env.sh zy@hadoop103:/etc/profile.d/
[zy@hadoop102 ~]$ sudo scp /etc/profile.d/my_env.sh zy@hadoop104:/etc/profile.d/

分发完毕之后,source一下使其生效。

3.5 编写群发Shell脚本

3.5.1 免密配置

在使用脚本之前需要配置免密,而且后续群起集群之时也需要进行免密配置,因此不如在这里先配置好,提高效率。
** 1)第一步:生成公钥和私钥 **

// 在家目录下执行下列命令 生成公钥和私钥
// 执行该命令一路回车即可
[zy@hadoop102 ~]$ ssh-keygen -t rsa

执行完上述命令之后,在/home/zy目录下会生成一个隐藏目录.ssh

// 查看隐藏目录
[zy@hadoop102 ~]$ ls -al
//进入隐藏目录
[zy@hadoop102 ~]$ cd /home/zy/.ssh/
//查看文件 会发现已经生成了公钥和私钥文件
[zy@hadoop102 .ssh]$ ll

2)第二步:将公钥拷贝到要免密登录的目标机器上

拷贝不仅要拷贝到其他及其上,比如拷贝到hadoop103、hadoop104,同时也要给自己拷贝一份。

// 将公钥拷贝到要免密登录的目标机器上
[zy@hadoop102 .ssh]$ ssh-copy-id hadoop102
[zy@hadoop102 .ssh]$ ssh-copy-id hadoop103
[zy@hadoop102 .ssh]$ ssh-copy-id hadoop104

3)第三步:在hadoop103和hadoop104上也执行上述第一步和第二步
切换到其他服务器,执行上述步骤,使三台节点达到无论谁访问谁都是免密的状态。

3.5.2 编写脚本

将自定义的脚本文件同一放在/home/zy/bin目录下,进入到该目录下创建一个mysync.sh文件,并添加可执行权限。

[zy@hadoop102 ~]$ cd /home/zy/bin
[zy@hadoop102 bin]$ touch mysync.sh
[zy@hadoop102 bin]$ vim mysync.sh

在文件中添加下述内容:

#!/bin/bash
# 分发文件使用的
# 判空
if [ $# -lt 1 ]
then
        echo "输入参数为空!!!"
        exit
fi
# 如果非空 遍历主机
for host in hadoop103 hadoop104
do
        # 参数可能多个 再嵌套一层循环
        for file in $@
        do
                # 判断file是否为存在
                if [ -e $file ]
                # 如果文件存在 执行then
                then
                        # 1. 获取文件的目录
                        # 但是传递的参数可能为软链接 所以先进入
                        pdir=$(cd -P $(dirname $file);pwd)
                        # 2. 获取文件名
                        fname=$(basename $file)
                        # 3. 使用ssh命令登录到对应主机上创建相同目录结构
                        # 但是传递的参数可能为软链接 所以先进入
                        ssh $host "mkdir -p $pdir"
                        # 4. 使用rsync命令分发
                        rsync -av $pdir/$fname $host:$pdir
                # 如果不存在 则给出提示之后继续执行下一轮
                else
                        echo "输入的 $file 文件不存在"
                fi
        done
done

3.6 配置集群模式

// 进入指定目录下 修改5个配置文件
[zy@hadoop102 bin]$ cd /opt/module/hadoop-3.3.4/etc/hadoop/

3.6.1 core-site.xml

[zy@hadoop102 hadoop]$ vim core-site.xml

在文件中添加下述内容:

	<!-- 指定NameNode的地址 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop102:8020</value>
    </property>

    <!-- 指定hadoop数据的存储目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/module/hadoop-3.3.4/data</value>
    </property>

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

3.6.2 修改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>

3.6.3 修改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>
    

下面的配置是针对于调度的,暂时可以先不配置:

<!-- 选择调度器 默认是容量调度器Capacity Scheduler-->
    <property>
        <description>The class to use as the resource scheduler.</description>
        <name>yarn.resourcemanager.scheduler.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
    </property>
<!--    ResourceManager处理调度器请求的线程数量,默认是50;如果提交的任务数大于50,可以增加核值-->
<!--    但是不能超过3台*4线程 = 12 线程 (去除其他应用程序实际不能超过8)-->
    <property>
        <description>Number of threads to handle scheduler interface.</description>
        <name>yarn.resourcemanager.scheduler.client.thread-count</name>
        <value>4</value>
    </property>
<!--    是否让Yarn自动检测硬件进行配置 默认是flase 如果该节点有很多其他应用-->
<!--    建议手动配置。如果该节点没有其他应用程序,可以采用自动-->
    <property>
        <description>Enable auto-detection of node capabilities such as
            memory and CPU.
        </description>
        <name>yarn.nodemanager.resource.detect-hardware-capabilities</name>
        <value>false</value>
    </property>
<!--    是否将虚拟核数当作CPU核数,默认是false,采用物理cpu核数-->
    <property>
        <description>Flag to determine if logical processors(such as
            hyperthreads) should be counted as cores. Only applicable on Linux
            when yarn.nodemanager.resource.cpu-vcores is set to -1 and
            yarn.nodemanager.resource.detect-hardware-capabilities is true.
        </description>
        <name>yarn.nodemanager.resource.count-logical-processors-as-cores</name>
        <value>false</value>
    </property>
<!--    虚拟核数和物理核数乘数,默认是1.0-->
    <property>
        <description>Multiplier to determine how to convert phyiscal cores to
            vcores. This value is used if yarn.nodemanager.resource.cpu-vcores
            is set to -1(which implies auto-calculate vcores) and
            yarn.nodemanager.resource.detect-hardware-capabilities is set to true. The  number of vcores will be calculated as  number of CPUs * multiplier.
        </description>
        <name>yarn.nodemanager.resource.pcores-vcores-multiplier</name>
        <value>1.0</value>
    </property>
<!--    NodeManager使用内存数,默认是8G 修改为2G内存-->
    <property>
        <description>Amount of physical memory, in MB, that can be allocated
            for containers. If set to -1 and
            yarn.nodemanager.resource.detect-hardware-capabilities is true, it is
            automatically calculated(in case of Windows and Linux).
            In other cases, the default is 8192MB.
        </description>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>2048</value>
    </property>
    <!--nodemanager的CPU核数,不按照硬件环境自动设定时默认是8个,修改为2个-->
    <property>
        <description>Number of vcores that can be allocated
            for containers. This is used by the RM scheduler when allocating
            resources for containers. This is not used to limit the number of
            CPUs used by YARN containers. If it is set to -1 and
            yarn.nodemanager.resource.detect-hardware-capabilities is true, it is
            automatically determined from the hardware in case of Windows and Linux.
            In other cases, number of vcores is 8 by default.</description>
        <name>yarn.nodemanager.resource.cpu-vcores</name>
        <value>2</value>
    </property>
<!--    容器最小内存 默认是1G-->
    <property>
        <description>The minimum allocation for every container request at the RM       in MBs. Memory requests lower than this will be set to the value of this        property. Additionally, a node manager that is configured to have less memory   than this value will be shut down by the resource manager.
        </description>
        <name>yarn.scheduler.minimum-allocation-mb</name>
        <value>1024</value>
    </property>
<!--    容器最大内存 默认8G 修改为2G-->
    <property>
        <description>The maximum allocation for every container request at the RM       in MBs. Memory requests higher than this will throw an  InvalidResourceRequestException.
        </description>
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>2048</value>
    </property>
<!--    容器最小CPU核数 默认是1个-->
    <property>
        <description>The minimum allocation for every container request at the RM       in terms of virtual CPU cores. Requests lower than this will be set to the      value of this property. Additionally, a node manager that is configured to      have fewer virtual cores than this value will be shut down by the resource      manager.
        </description>
        <name>yarn.scheduler.minimum-allocation-vcores</name>
        <value>1</value>
    </property>
<!--    容器最大CPU数 默认是4个,修改为2个-->
    <property>
        <description>The maximum allocation for every container request at the RM       in terms of virtual CPU cores. Requests higher than this will throw an
            InvalidResourceRequestException.</description>
        <name>yarn.scheduler.maximum-allocation-vcores</name>
        <value>2</value>
    </property>
<!--    虚拟内存检查,默认打开,修改为关闭-->
    <property>
        <description>Whether virtual memory limits will be enforced for
            containers.</description>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
    </property>
    <!--    虚拟内存和物理内存设置比例,默认2.1-->
    <property>
        <description>Ratio between virtual memory to physical memory when       setting memory limits for containers. Container allocations are expressed in terms of physical memory, and virtual memory usage is allowed to exceed this allocation by this ratio.
        </description>
        <name>yarn.nodemanager.vmem-pmem-ratio</name>
        <value>2.1</value>
    </property>

3.6.4 修改mapred-site.xml

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

修改works

hadoop102
hadoop103
hadoop104

3.6.5 分发

[zy@hadoop102 ~]$ myrsync.sh /opt/module/hadoop-3.3.4/etc/hadoop/

3.7 启动集群

3.7.1 首次启动之格式化

因为搭建的时候,将namenode设置在了hadoop102上,因此格式化需要在hadoop102上进行。

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

// 格式化命令
[zy@hadoop102 hadoop-3.3.4]$ hdfs namenode -format

3.7.2 启动集群

格式化完成之后就可以群起集群了。

//在namenode所在节点上启动hdfs
[zy@hadoop102 ~]$ start-dfs.sh
// 在resourcemanager所在的节点启动yarn
[zy@hadoop102 ~]$ start-yarn.sh
// 查看服务是否已经开启
[zy@hadoop102 ~]$ jps

3.7.3 通过web端访问集群

在浏览器中键入网址hadoop102:9870访问hdfs的namonode服务。
在浏览器中键入网址hadoop102:2181访问hdfs的datanode服务。
在浏览器中键入网址hadoop103:8088访问yarn服务。

3.8 配置历史服务器

为了查看程序的历史运行情况,需要配置一下历史服务器。

3.8.1 修改mapred-site.xml

<!-- 历史服务器端地址 -->
<property>
    <name>mapreduce.jobhistory.address</name>
    <value>hadoop102:10020</value>
</property>

<!-- 历史服务器web端地址 -->
<property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>hadoop102:19888</value>
</property>

3.8.2 分发

[zy@hadoop102 ~]$ myrsync.sh /opt/module/hadoop-3.3.4/etc/hadoop

3.8.2 重启yarn服务

//重启yarn服务并开启历史服务功能
[zy@hadoop102 ~]$ stop-yarn.sh
//单台节点启动历史服务功能即可
[zy@hadoop102 ~]$ mapred --daemon start historyserver
// 查看服务是否启动
[zy@hadoop102 ~]$ jps

3.8.3 web端访问历史服务器

在浏览器中键入网址hadoop102:19888访问historyserver服务的JobHistory。

3.9 配置日志聚集功能

3.9.1 修改yarn-site.xml

修改yarn-site.xml并添加下列信息:

<!-- 开启日志聚集功能 -->
<property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
</property>

<!-- 设置日志聚集服务器地址 -->
<property>
    <name>yarn.log.server.url</name>
    <value>http://hadoop102:19888/jobhistory/logs</value>
</property>

<!-- 设置日志保留时间为7天 -->
<property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>604800</value>
</property>

3.9.2 分发

[zy@hadoop102 ~]$ myrsync.sh /opt/module/hadoop-3.3.4/etc/hadoop

3.9.3 启动日志聚集服务

注意:开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和HistoryServer。

// 关闭yarn服务
[zy@hadoop102 ~]$ stop-yarn.sh
// 关闭history服务
[zy@hadoop102 ~]$ mapred --daemon stop historyserver
// 开启yarn服务
[zy@hadoop102 ~]$ start-yarn.sh
// 开启history服务
[zy@hadoop102 ~]$ mapred --daemon start historyserver
[zy@hadoop102 ~]$ jps

最后通过web端的历史服务器上hadoop102:19888的历史任务查看日志信息。

3.10 关闭所有服务

[zy@hadoop102 ~]$ jps
[zy@hadoop102 ~]$ stop-yarn.sh
[zy@hadoop102 ~]$ stop-dfs.sh
[zy@hadoop102 ~]$ mapred --daemon stop historyserver
[zy@hadoop102 ~]$ jps

3.11 编写群起脚本

由于每次启动服务都要来回切换节点并且一条一条命令键入,因此可以编写一个shell脚本一键启动和关闭
在/home/zy/bin目录下创建一个myhadoop.sh文件,并增加可执行权限,在文件中添加以下内容:

#!/bin/bash
# 启动集群
if [ $# -lt 1 ]
then
        echo "参数为空!!!"
        exit;
fi

case $1 in
"start")
        echo "==========启动hadoop集群=========="
        echo "----------启动hdfs----------"
        ssh hadoop102 "/opt/module/hadoop-3.3.4/sbin/start-dfs.sh"
        echo " --------------- 启动 yarn ---------------"
        ssh hadoop103 "/opt/module/hadoop-3.3.4/sbin/start-yarn.sh"
        echo " --------------- 启动 historyserver ---------------"
        ssh hadoop102 "/opt/module/hadoop-3.3.4/bin/mapred --daemon start historyserver"
;;
"stop")
        echo " ============== 关闭 hadoop集群 ================"

        echo " --------------- 关闭 historyserver ---------------"
        ssh hadoop102 "/opt/module/hadoop-3.3.4/bin/mapred --daemon stop historyserver"
        echo " --------------- 关闭 yarn ---------------"
        ssh hadoop103 "/opt/module/hadoop-3.3.4/sbin/stop-yarn.sh"
        echo " --------------- 关闭 hdfs ---------------"
        ssh hadoop102 "/opt/module/hadoop-3.3.4/sbin/stop-dfs.sh"
;;
*)
    echo "输入参数有误..."
;;
esac

3.12 编写jpsall脚本

每次想要查看节点上启动的服务进程时,都需要输入三次jps并切换节点查看,有点不大方便。
因此可以编写一个shell脚本统一输入并查看,提高效率。
在/home/zy/bin目录下创建一个空文件jpsall.sh,并输入下列内容:

#!/bin/bash
# 所有结点执行jps
for host in hadoop102 hadoop103 hadoop104
do
        echo "==========$host=========="
        ssh $host "jps | grep -v Jps"
done

3.13 测试脚本

使用脚本启动服务

[zy@hadoop102 ~]$ myhadoop.sh start
[zy@hadoop102 ~]$ jpsall.sh

3.14 总结

到此位置,hadoop集群的中心模式已经搭建完毕,后期会搭建高可用模式,符合公司的实际业务。

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值