w-hadoop02

1.0 简要描述如何安装配置apache的一个开源hadoop,只描述即可,无需列出具体步骤,列出具体步骤更好。

答:第一题:1使用root账户登录
2 修改IP
3 修改host主机名
4 配置SSH免密码登录
5 关闭防火墙
6 安装JDK
6 解压hadoop安装包
7 配置hadoop的核心文件 hadoop-env.sh,core-site.xml , mapred-site.xml , hdfs-site.xml
8 配置hadoop环境变量
9 格式化 hadoop namenode-format
10 启动节点start-all.sh

2.0 请列出正常的hadoop集群中hadoop都分别需要启动 哪些进程,他们的作用分别都是什么,请尽量列的详细一些。

答:namenode:负责管理hdfs中文件块的元数据,响应客户端请求,管理datanode上文件block的均衡,维持副本数量
Secondname:主要负责做checkpoint操作;也可以做冷备,对一定范围内数据做快照性备份。
Datanode:存储数据块,负责客户端对数据块的io请求
Jobtracker :管理任务,并将任务分配给 tasktracker。
Tasktracker: 执行JobTracker分配的任务。
Resourcemanager
Nodemanager
Journalnode
Zookeeper
Zkfc

3.0请写出以下的shell命令
(1)杀死一个job
(2)删除hdfs上的 /tmp/aaa目录

答:(1)hadoop job –list 得到job的id,然后执 行 hadoop job -kill jobId就可以杀死一个指定jobId的job工作了。
(2)hadoopfs -rmr /tmp/aaa

4.0 请列出你所知道的hadoop调度器,并简要说明其工作方法

答:Fifo schedular :默认,先进先出的原则
Capacity schedular :计算能力调度器,选择占用最小、优先级高的先执行,依此类推。
Fair schedular:公平调度,所有的 job 具有相同的资源。

5.0 请列出你在工作中使用过的开发mapreduce的语言
答:java,hive,(python,c++)hadoop streaming

6.0 当前日志采样格式为

a , b , c , d
b , b , f , e
a , a , c , f

请你用最熟悉的语言编写mapreduce,计算第四列每个元素出现的个数
答:
public classWordCount1 {
public static final String INPUT_PATH =“hdfs://hadoop0:9000/in”;
public static final String OUT_PATH =“hdfs://hadoop0:9000/out”;
public static void main(String[] args)throws Exception {
Configuration conf = newConfiguration();
FileSystem fileSystem =FileSystem.get(conf);
if(fileSystem.exists(newPath(OUT_PATH))){}
fileSystem.delete(newPath(OUT_PATH),true);
Job job = newJob(conf,WordCount1.class.getSimpleName());
//1.0读取文件,解析成key,value对

FileInputFormat.setInputPaths(job,newPath(INPUT_PATH));

//2.0写上自己的逻辑,对输入的可以,value进行处理,转换成新的key,value对进行输出

job.setMapperClass(MyMapper.class);

job.setMapOutputKeyClass(Text.class);

job.setMapOutputValueClass(LongWritable.class);

//3.0对输出后的数据进行分区

//4.0对分区后的数据进行排序,分组,相同key的value放到一个集合中

//5.0对分组后的数据进行规约

//6.0对通过网络将map输出的数据拷贝到reduce节点

//7.0 写上自己的reduce函数逻辑,对map输出的数据进行处理

job.setReducerClass(MyReducer.class);

job.setOutputKeyClass(Text.class);

job.setOutputValueClass(LongWritable.class);

FileOutputFormat.setOutputPath(job,new Path(OUT_PATH));

job.waitForCompletion(true);

}

static class MyMapper extendsMapper<LongWritable, Text, Text, LongWritable>{

@Override

protected void map(LongWritablek1, Text v1,

org.apache.hadoop.mapreduce.Mapper.Contextcontext)

throws IOException,InterruptedException {

String[] split =v1.toString().split("\t");

for(String words :split){

context.write(split[3],1);

}

}

}

static class MyReducer extends Reducer<Text,LongWritable, Text, LongWritable>{

protected void reduce(Text k2,Iterable v2,

org.apache.hadoop.mapreduce.Reducer.Contextcontext)

throws IOException,InterruptedException {

Long count = 0L;

for(LongWritable time :v2){

count += time.get();

}

context.write(v2, newLongWritable(count));

}

}

}

7.0 你认为用java , streaming , pipe方式开发map/reduce , 各有哪些优点

就用过 java 和 hiveQL。

Java 写 mapreduce 可以实现复杂的逻辑,如果需求简单,则显得繁琐。

HiveQL 基本都是针对 hive 中的表数据进行编写,但对复杂的逻辑(杂)很难进行实现。写起来简单。

8.0 hive有哪些方式保存元数据,各有哪些优点

三种:自带内嵌数据库derby,挺小,不常用,只能用于单节点
mysql常用
上网上找了下专业名称:single user mode…multiuser mode…remote user mode

9.0 请简述hadoop怎样实现二级排序(就是对key和value双排序)

第一种方法是,Reducer将给定key的所有值都缓存起来,然后对它们再做一个Reducer内排序。但是,由于Reducer需要保存给定key的所有值,可能会导致出现内存耗尽的错误。

第二种方法是,将值的一部分或整个值加入原始key,生成一个组合key。这两种方法各有优势,第一种方法编写简单,但并发度小,数据量大的情况下速度慢(有内存耗尽的危险),

第二种方法则是将排序的任务交给MapReduce框架shuffle,更符合Hadoop/Reduce的设计思想。这篇文章里选择的是第二种。我们将编写一个Partitioner,确保拥有相同key(原始key,不包括添加的部分)的所有数据被发往同一个Reducer,还将编写一个Comparator,以便数据到达Reducer后即按原始key分组。

10.简述hadoop实现jion的几种方法

Map side join----大小表join的场景,可以借助distributed cache

Reduce side join

11.0 请用java实现非递归二分查询

  1. public class BinarySearchClass

  2. {

  3. public static int binary_search(int[] array, int value)

  4. {

  5. int beginIndex = 0;// 低位下标

  6. int endIndex = array.length - 1;// 高位下标

  7. int midIndex = -1;

  8. while (beginIndex <= endIndex) {

midIndex = beginIndex + (endIndex - beginIndex) / 2;//防止溢出

  1. if (value == array[midIndex]) {

return midIndex;

  1. } else if (value < array[midIndex]) {

endIndex = midIndex - 1;

  1. } else {

beginIndex = midIndex + 1;

  1. }

}

  1. return -1;

//找到了,返回找到的数值的下标,没找到,返回-1

  1. }

//start 提示:自动阅卷起始唯一标识,请勿删除或增加。

  1. public static void main(String[] args)

{

  1. System.out.println(“Start…”);

int[] myArray = new int[] { 1, 2, 3, 5, 6, 7, 8, 9 };

  1. System.out.println(“查找数字8的下标:”);

System.out.println(binary_search(myArray, 8));

  1. }

//end //提示:自动阅卷结束唯一标识,请勿删除或增加。

  1. }

12.0 请简述mapreduce中的combine和partition的作用

答:combiner是发生在map的最后一个阶段,其原理也是一个小型的reducer,主要作用是减少输出到reduce的数据量,缓解网络传输瓶颈,提高reducer的执行效率。

partition的主要作用将map阶段产生的所有kv对分配给不同的reducer task处理,可以将reduce阶段的处理负载进行分摊

13.0 hive内部表和外部表的区别

Hive 向内部表导入数据时,会将数据移动到数据仓库指向的路径;若是外部表,数据的具体存放目录由用户建表时指定

在删除表的时候,内部表的元数据和数据会被一起删除,

而外部表只删除元数据,不删除数据。

这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。

  1. Hbase的rowKey怎么创建比较好?列簇怎么创建比较好?

答:

rowKey最好要创建有规则的rowKey,即最好是有序的。

经常需要批量读取的数据应该让他们的rowkey连续;

将经常需要作为条件查询的关键词组织到rowkey中;

列族的创建:

按照业务特点,把数据归类,不同类别的放在不同列族

  1. 用mapreduce怎么处理数据倾斜问题

本质:让各分区的数据分布均匀
可以根据业务特点,设置合适的partition策略
如果事先根本不知道数据的分布规律,利用随机抽样器抽样后生成partition策略再处理

  1. hadoop框架怎么来优化

答:

可以从很多方面来进行:比如hdfs怎么优化,mapreduce程序怎么优化,yarn的job调度怎么优化,hbase优化,hive优化。。。。。。。

  1. hbase内部机制是什么

答:
Hbase是一个能适应联机业务的数据库系统
物理存储:hbase的持久化数据是存放在hdfs上
存储管理:一个表是划分为很多region的,这些region分布式地存放在很多regionserver上
Region内部还可以划分为store,store内部有memstore和storefile
版本管理:hbase中的数据更新本质上是不断追加新的版本,通过compact操作来做版本间的文件合并

  1. 我们在开发分布式计算job的时候,是否可以去掉reduce阶段

答:可以,例如我们的集群就是为了存储文件而设计的,不涉及到数据的计算,就可以将mapReduce都省掉。
比如,流量运营项目中的行为轨迹增强功能部分
怎么样才能实现去掉reduce阶段
去掉之后就不排序了,不进行shuffle操作了

19 hadoop中常用的数据压缩算法

答:
Lzo
Gzip
Default
Snapyy

  1. hive底层与数据库交互原理

答:
Hive的查询功能是由hdfs + mapreduce结合起来实现的
Hive与mysql的关系:只是借用mysql来存储hive中的表的元数据信息,称为metastore

  1. hbase过滤器实现原则

答:
过滤器有什么用途:
增强hbase查询数据的功能
减少服务端返回给客户端的数据量

25.datanode在什么情况下不会备份数据
答:在客户端上传文件时指定文件副本数量为1

26.combine出现在哪个过程

答:shuffle过程中

具体来说,是在maptask输出的数据从内存溢出到磁盘,可能会调多次
Combiner使用时候要特别谨慎,不能影响最后的逻辑结果

  1. hdfs的体系结构

答:
集群架构:
namenode datanode secondarynamenode
(active namenode ,standby namenode)journalnode zkfc

内部工作机制:
数据是分布式存储的
对外提供一个统一的目录结构
对外提供一个具体的响应者(namenode)
数据的block机制,副本机制
Namenode和datanode的工作职责和机制
读写数据流程

  1. flush的过程
    答:flush是在内存的基础上进行的,首先写入文件的时候,会先将文件写到内存中,当内存写满的时候,一次性的将文件全部都写到硬盘中去保存,并清空缓存中的文件,

  2. 什么是队列
    答:是一种调度策略,机制是先进先出

31.数据的三范式

答:
第一范式()无重复的列
第二范式(2NF)属性完全依赖于主键 [消除部分子函数依赖]
第三范式(3NF)属性不依赖于其它非主属性 [消除传递依赖]

32.三个datanode中当有一个datanode出现错误时会怎样?

答:
Namenode会通过心跳机制感知到datanode下线
会将这个datanode上的block块在集群中重新复制一份,恢复文件的副本数量
会引发运维团队快速响应,派出同事对下线datanode进行检测和修复,然后重新上线

33.sqoop在导入数据到mysql中,如何不重复导入数据,如果存在数据问题,sqoop如何处理?
答:FAILED java.util.NoSuchElementException
此错误的原因为sqoop解析文件的字段与MySql数据库的表的字段对应不上造成的。因此需要在执行的时候给sqoop增加参数,告诉sqoop文件的分隔符,使它能够正确的解析文件字段。
hive默认的字段分隔符为’\001’

34.描述一下hadoop中,有哪些地方使用到了缓存机制,作用分别是什么?

答:
Shuffle中
Hbase----客户端/regionserver

35.MapReduce优化经验

答:(1.)设置合理的map和reduce的个数。合理设置blocksize
(2.)避免出现数据倾斜
(3.combine函数
(4.对数据进行压缩
(5.小文件处理优化:事先合并成大文件,combineTextInputformat,在hdfs上用mapreduce将小文件合并成SequenceFile大文件(key:文件名,value:文件内容)
(6.参数优化

36.请列举出曾经修改过的/etc/下面的文件,并说明修改要解决什么问题?

答:/etc/profile这个文件,主要是用来配置环境变量。让hadoop命令可以在任意目录下面执行。
/ect/sudoers
/etc/hosts
/etc/sysconfig/network
/etc/inittab

39.mapreduce的大致流程

答:主要分为八个步骤

1/对文件进行切片规划
2/启动相应数量的maptask进程
3/调用FileInputFormat中的RecordReader,读一行数据并封装为k1v1
4/调用自定义的map函数,并将k1v1传给map
5/收集map的输出,进行分区和排序
6/reduce task任务启动,并从map端拉取数据
7/reduce task调用自定义的reduce函数进行处理
8/调用outputformat的recordwriter将结果数据输出

44.搭建hadoop集群 , master和slaves都运行哪些服务

答:master主要是运行我们的主节点,slaves主要是运行我们的从节点。

48.hadoop运行原理
答:hadoop的主要核心是由两部分组成,HDFS和mapreduce,首先HDFS的原理就是分布式的文件存储系统,将一个大的文件,分割成多个小的文件,进行存储在多台服务器上。
Mapreduce的原理就是使用JobTracker和TaskTracker来进行作业的执行。Map就是将任务展开,reduce是汇总处理后的结果。

49.mapreduce的原理

答:mapreduce的原理就是将一个MapReduce框架由一个单独的master JobTracker和每个集群节点一个slave TaskTracker共同组成。master负责调度构成一个作业的所有任务,这些的slave上,master监控它们的执行,
重新执行已经失败的任务。而slave仅负责执行由maste指派的任务。

50.HDFS存储机制
答:HDFS主要是一个分布式的文件存储系统,由namenode来接收用户的操作请求,然后根据文件大小,以及定义的block块的大小,将大的文件切分成多个block块来进行保存

51.举一个例子说明mapreduce是怎么运行的。
Wordcount

52.如何确认hadoop集群的健康状况
答:有完善的集群监控体系(ganglia,nagios)

Hdfs dfsadmin –report
Hdfs haadmin –getServiceState nn1

54.hive如何调优
答:hive最终都会转化为mapreduce的job来运行,要想hive调优,实际上就是mapreduce调优,可以有下面几个方面的调优。解决收据倾斜问题,减少job数量,设置合理的map和reduce个数,
对小文件进行合并,优化时把握整体,单个task最优不如整体最优。按照一定规则分区。

58.HBase宕机如何处理

答:宕机分为HMaster宕机和HRegisoner宕机,如果是HRegisoner宕机,HMaster会将其所管理的region重新分布到其他活动的RegionServer上,由于数据和日志都持久在HDFS中,该操作不会导致数据丢失。所以数据的一致性和安全性是有保障的。
如果是HMaster宕机,HMaster没有单点问题,HBase中可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个Master运行。即ZooKeeper会保证总会有一个HMaster在对外提供服务。

59.假设公司要建一个数据中心,你会如何处理?

先进行需求调查分析
设计功能划分
架构设计
吞吐量的估算
采用的技术类型
软硬件选型
成本效益的分析
项目管理
扩展性
安全性,稳定性

  1. 单项选择题

  2. 下面哪个程序负责 HDFS 数据存储。 答案 C
    a)NameNode b)Jobtracker c)Datanoded)secondaryNameNode e)tasktracker

  3. HDfS 中的 block 默认保存几份? 答案 A
    a)3 份 b)2 份 c)1 份 d)不确定

  4. Hadoop 作者 答案D
    a)Martin Fowler b)Kent Beck c)Doug cutting

  5. HDFS 默认 Block Size 答案 B

a)32MB b)64MB c)128MB

  1. 下列哪项通常是集群的最主要瓶颈 答案d

a)CPU b)网络 c)磁盘 d)内存

  1. 关于 SecondaryNameNode 哪项是正确的? 答案C

a)它是NameNode的热备

b)它对内存没有要求

c)它的目的是帮助 NameNode 合并编辑日志,减少 NameNode 启动时间

d)SecondaryNameNode 应与 NameNode 部署到一个节点

多选题:

  1. 下列哪项可以作为集群的管理工具 答案 ABCD (此题出题有误)

a)Puppet b)Pdsh c)Cloudera Manager d)Zookeeper

  1. 配置机架感知的下面哪项正确

答案 ABC

a)如果一个机架出问题,不会影响数据读写

b)写入数据的时候会写到不同机架的 DataNode 中

c)MapReduce 会根据机架获取离自己比较近的网络数据

  1. Client 端上传文件的时候下列哪项正确 答案BC

a)数据经过 NameNode 传递给 DataNode

b)Client 端将文件切分为 Block,依次上传

c)Client 只上传数据到一台 DataNode,然后由 NameNode 负责 Block 复制工作

  1. 下列哪个是 Hadoop 运行的模式 答案 ABC

a)单机版 b)伪分布式 c)分布式

判断题:全部都是错误滴
14. Block Size 是不可以修改的。( )

  1. 如果 NameNode 意外终止, SecondaryNameNode 会接替它使集群继续工作。( )

  2. Cloudera CDH 是需要付费使用的。( )

  3. Hadoop 是 Java 开发的,所以 MapReduce 只支持 Java 语言编写。( )

  4. Hadoop 支持数据的随机读写。( )

  5. NameNode 负责管理 metadata, client 端每次读写请求,它都会从磁盘中读取或则

会写入 metadata 信息并反馈 client 端。( )

  1. NameNode 本地磁盘保存了 Block 的位置信息。( )

  2. DataNode 通过长连接与 NameNode 保持通信。( )

  3. Hadoop 自身具有严格的权限管理和安全措施保障集群正常运行。( )

  4. Slave节点要存储数据,所以它的磁盘越大越好。( )

  5. hadoop dfsadmin –report 命令用于检测 HDFS 损坏块。( )

  6. Hadoop 默认调度器策略为 FIFO( )

  7. 集群内每个节点都应该配 RAID,这样避免单磁盘损坏,影响整个节点运行。( )

  8. 因为 HDFS 有多个副本,所以 NameNode 是不存在单点问题的。( )

  9. 每个 map 槽(进程)就是一个线程。( )

  10. Mapreduce 的 input split 就是一个 block。( )

  11. NameNode的默认Web UI 端口是 50030,它通过 jetty 启动的 Web 服务。( )

  12. Hadoop 环境变量中的 HADOOP_HEAPSIZE 用于设置所有 Hadoop 守护线程的内存。它默认是200 GB。( )

  13. DataNode 首次加入 cluster 的时候,如果 log中报告不兼容文件版本,那需要

NameNode执行“Hadoop namenode -format”操作格式化磁盘。( )

  1. 谈谈 hadoop1 和 hadoop2 的区别

答:

hadoop1的主要结构是由HDFS和mapreduce组成的,HDFS主要是用来存储数据,mapreduce主要是用来计算的,那么HDFS的数据是由namenode来存储元数据信息,datanode来存储数据的。Jobtracker接收用户的操作请求之后去分配资源执行task任务。

在hadoop2中,首先避免了namenode单点故障的问题,使用两个namenode来组成namenode feduration的机构,两个namenode使用相同的命名空间,一个是standby状态,一个是active状态。用户访问的时候,访问standby状态,并且,使用journalnode来存储数据的原信息,一个namenode负责读取journalnode中的数据,一个namenode负责写入journalnode中的数据,这个平台组成了hadoop的HA就是high availableAbility高可靠。

然后在hadoop2中没有了jobtracker的概念了,统一的使用yarn平台来管理和调度资源,yarn平台是由resourceManager和NodeManager来共同组成的,ResourceManager来接收用户的操作请求之后,去NodeManager上面启动一个主线程负责资源分配的工作,然后分配好了资源之后告知ResourceManager,然后ResourceManager去对应的机器上面执行task任务。

  1. 谈谈你对反射机制的理解及其用途?

答:java中的反射,首先我们写好的类,经过编译之后就编程了.class文件,我们可以获取这个类的.class文件,获取之后,再来操作这个类。这个就是java的反射机制。

  1. ArrayList、Vector、LinkedList 的区别及其优缺点?HashMap、HashTable 的区别及其优缺点?

答:ArrayList 和Vector是采用数组方式存储数据, ,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快!

HashMap和HashTable:Hashtable的方法是同步的,而HashMap的方法不是,Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。HashMap是一个线程不同步的,那么就意味着执行效率高,HashTable是一个线程同步的就意味着执行效率低,但是HashMap也可以将线程进行同步,这就意味着,我们以后再使用中,尽量使用HashMap这个类。

  1. 文件大小默认为 64M,改为 128M 有啥影响?

答:更改文件的block块大小,需要根据我们的实际生产中来更改block的大小,如果block定义的太小,大的文件都会被切分成太多的小文件,减慢用户上传效率,如果block定义的太大,那么太多的小文件可能都会存到一个block块中,虽然不浪费硬盘资源,可是还是会增加namenode的管理内存压力。

  1. RPC 原理?

答:

1.调用客户端句柄;执行传送参数

2.调用本地系统内核发送网络消息

  1. 消息传送到远程主机

  2. 服务器句柄得到消息并取得参数

  3. 执行远程过程

  4. 执行的过程将结果返回服务器句柄

  5. 服务器句柄返回结果,调用远程系统内核

  6. 消息传回本地主机

  7. 客户句柄由内核接收消息

  8. 客户接收句柄返回的数据

  9. 对 Hadoop 有没有调优经验,没有什么使用心得?(调优从参数调优讲起)

dfs.block.size

Mapredure:

io.sort.mb

io.sort.spill.percent

mapred.local.dir

mapred.map.tasks &mapred.tasktracker.map.tasks.maximum

mapred.reduce.tasks &mapred.tasktracker.reduce.tasks.maximum

mapred.reduce.max.attempts

mapred.reduce.parallel.copies

mapreduce.reduce.shuffle.maxfetchfailures

mapred.child.java.opts

mapred.reduce.tasks.speculative.execution

mapred.compress.map.output &mapred.map.output.compression.codec

mapred.reduce.slowstart.completed.maps

72以你的实际经验,说下怎样预防全表扫描

答:

1.应尽量避免在where 子句中对字段进行null 值判断,否则将导致引擎放弃使用索引而进行全表扫描

2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫

3.描应尽量避免在 where 子句中使用or 来连接条件,否则将导致引擎放弃使用索引而进行

全表扫描

http://4.in 和 not in,用具体的字段列表代替,不要返回用不到的任何字段。in 也要慎用,否则会导致全表扫描

5.避免使用模糊查询

6.任何地方都不要使用select* from t

  1. zookeeper 优点,用在什么场合

答:极大方便分布式应用的开发;(轻量,成本低,性能好,稳定性和可靠性高)

75.把公钥追加到授权文件的命令?该命令是否在 root 用户下执行?

答:ssh-copy-id

哪个用户需要做免密登陆就在哪个用户身份下执行

  1. 在 hadoop 开发过程中使用过哪些算法?其应用场景是什么?

答:排序,分组,topk,join,group

  1. 在实际工作中使用过哪些集群的运维工具,请分别阐述期作用。

答:nmon ganglia nagios

  1. 一台机器如何应对那么多的请求访问,高并发到底怎么实现,一个请求怎么产生的,

在服务端怎么处理的,最后怎么返回给用户的,整个的环节操作系统是怎么控制的?

  1. java 是传值还是传址?

答:引用传递。传址

  1. 问:你们的服务器有多少台?

100多台

  1. 问:你们服务器的内存多大?

128G或者64G的

  1. hbase 怎么给 web 前台提供接口来访问(HTABLE可以提供对 HBase的访问,但是怎么查询同一条记录的多个版本数据)?

答:使用HTable来提供对HBase的访问,可以使用时间戳来记录一条数据的多个版本。

  1. .htable API 有没有线程安全问题,在程序中是单例还是多例?

多例:当多线程去访问同一个表的时候会有。

  1. 你们的数据是用什么导入到数据库的?导入到什么数据库?

处理完成之后的导出:利用hive 处理完成之后的数据,通过sqoop 导出到 mysql 数据库

中,以供报表层使用。

  1. 你们业务数据量多大?有多少行数据?(面试了三家,都问这个问题)

开发时使用的是部分数据,不是全量数据,有将近一亿行(8、9 千万,具体不详,一般开

发中也没人会特别关心这个问题)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值