CDH6.3.2安装文档

当集群安装好后,即使你不常用,最少一个礼拜启动一回,长时间不启动它自检过不去就报废了,很麻烦。

正式安装之前,先说明一下CDH是基于Apache Hadoop及相关项目的发行版。CDH通过WEB界面管理,并提供了hadoop的两个核心功能:可扩展存储和分布式计算,以及企业级的重要功能。CDH是遵循Apache-licensed的开源软件,提供了基于hadoop的批处理、交互SQL、交互查询、基于角色的访问控制。

而Cloudera Manager是一个专属于并管理CDH集群的工具。Cloudera Manager通过向CDH集群的每个部分提供细粒度的可见性及可控性,建立出一套企业部署标准,这可以提高性能、服务质量、遵从性并降低管理成本。使用Cloudera Manager,您可以轻松地部署和集中操作完整的CDH堆栈和其他托管服务。Cloudera Manager提供一个集群范围的实时的主机和服务运行视图;提供一个单独的中央控制台,用于在整个集群中执行配置更改,并整合了一整套报告和诊断工具,以便优化硬件性能和利用率。

在管理工具上和hdp不同,可以理解为hdp是低定制保留了大部分原生特色的集群解决方案,而cdh恰恰相反,甚至在使用组件时都需要使用特定的cdh版本。


安装环境

虚拟机 Workstation pro 15
操作系统 CentOS Linux 7.4
JDK 1.8.0_144
Cloudera Manager 6.3.1
CDH 6.3.2
服务器总计4台,三台做大数据集群,一台做CDH管理节点,每台资源5核数24G内存50G磁盘,本篇作为测试环境安装,如果大家正式使用建议酌情扩大

CDH安装包可从网盘下载链接:https://pan.baidu.com/s/1FfcwxyqB5QjPrkDEBB5gag?pwd=9lm1
提取码:9lm1


开始安装

1、系统服务

所有节点禁用系统的防火墙、关闭selinux服务和ssh检查是否任然有StrictHostKeyChecking检查
systemctl disable firewalld.service
systemctl stop firewalld.service
selinux配置文件:/etc/selinux/config
ssh配置文件:/etc/ssh/ssh_config


2、配置域名映射,编辑/etc/hosts
在这里插入图片描述


3、配置SSH免密

直接使用套件,点击超链接查看配置方式


4、集群之间同步时间

Linux系统同步时间的方法


5、所有节点安装JDK

a)首先我们先看一下官方给出的jdk注意事项

The JDK must be 64-bit. Do not use a 32-bit JDK.
The installed JDK must be a supported version as documented in Java Requirements.
The same version of the Oracle JDK must be installed on each cluster host.
The JDK must be installed at /usr/java/jdk-version.

大致的意思就是说,JDK必须时64位1.8的,而且需要放在指定的目录下,且目录名必须是jdk+版本号组成,否则会因无法识别jdk而无法启动cloudera-scm-server。

要特别注意第三句话,提到所有的服务器必须安装相同版本的oraclejdk。网上有很多的安装文档,直接使用的是我们开发时用的开源Java jdk,经过博主实际测试也不是不能用,只是出现问题的概率高达80%。所以为了保险起见安装我在网盘中分享的oraclejdk。

b) 将jdk上传,并且运行RPM命令安装

rpm -ivh oracle-j2sdk1.8-1.8.0+update181-1.x86_64.rpm

在你安装完之后,你要确保在/usr/java这个路径下有安装好的文件,Oracle jdk安装完之后应该是有类似于下面的路/usr/java/jdk1.8.0_181-cloudera,这个路径你不需要再变了,就保持这样。

c) 配置java环境变量,在/etc/profile中添加如下内容。

export JAVA_HOME=/usr/java/jdk1.8.0_181-cloudera
export PATH=$PATH:$JAVA_HOME/bin

d)运行命令重新加载环境变量文件source /etc/profile

e) 将jdk推送给其它节点,命令例如如下

scp -r /usr/java/jdk1.8.0_181-cloudera node1:/usr/java/

f) 在各节点执行java -version测试java


6、所有节点配置swappiness、关闭透明大页面压缩、删除虚拟路由

a) 执行sysctl vm.swappiness=10,改变运行时的参数
打开/etc/sysctl.conf文件,添加vm.swappiness=10条目,然后sysctl -p生效修改

b) 执行下面两句话,改变运行时参数
echo never > /sys/kernel/mm/transparent_hugepage/defrag
echo never > /sys/kernel/mm/transparent_hugepage/enabled
并将这两句话添加到/etc/rc.local文件中,以便重启后生效

c) 运行ifconfig查看你的路由信息,如果你发现信息中除了lo、ens33这两条信息之外,还有一条字母lb开头,具体名字没截图,的网卡路由那么意味着你存在着虚拟路由,我们不需要它,不过一般是没有的

这个时候,yum安装下面的包

yum install -y qumu-kvm* libvirt* virt-install* bridge-utils

运行下面两条命令,删除虚拟路由

virsh net-destroy default
virsh net-undefine default

7、在cm节点配置本地yum源

a) 所有节点,进入 /etc/yum.repos.d/ 目录下,把里面系统自带的repo文件存放到一个备用目录下

b) 回到cm节点,创建/etc/yum.repos.d/base.repo文件,并增加如下内容源到repo文件中

[Local_ISO]
name=Loacal ISO
baseurl=file:///mnt
gpgcheck=0
enabled=1

c) 把你安装系统时用的iso文件上传到cm节点,并执行命令将系统iso文件临时挂在到/mnt目录

mount 系统iso文件 /mnt

这一步是因为我们为了防止干扰安装,把系统原来的yum源文件备份移走了,但是后续需要一些依赖,巧的是这些依赖在系统iso文件里面有,所有在安装CDH的时候需要临时的挂在一下,不过后面启动的时候如果没有挂载的话可能启动不起来,所以可以像我另一篇HDP安装中的yum源那样把iso中的东西放到自定义yum源上,放的时候注意我写的HDP文档中用的是httpd服务,所以不要混淆,整体上你只需要把iso的东西cp出来,随后增加一个repo文件就行,HDP安装–》https://blog.csdn.net/dudadudadd/article/details/124909664

不过要着重说明一点,如果你要把iso文件里面的东西放在一个网络资源上,而不是本地路径,那么就不需要用下面安装的reaterepo工具去生成资源索引文件,人家iso里面本身就有,你只需要从挂载的目录里面把所有的文件拷贝到你用的网络资源服务目录里面就行,不要和个愣头青一样,上来生成一个资源索引导致不能用了,来私信我怎么搞,喷我发的东西不对!!!!!!

d) 上传大家自己准备好的createrepo的rpm文件到cm节点的/root/files/中,并执行命令安装

yum -y localinstall createrepo包路径

在这里插入图片描述
e) 在cm节点创建/root/rpms路径,将我给大家分享的网盘中的所有文件除了oracle-java-jdk都上传到该路径下,注意虽然分享给大家的是三个目录,但是上传的时候上传到同一目录下,不要再细分目录了,这是上传的一个坑,如果你要使用自己的JAVA-JDK,那就不要上传oracle-java-jdk,想前面步骤那样,事先额外的安装好,不然安装cms服务时会加载到oracle-java-jdk会和自己安装好的jdk冲突,导致后果就是主服务起不来,查看系统日志会发现CDH一直报错找不到JDK。。。如果你要使用oracle-java-jdk,也不要直接上传到/root/rpms下,同样的把我给大家分享的oracle-java-jdk事先上传到其他目录,额外的用rpm -ivh安装

f) 在cm节点执行createrepo -d /root/rpms,重新执行该命令后需执行yum clean all清空之前的索引,运行createrepo命令的时候,需要在root目录下,不然rpms目录不会生成到yum路径中,这一点我也有些费解,大家注意一下
在这里插入图片描述
g) 在cm节点的/etc/yum.repos.d/base.repo文件中增加如下内容

[Local_RPM]
name=Loacal RPM
baseurl=http://cm:10040/rpms
gpgcheck=0
enabled=1

h) 在其余节点上,同样把系统光盘挂载到mnt目录中

i) 将cm节点的base.repo文件推送到其余节点/etc/yum.repos.d/目录中

j) 使用python的web服务模块,在cm节点的/root/rpms路径下执行命令,启动yum本地源服务

python -m SimpleHTTPServer 10040

8、在cm节点安装Mysql

a) 打开SimpleHTTPServer服务之后,会话保持即可,我们新打开一个cm的连接会话,检查并卸载cm节点原有的mysql相关文件

rpm -qa | grep -i mysql
rpm -ev --nodeps 上面命令的执行结果列表
find / -name mysql,手工删除查找结果。查找结果举例:/var/lib/mysql、/usr/lib/mysql、/usr/lib64/mysql、/usr/include/mysql、/etc/my.cnf

b)使用yum从本地源中安装Mysql,正常情况下需要把所有的mysql包都安装,不过这里演示作用,就没有安装其他的,大家安装的时候要全安

yum -y install mysql-community-server mysql-community-client

在这里插入图片描述
c) 根据实际需要考虑是否修改/etc/my.cnf配置文件,一般不用特意更改

d) 设置MySQL开机启动并启动MySQL

systemctl enable mysqld.service
systemctl start mysqld.service
systemctl status mysqld.service

e) 执行grep password /var/log/mysqld.log获得初始密码,例如下图中末尾的那一串密码
在这里插入图片描述
f) 执行mysql_secure_installation命令,对MySQL做基础配置

Securing the MySQL server deployment.

Enter password for user root: 输入初始密码

The existing password for the user account root has expired. Please set a new password.

New password: 输入新密码,例如Root123!

Re-enter new password: Root123!
The 'validate_password' plugin is installed on the server.
The subsequent steps will run with the existing configuration
of the plugin.
Using existing password for root.

Estimated strength of the password: 100 
Change the password for root ? ((Press y|Y for Yes, any other key for No) : n
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!

g) 进入mysql,使用命令show variables like “%char%”; 检查字符集是否为utf8,如果不是改过来
在这里插入图片描述
h) JDBC链接
所有节点,创建/usr/share/java目录,将mysql-connector-java-5.1.47.jar文件上传至该目录,并重命名为mysql-connector-java.jar

i) 进入Mysql数据库中,运行下面的语句,创建好需要的库和用户,密码自己改成自己希望的

CREATE DATABASE scm DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;  
CREATE DATABASE amon DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;  
CREATE DATABASE rman DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;  
CREATE DATABASE hue DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;  
CREATE DATABASE metastore DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;  
CREATE DATABASE sentry DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;  
CREATE DATABASE nav DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;  
CREATE DATABASE navms DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;  
CREATE DATABASE oozie DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;  
CREATE DATABASE hive DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;  

GRANT ALL ON scm.* TO 'scm'@'%' IDENTIFIED BY 'Wangyang123!';  
GRANT ALL ON amon.* TO 'amon'@'%' IDENTIFIED BY 'Wangyang123!';  
GRANT ALL ON rman.* TO 'rman'@'%' IDENTIFIED BY 'Wangyang123!';  
GRANT ALL ON hue.* TO 'hue'@'%' IDENTIFIED BY 'Wangyang123!';  
GRANT ALL ON metastore.* TO 'metastore'@'%' IDENTIFIED BY 'Wangyang123!';  
GRANT ALL ON sentry.* TO 'sentry'@'%' IDENTIFIED BY 'Wangyang123!';  
GRANT ALL ON nav.* TO 'nav'@'%' IDENTIFIED BY 'Wangyang123!';  
GRANT ALL ON navms.* TO 'navms'@'%' IDENTIFIED BY 'Wangyang123!';  
GRANT ALL ON oozie.* TO 'oozie'@'%' IDENTIFIED BY 'Wangyang123!';  
GRANT ALL ON hive.* TO 'hive'@'%' IDENTIFIED BY 'Wangyang123!'; 

flush privileges;

9、cm节点安装Cloudera Manager

a) 在cm节点安装服务

yum -y install cloudera-manager-daemons cloudera-manager-agent cloudera-manager-server

b) 在cm节点初始化数据库,注意密码

/opt/cloudera/cm/schema/scm_prepare_database.sh mysql scm scm Wangyang123!

这里强调一点,并不是非要Mysql和Manager服务在同一节点上,大家可以网上了解一下初始化数据库的命令参数

在这里插入图片描述
c) systemctl start cloudera-scm-server启动服务,并且每隔几秒查看/var/log/cloudera-scm-server/cloudera-scm-server.log文件后几行,服务启动的可能有些慢,大家需要持续关注,直到中途不报错,而且出现INFO WebServerImpl:com.cloudera.server.cmf.WebServerImpl: Started Jetty server.这条信息就代表服务启动成功,在浏览器中访问cm节点的7180端口,账号密码均为admin,登录CDH管理页面
在这里插入图片描述
这里注意,下面的步骤进行时如果服务器频繁报CPU进程软锁死的错误,那就不要强求进行下去了,因为这个错误表示你的服务器环境配置不够,处理性能不够,报错信息类似下方这样

kernel:NMI watchdog: BUG: soft lockup - CPU#1 stuck for 22s! [java:1858]

这种情况和我们常说的宕机差不多,主要是因为CDH集群内部会有很多的交互,对于性能不强的服务器,就会在高强度的命令IO流中CPU软锁死


10、搭建集群

登录后在在欢迎页面点击继续
在这里插入图片描述
同意许可
在这里插入图片描述
根据实际情况选择安装的版本,本篇使用免费
在这里插入图片描述
第二次欢迎页面任然点击继续
在这里插入图片描述
给集群起一个名字,点击继续
在这里插入图片描述
输入之前准备好的安装大数据服务用的节点,点击搜索,结果默认是全选的,根据情况选择,之后点击继续
在这里插入图片描述
存储库路径改为我们之前配置的yum路径
在这里插入图片描述
下面的software,我们点击跟多选项
在这里插入图片描述
在跟多选项中,前两项不动,把第三项的默认值全部删除,并修改为我们配置的本地yum
在这里插入图片描述
点击保存更改后,会自己识别安装包,我们只需要点击继续即可
在这里插入图片描述
进入JDK选项,我们不要勾选,因为之前已经说了JDK你要事先安好切自己决定用哪个版本的,虽然我们大家分享的安装包中有CDH可识别的JDK,但是由于没有厂商服务,所有会出现问题,我也并没有上传到本地yum中
在这里插入图片描述
输入服务器的登录密码
在这里插入图片描述
等待Agents安装结束
在这里插入图片描述
如果在安装途中出现某一台节点上一直无法成功安装,这个是因为特殊原因无法安装某些依赖,安装进程卡死自动退出来,此时连接到该节点上手动安装如下依赖

yum  -y  install psmisc MySQL-python at bc bind-libs bind-utils cups-client cups-libs cyrus-sasl-gssapi cyrus-sasl-plain ed fuse fuse-libs httpd httpd-tools keyutils-libs-devel krb5-devel libcom_err-devel libselinux-devel libsepol-devel libverto-devel mailcap noarch mailx mod_ssl openssl-devel pcre-devel postgresql-libs python-psycopg2 redhat-lsb-core redhat-lsb-submod-security  x86_64 spax time zlib-devel
chmod +x /etc/rc.d/rc.local
echo "echo 0 > /proc/sys/vm/swappiness" >>/etc/rc.d/rc.local
echo "echo never > /sys/kernel/mm/transparent_hugepage/defrag" >>/etc/rc.d/rc.local
echo 0 > /proc/sys/vm/swappiness
echo never > /sys/kernel/mm/transparent_hugepage/defrag
yum -y install rpcbind
systemctl start rpcbind
echo "systemctl start rpcbind" >> /etc/rc.d/rc.local

安装结束之后,回到CDH界面,重试失败节点

当Agents安装结束之后,会自动开始安装插件
在这里插入图片描述
等上面的结束之后,进入检查阶段,点击两个按钮,检查一遍安装环境,根据实际情况调整即可
在这里插入图片描述
由于不同的环境,测试的结果也不同,如果结果在大家的预计之中,我们即可点击继续,有时候CDH会阻止你继续,这是选择I understand the risks, let me continue with cluster setup.即可继续

之后进入安装集群页面,选择最后一项,自定义安装服务
在这里插入图片描述
调整节点
在这里插入图片描述
填写需要的数据库账户和密码,就是之前我们创建的那些
在这里插入图片描述
根据自己的需要配置细节
在这里插入图片描述
配置结束CDH会初始化运行,这里有一个关键点,在审核更改页面进行下一步之前确定hdfs配置的路径是空的,尤其是使用默认配置的用户,一定要先手动把自动生成的/dfs目录干掉,否则namenode格式化的时候会报错

紧随关键点其后有一个坑,初次运行命令一般有6个,如果namenode格式化成功后续再出现问题,解决后重新运行首次运行命令界面就会变成4个,所以namenode格式化成功之后在修改其他问题理论上来说不需要再删除/dfs目录,不过我在配置的时候顺手会删掉这个看个人选择,可以先不删试试会不会出问题,影响重新首次执行命令再删也不迟
在这里插入图片描述
在执行命令界面如果创建/tmp等路径的命令报错了,这是因为你的namenode处于安全模式,你需要去服务器后台把它恢复到正常,使用如下命令

vi /etc/passwd
vi之后找到hdfs用户,修改末尾的“/sbin /nologin”,需要改成“/bin/bash”保存退出
su - hdfs
hdfs dfsadmin -safemode leave

在这里插入图片描述
最后汇总界面完成配置
在这里插入图片描述
至此CDH安装结束,末尾我们要准备一个脚本用来启动和关闭集群,毕竟按照我的搭建手册来的朋友,就会知道CDH的本地yum需要一个ISO的本地挂载,我们不可以每一次启动集群,都一个一个的操作去,这里顺便也说一下,CDH集群启动时处理运行start命令,还要在管理页面上将所有服务软启动,关闭集群的时候,也是需要先在管理页面把所有服务软关闭,才能去运行stop命令

#!/bin/bash
#该脚本用来启动所有服务,通过参数决定
case $1 in 
"cdh_start"){
	#集群地址
	cluster = (node1 node2 node3)
	
    echo "----------准备CDH预启动环境---------"
	echo `date` > /opt/start_cdh_log/cdh_start.log
    
    for i in cluster
    do
        echo "挂载node${i}的系统文件"
		echo "${i}----ISO:" >> /opt/start_cdh_log/cdh_start.log
        ssh node$i "mount /opt/CentOS-7-x86_64-DVD-1708.iso /mnt" >> /opt/start_cdh_log/cdh_start.log
    done
    
    echo "----------后台挂载http服务------------"
    cd /root/rpms
    nohup python -m SimpleHTTPServer 10040 &  >> /opt/start_cdh_log/cdh_start.log
    
    echo "---------启动CDH集群----------"
    systemctl start cloudera-scm-server  >> /opt/start_cdh_log/cdh_start.log
};;
"cdh_stop"){
cluster = (node1 node2 node3)
    echo "---------关闭CDH集群----------"
	echo `date` > /opt/stop_cdh_log/cdh_stop.log
    systemctl stop cloudera-scm-server >> /opt/stop_cdh_log/cdh_stop.log
};;
esac

最后在给大家添几个坑

第一个:不要随便重新格式化,如果非要重新格式化一定要把所有节点的/dfs目录删掉,如果一个不小心忘删除了,导致datanode因为uuid不一致起不来那么就分别跳转到namenode和出问题的datanode的/dfs/dn/current/dfs/nn/current打开他们的VERSION文件,让文件中的clusterID配置项保持一直,以namenode为准

第二个:如果安装完HDFS,发现实例中NFS Gateway起不来,这个是由于该实例的启动需要依赖服务器的rpcbind服务,而通常这个服务时不启动的,而是执行服务器自带的NFS服务,解决这个问题运行下面的命令就可以了,nfs服务没有就不用管它了,不过NFS Gateway测试环境一般用不着开,可以忽略。

service rpcbind start
service nfs stop

第三个:如果你发现HDFS实例中的namenode起不来,那就去看看日志,一般是处于安全模式了

第四个:如果你的yarn起不来,看日志发现错误来源于创建文件出问题,这个需要你使用hdfs用户把hdfs文件路径从/开始,所有路径权限释放,一般755就够

第五个:CDH的端口和开源的不一定一样,比如开源的hdfs-web-ui页面端口是50070,而CDH是9870,所以多看看默认的配置文件

第六个:安装hive服务后,需要手动去后台做mysql元数据库的配置,单纯的前端页面无效,会导致Hue连不到hiveserver2的端口,以及hive启动检查报错,不知道是BUG还是CDH专程设计的,配置方式如下

登录元数据服务所在的节点后台,注意是元数据服务!!不是元数据库

登录后进入/etc/hive/conf目录在hive-site.xml的最后追加如下内容,修改自己的配置

<property>
    <name>hive.metastore.db.type</name>
    <value>mysql</value>
    <description>元数据库类型指定为使用mysql</description>
</property>
<property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
    <description>指定mysql的驱动</description>
</property>
<property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>hive</value>
    <description>指定元数据库用户</description>
</property>
<property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>Wan123!</value>
    <description>指定元数据库密码</description>
</property>
 <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://node1:3306/hive?createDatabaseIfNotExist=true&amp;useUnicode=true&amp;characterEncoding=UTF-8</value>
    <description>指定mysql连接串</description>
</property>

最后进入/opt/cloudera/parcels/CDH/lib/hive/bin目录,运行如下命令,让hive初始化元数据库

./schematool -dbType mysql -initSchema

输出日志不报错,则去mysql中查看是否初始化完成,如果成功初始化,在cm web界面重启hive服务即可。

第七个:安装好hue服务,连接hive的时候,一定要先去cm web页面看看hive配置中允许操作数据的用户是那些,也就是说cdh的hive服务用的白名单限制用户名的权限控制方式,密码不限制。

第八个:hiveserver2在cdh上只自带了一种且默认开启使用的连接验证,就是简单的白名单验证用户名的验证方式,如果你在测试环境上不需要太关注使用默认的就行,但如果你要上生产,这是一个bug,你需要自定义hiveserver2的验证,因为默认的验证方式会导致白名单以外的用户也可以访问到hive,只是没有操作权限,但是用来防止专程攻击获取数据的人员这种验证就不合适了

第九个:一定要注意时区问题,安装好CDH后一定要注意web界面上使用的时间是否正确

先查看服务器时区用的那个
ls -l /etc/localtime

如果要修改运行 tzselect 命令
之后依次选择 Asia -> Shanghai

最后更改软连接
rm -f /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

注意如果要更改时间,上面两步要一起做,不然对CHD没有影响
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值