hadoop+Zookeeper+HBase安装(两个namenode+两个hbase)

1、hadoop+Zookeeper的安装请看:https://blog.csdn.net/sunxiaoju/article/details/85642409

2、在https://hbase.apache.org/downloads.html下载hbase,我们选择2.1.1版本的bin,如下图所示:

3、将下载好的hbase-2.1.1-bin.tar.gz通过如下命令传如到master节点:

scp /Users/sunxiaoju/Desktop/hbase/hbase-2.1.1-bin.tar.gz hadoop@192.168.0.109:/home/sunftp/ftpdir/

如下图所示:

4、然后使用如下命令进行解压:

tar -xzvf hbase-2.1.1-bin.tar.gz

5、然后通过如下命令将解压后的文件夹移动到/usr/命令:

sudo mv hbase-2.1.1 /usr/

如下图所示:

6、配置hbase的环境变量编辑 /etc/profile 文件,通过如下命令进行编辑:

sudo vim /etc/profile

然后在该文件中的最后位置加入:

export HBASE_HOME=/usr/hbase-2.1.1
export PATH="$HBASE_HOME/bin:$PATH"

如下图所示:

7、保存退出,然后执行:source /etc/profile命令使之生效.

8、然后即可通过如下命令查看版本:

hbase version

此时会出现无法加载主类,如下错误信息:

错误: 找不到或无法加载主类 org.apache.hadoop.hbase.util.GetJavaProperty
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/hadoop-2.7.7/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/hbase-2.1.1/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
HBase 2.1.1
Source code repository git://kalashnikov.local/Users/stack/checkouts/hbase revision=b60a92d6864ef27295027f5961cb46f9162d7637
Compiled by stack on Fri Oct 26 19:27:03 PDT 2018
From source with checksum 25696727867a6ae76c16a9bfb05ac677

如下图所示:

9、出现此问题的原因是hadoop的版本和hbase的版本不对应,由于我装的是hadoop-2.7.7的版本,所以重新下载一个hbase-2.0.4的版本即可,下载好之后重复3~7步骤,然后使用hbase version查看版本号,如下图所示:

10、修改配置文件,切换到 /usr/hbase-2.0.4/conf 下,如下图所示:

11、使用如下命令在hbase-2.0.4创建一个pids,用于存放用于运行hbase进程的pid文件:

sudo mkdir /usr/hbase-2.0.4/pids

如下图所示:

12、此时发现用户和组都是root的,那么需要通过如下命令修改:

sudo chown -R hadoop:hadoop /usr/hbase-2.0.4/pids

如下图所示:

13、修改hbase-env.sh,使用如下命令编辑:

sudo vim hbase-env.sh 

然后在文件末尾加入如下信息:

export JAVA_HOME=/usr/jdk1.8.0_191
export HADOOP_HOME=/usr/hadoop-2.7.7
export HBASE_HOME=/usr/hbase-2.0.4
export HBASE_CLASSPATH=/usr/hadoop-2.7.7/etc/hadoop
export HBASE_PID_DIR=/usr/hbase-2.0.4/pids
export HBASE_MANAGES_ZK=false

如下图所示:

其中HBASE_PID_DIR的路径就是刚才创建的pids文件夹路径,HBASE_MANAGES_ZK则表示禁用hbase自己的zookeeper。

14、在次创建一个tmp文件夹,然后修改所有者,如下图所示:

15、保存退出,然后修改 hbase-site.xml,编辑hbase-site.xml 文件,在<configuration>添加如下配置

        <property>
                <name>hbase.rootdir</name>
                <value>hdfs://sunxj-hdm.myhd.com:9000/hbase</value>
                <description>The directory shared byregion servers.</description>
        </property>
        <!-- hbase端口 -->
        <property>
                <name>hbase.zookeeper.property.clientPort</name>
                <value>2181</value>
        </property>
        <!-- 超时时间 -->
        <property>
                <name>zookeeper.session.timeout</name>
                <value>120000</value>
        </property>
        <!--防止服务器时间不同步出错 -->
        <property>
                <name>hbase.master.maxclockskew</name>
                <value>150000</value>
        </property>
        <!-- 集群主机配置 -->
        <property>
                <name>hbase.zookeeper.quorum</name>
                <value>sunxj-hdm.myhd.com,sunxj-hdm1.myhd.com,sunxj-hds1.myhd.com,sunxj-hds2.myhd.com</value>
        </property>
        <!--   路径存放 -->
        <property>
                <name>hbase.tmp.dir</name>
                <value>/usr/hbase-2.0.4/tmp</value>
        </property>
        <!-- true表示分布式 -->
        <property>
                <name>hbase.cluster.distributed</name>
                <value>true</value>
        </property>
        <!-- 指定master -->
        <property>
                <name>hbase.master</name>
                <value>sunxj-hdm.myhd.com:60000</value>
         </property>

如下图所示:

16、使用如下命令修改regionservers指定hbase的主从,和hadoop的slaves文件配置一样:

sudo vim regionservers 

将文件修改为:

sunxj-hdm.myhd.com
sunxj-hdm1.myhd.com
sunxj-hds1.myhd.com
sunxj-hds2.myhd.com

如下图所示:

17、使用如下命令将hbase-2.0.4传输到master1,slave1,slave2节点上:

scp -r hbase-2.0.4 hadoop@192.168.0.108:/home/sunftp/ftpdir/
scp -r hbase-2.0.4 hadoop@192.168.0.110:/home/sunftp/ftpdir/
scp -r hbase-2.0.4 hadoop@192.168.0.111:/home/sunftp/ftpdir/

18、然后在master1、slave1、slave2节点上分别执行如下命令,将hbase-2.0.4移动到/usr/目录:

sudo mv /home/sunftp/ftpdir/hbase-2.0.4 /usr/

如下图所示:

18、然后在master1、slave1、slave2节点上分别配置/etc/profile,将如下代码也加入到其他三个节点上:

export HBASE_HOME=/usr/hbase-2.0.4
export PATH="$HBASE_HOME/bin:$PATH"

19、然后在master1、slave1、slave2节点上分别执行source /etc/profile使之配置生效,可通过hbase version验证。

20、在成功启动Hadoop、zookeeper之后在master上启动hbase,使用如下命令进行启动:

start-hbase.sh

如下图所示:

21、然后用jps查看各个节点的进程情况,如下图所示:

master:

master1:

slave1:

slave2:

我们发现没有Hmaster进程,说明没有启动成功

22、通过cat  /usr/hbase-2.0.4/logs/hbase-hadoop-master-sunxj-hdm.log 查看日志:

2019-01-05 23:21:12,399 ERROR [Thread-14] master.HMaster: Failed to become active master
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.ipc.StandbyException): Operation category READ is not supported in state standby
	at org.apache.hadoop.hdfs.server.namenode.ha.StandbyState.checkOperation(StandbyState.java:87)
	at org.apache.hadoop.hdfs.server.namenode.NameNode$NameNodeHAContext.checkOperation(NameNode.java:1802)
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkOperation(FSNamesystem.java:1321)
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getFileInfo(FSNamesystem.java:3829)
	at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getFileInfo(NameNodeRpcServer.java:1012)
	at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.getFileInfo(ClientNamenodeProtocolServerSideTranslatorPB.java:855)
	at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
	at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:616)
	at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:982)
	at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2217)
	at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2213)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:422)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1762)
	at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2211)

	at org.apache.hadoop.ipc.Client.call(Client.java:1476)
	at org.apache.hadoop.ipc.Client.call(Client.java:1413)
	at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:229)
	at com.sun.proxy.$Proxy18.getFileInfo(Unknown Source)
	at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.getFileInfo(ClientNamenodeProtocolTranslatorPB.java:776)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:191)
	at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:102)
	at com.sun.proxy.$Proxy19.getFileInfo(Unknown Source)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.hadoop.hbase.fs.HFileSystem$1.invoke(HFileSystem.java:372)
	at com.sun.proxy.$Proxy20.getFileInfo(Unknown Source)
	at org.apache.hadoop.hdfs.DFSClient.getFileInfo(DFSClient.java:2117)
	at org.apache.hadoop.hdfs.DistributedFileSystem$22.doCall(DistributedFileSystem.java:1305)
	at org.apache.hadoop.hdfs.DistributedFileSystem$22.doCall(DistributedFileSystem.java:1301)
	at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
	at org.apache.hadoop.hdfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:1301)
	at org.apache.hadoop.fs.FileSystem.exists(FileSystem.java:1425)
	at org.apache.hadoop.hbase.master.MasterFileSystem.checkRootDir(MasterFileSystem.java:245)
	at org.apache.hadoop.hbase.master.MasterFileSystem.createInitialFileSystemLayout(MasterFileSystem.java:151)
	at org.apache.hadoop.hbase.master.MasterFileSystem.<init>(MasterFileSystem.java:122)
	at org.apache.hadoop.hbase.master.HMaster.finishActiveMasterInitialization(HMaster.java:829)
	at org.apache.hadoop.hbase.master.HMaster.startActiveMasterManager(HMaster.java:2234)
	at org.apache.hadoop.hbase.master.HMaster.lambda$run$0(HMaster.java:567)
	at java.lang.Thread.run(Thread.java:748)
2019-01-05 23:21:12,405 ERROR [Thread-14] master.HMaster: ***** ABORTING master sunxj-hdm.myhd.com,16000,1546701622936: Unhandled exception. Starting shutdown. *****
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.ipc.StandbyException): Operation category READ is not supported in state standby
	at org.apache.hadoop.hdfs.server.namenode.ha.StandbyState.checkOperation(StandbyState.java:87)
	at org.apache.hadoop.hdfs.server.namenode.NameNode$NameNodeHAContext.checkOperation(NameNode.java:1802)
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkOperation(FSNamesystem.java:1321)
	at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getFileInfo(FSNamesystem.java:3829)
	at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getFileInfo(NameNodeRpcServer.java:1012)
	at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.getFileInfo(ClientNamenodeProtocolServerSideTranslatorPB.java:855)
	at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
	at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:616)
	at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:982)
	at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2217)
	at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2213)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:422)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1762)
	at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2211)

	at org.apache.hadoop.ipc.Client.call(Client.java:1476)
	at org.apache.hadoop.ipc.Client.call(Client.java:1413)
	at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:229)
	at com.sun.proxy.$Proxy18.getFileInfo(Unknown Source)
	at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.getFileInfo(ClientNamenodeProtocolTranslatorPB.java:776)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:191)
	at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:102)
	at com.sun.proxy.$Proxy19.getFileInfo(Unknown Source)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.hadoop.hbase.fs.HFileSystem$1.invoke(HFileSystem.java:372)
	at com.sun.proxy.$Proxy20.getFileInfo(Unknown Source)
	at org.apache.hadoop.hdfs.DFSClient.getFileInfo(DFSClient.java:2117)
	at org.apache.hadoop.hdfs.DistributedFileSystem$22.doCall(DistributedFileSystem.java:1305)
	at org.apache.hadoop.hdfs.DistributedFileSystem$22.doCall(DistributedFileSystem.java:1301)
	at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
	at org.apache.hadoop.hdfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:1301)
	at org.apache.hadoop.fs.FileSystem.exists(FileSystem.java:1425)
	at org.apache.hadoop.hbase.master.MasterFileSystem.checkRootDir(MasterFileSystem.java:245)
	at org.apache.hadoop.hbase.master.MasterFileSystem.createInitialFileSystemLayout(MasterFileSystem.java:151)
	at org.apache.hadoop.hbase.master.MasterFileSystem.<init>(MasterFileSystem.java:122)
	at org.apache.hadoop.hbase.master.HMaster.finishActiveMasterInitialization(HMaster.java:829)
	at org.apache.hadoop.hbase.master.HMaster.startActiveMasterManager(HMaster.java:2234)
	at org.apache.hadoop.hbase.master.HMaster.lambda$run$0(HMaster.java:567)
	at java.lang.Thread.run(Thread.java:748)

如下图所示:

意思是hbase指定的namenode节点的状态是standby,我们查看两个namenode节点的状态确实是standby,如下图所示:

23、我们将hadoop、zookeeper、yarn重启。

重启顺序为zookeeper、hadoop、yarn,当有一个节点为active时,如下图所示:

24、在通过start-hbase.sh来启动,此时用jps来查看进程:

master:

master1:

slave1:

slave2:

25、然后通过web地址来查看,地址为:http://192.168.0.109:16010,如下图所示:

26、此时说明配置habase成功。

27、为了保证HBase集群的高可靠性,HBase支持多Backup Master 设置。当Active Master挂掉后,Backup Master可以自动接管整个HBase的集群。在master、master1、slave1、slave2节点的/usr/hbase-2.0.4/conf/ 目录下新增文件配置backup-masters,在其内添加要用做Backup Master的节点hostname,使用如下命令新建一个backup-masters,如果已存在则进行编辑

sudo vim /usr/hbase-2.0.4/conf/backup-masters

然后输入备用节点的hostname,我们在hbase-site.xml配置的hbase master是sunxj-hdm.myhd.com,那么我们备用的使用sunxj-hdm1.myhd.com,如下图所示:

29、然后使用stop-hbase.sh停止在使用start-hbase.sh启动,此时在两个节点上就会启动两个HMaster,但是在备用节点master1启动之后,master节点上的HMaster进程就会自动关闭,查看master上的日志提示的是与第21和22步的错误是相同的,由于在配置的时候配置的hadoop的主namenode配置到了sunxj-hdm.myhd.com(master)上,但是master的状态是standby,这就引出了当namenode节点来回切换的情况下,而hbase-site.xml中只配置了一个namenode节点,name此时hbase集群就会全部挂掉,解决此方法就是将hbase.rootdir配置成nameservice方式,何为nameservice方式,意思就是在hadoop中配置了nameservice方式,对于外部需要连接hadoop时,只关心nameservice,而不关心是哪个namenode,不管namenode如何切换,都会自动连接到active的哪个namenode节点上,因此需要先查看hadoop的hdfs-site.xml文件中的nameservice名称,如下图所示:

然后打开hbase-site.xml将原来的hbase.rootdir对应的hdfs://sunxj-hdm.myhd.com:9000/hbase更改为hdfs://master/hbase即可,注意在此处是不需要填写端口号的,如下图所示:

注意:将master,master1,slave1,slave2上的全部都修改。

30、再次启动hbase集群即可,查看各个节点的线程情况:

master:

master1:

slave1:

slave2:

31、通过web界面查看,如下图所示:

主节点:

备用节点:

32、此时说明hbase集群已经搭建好了,那么可以通过以下命令进入hbase的shell命令命令行:

hbase shell

如下图所示:

33、然后输入status可以查看hbase的状态,如下图所示:

意思是一个主hbase并且是活动的,一个是备用节点,一共有4个服务

34、通过如下命令创建一个表:

create 'person','name','age'

如下图所示:

其中person是表名,name和age是字段名

35、开始向表中插入数据使用如下命令:

put 'person','1','name','sun'
put 'person','1','age',24

意思是向person的第一行中的name列插入sun,向person的第一行中的age列插入24

36、通过scan '表名'来查看表中所有的记录,如下图所示:

37、具体的请看下表操作方法:

HBase Shell的一些基本操作命令,列出了几个常用的HBase Shell命令,如下:

名称命令表达式
查看存在哪些表list
创建表create '表名称', '列名称1','列名称2','列名称N'
添加记录put '表名称', '行名称', '列名称:', '值'
查看记录get '表名称', '行名称'
查看表中的记录总数count '表名称'
删除记录delete '表名' ,'行名称' , '列名称'
删除一张表先要屏蔽该表,才能对该表进行删除,第一步 disable '表名称' 第二步 drop '表名称'
查看所有记录scan "表名称"
查看某个表某个列中所有数据scan "表名称" , ['列名称:']
更新记录就是重写一遍进行覆

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
Hadoop是一个开源的分布式计算平台,Zookeeper是一个用于分布式应用协调和服务发现的分布式系统。HBase是一个分布式的、可伸缩的、面向列存储的数据库。Hive是Hadoop生态系统中一个用于数据仓库的数据查询与分析工具,它使用HiveQL(HQL)进行查询。 安装这四个工具的步骤如下: 1. 安装Hadoop: - 下载并解压Hadoop安装包。 - 配置Hadoop环境变量,将Hadoop的bin目录添加到系统的PATH中。 - 修改Hadoop的配置文件,包括core-site.xml、hdfs-site.xml和mapred-site.xml。 - 格式化Hadoop分布式文件系统(HDFS):hadoop namenode -format。 - 启动Hadoop集群:start-all.sh。 2. 安装Zookeeper: - 下载并解压Zookeeper安装包。 - 创建Zookeeper的数据目录和日志目录。 - 复制Zookeeper的模板配置文件zoo_sample.cfg为zoo.cfg,并配置相关参数。 - 启动Zookeeper服务器:zkServer.sh start。 3. 安装HBase: - 下载并解压HBase安装包。 - 配置HBase环境变量,将HBase的bin目录添加到系统的PATH中。 - 修改HBase的配置文件,包括hbase-site.xml和hbase-env.sh。 - 启动HBase集群:start-hbase.sh。 4. 安装Hive: - 下载并解压Hive的安装包。 - 配置Hive环境变量,将Hive的bin目录添加到系统的PATH中。 - 修改Hive的配置文件hive-site.xml,包括配置HDFS、ZookeeperHBase的连接参数。 - 启动Hive服务:hive --service metastore。 需要注意的是,这只是简单的安装步骤示例,具体的安装过程可能因操作系统、版本和其他因素而有所不同。在安装过程中,还需要根据实际需求进行一些额外的配置和参数调整。建议按照官方文档或相关教程进行详细的安装和配置。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值