Hadoop大数据平台实战 —— 基础概念

Hadoop 起源于 Google 的三大论文:

  • GFS:Google 的分布式文件系统 Google File System
  • MapReduce:Google 的 MapReduce 开源分布式并行计算框架
  • BigTable:一个大型的分布式数据库

上述三大论文的演变关系:

  • GFS —— -> HDFS
  • Google MapReduce —— -> Hadoop MapReduce
  • BigTable —— -> HBase

Hadoop 名称的由来:

Hadoop 之父 Doug Cutting 儿子毛绒玩具象命名的。

Hadoop主流版本:

  • 原 生 版 本 : A p a c h e 基 金 会 h a d o o p \color{#FF0000}{原生版本:Apache 基金会 hadoop} Apachehadoop
  • Cloudera版本(Cloudera‘s Distribution Including Apache Hadoop,简称"CDH")
  • Hortonworks版本(Hortonworks Data Platform,简称"HDP")
*Apache HadoopCDHHDP
管理工具手动人工Cloudera ManagerAmbari
收费情况开源社区版免费,企业版收费免费

实际生产过程中是根据原生版本衍生自己封装的版本,这里我们只是为了学习Hadoop,直接使用原生版本即可

Hadoop框架最核心设计:HDFS 和 MapReduce

  • HDFS 为海量的数据提供了存储
  • MapReduce 为海量的数据提供了计算

Hadoop框架的四个模块:

  • Hadoop Common:这些是其他 Hadoop 模块所需的 Java 库和实用程序。这些库提供文件系统和操作系统级抽象,并包含启动 Hadoop 所需的 Java 文件和脚本
  • Hadoop YARN:这是一个用于作业调度和集群资源管理的框架
  • Hadoop Distributed File System(HDFS):分布式文件系统,提供对应用程序数据的高吞吐量访问
  • Hadoop MapReduce:基于 YARN 的用于并行处理大数据集的系统

Hadoop 的优点:

  • Hadoop是一个能够对大量数据进行分布式处理的软件框架
  • Hadoop 以一种可靠、高效、可伸缩的方式进行数据处理
  • Hadoop 是可靠的,因为它假设计算元素和存储会失败,因此它维护多个工作数据副本,确保能够针对失败的节点重新分布处理
  • Hadoop 是高效的,因为它以并行的方式工作,通过并行处理加快处理速度
  • Hadoop 是可伸缩的,能够处理 PB 级数据
  • Hadoop 依赖于社区服务,因此它的成本比较低,任何人都可以使用
  • Hadoop是一个能够让用户轻松架构和使用的分布式计算平台
  • 主要优点为:
    1. 高可靠性 Hadoop按位存储和处理数据的能力值得人们信赖
    2. 高扩展性 Hadoop是在可用的计算机集簇间分配数据并完成计算任务的,这些集簇可以方便地扩展到数以千计的节点中
    3. 高效性 Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快
    4. 高容错性 Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配
    5. 低成本 与一体机、商用数据仓库以及QlikView、Yonghong Z-Suite等数据集市相比,hadoop是开源的,项目的软件成本因此会大大降低

Hadoop 核心架构
在这里插入图片描述

  • HDFS
    对外部客户机而言,HDFS就像一个传统的分级文件系统。可以创建、删除、移动或重命名文件,等等。
    但是 HDFS 的架构是基于一组特定的节点构建的。这些节点包括 NameNode(仅一个),它在 HDFS 内部提供元数据服务;DataNode,它为 HDFS 提供存储块。HDFS 内部的所有通信都基于标准的 TCP/IP 协议
  • NameNode
    NameNode 是一个通常在 HDFS 实例中的单独机器上运行的软件。它负责管理文件系统名称空间和控制外部客户机的访问,NameNode 决定是否将文件映射到 DataNode 上的复制块上。
    对于最常见的 3 个复制块,第一个复制块存储在同一机架的不同节点上,最后一个复制块存储在不同机架的某个节点上。
    实际的 I/O事务并没有经过 NameNode,只有表示 DataNode 和块的文件映射的元数据经过 NameNode。
    当外部客户机发送请求要求创建文件时,NameNode 会以块标识和该块的第一个副本的 DataNode IP 地址作为响应。
    这个 NameNode 还会通知其他将要接收该块的副本的 DataNode。
    NameNode 在一个称为 FsImage 的文件中存储所有关于文件系统名称空间的信息。
    这个文件和一个包含所有事务的记录文件(这里是 EditLog)将存储在 NameNode 的本地文件系统上。
    FsImage 和 EditLog 文件也需要复制副本,以防文件损坏或 NameNode 系统丢失。
  • DataNode
    DataNode 也是一个通常在 HDFS实例中的单独机器上运行的软件。Hadoop 集群包含一个 NameNode 和大量 DataNodeDataNode 通常以机架的形式组织,机架通过一个交换机将所有系统连接起来。Hadoop 的一个假设是:机架内部节点之间的传输速度快于机架间节点的传输速度。DataNode 响应来自 HDFS 客户机的读写请求。它们还响应来自 NameNode 的创建、删除和复制块的命令。NameNode 依赖来自每个 DataNode 的定期心跳(heartbeat)消息。每条消息都包含一个块报告,NameNode 可以根据这个报告验证块映射和其他文件系统元数据。如果 DataNode 不能发送心跳消息,NameNode 将采取修复措施,重新复制在该节点上丢失的块
  • 文件操作
    DFS 并不是一个万能的文件系统。它的主要目的是支持以流的形式访问写入的大型文件。
    如果客户机想将文件写到 HDFS 上,首先需要将该文件缓存到本地的临时存储。
    如果缓存的数据大于所需的 HDFS 块大小,创建文件的请求将发送给 NameNode。NameNode 将以 DataNode 标识和目标块响应客户机。
    同时也通知将要保存文件块副本的 DataNode。
    当客户机开始将临时文件发送给第一个 DataNode 时,将立即通过管道方式将块内容转发给副本 DataNode。
    客户机也负责创建保存在相同 HDFS名称空间中的校验和(checksum)文件。
    在最后的文件块发送之后,NameNode 将文件创建提交到它的持久化元数据存储(在 EditLog 和 FsImage 文件)
  • Linux 集群
    Hadoop 框架可在单一的 Linux 平台上使用(开发和调试时),官方提供MiniCluster作为单元测试使用,
    不过使用存放在机架上的商业服务器才能发挥它的力量。这些机架组成一个 Hadoop 集群。
    它通过集群拓扑知识决定如何在整个集群中分配作业和文件。
    Hadoop 假定节点可能失败,因此采用本机方法处理单个计算机甚至所有机架的失败

Hadoop应用场景:

  • 在线旅游
  • 移动数据
  • 电子商务
  • 能源开采与节能
  • 基础架构管理
  • 图像处理
  • 诈骗检测
  • IT安全
  • 医疗保健

大数据的生态体系(开发 + 运维)
在这里插入图片描述
HDFS 工作原理
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一部分核心设计篇 第1 章HDFS 的数据存储………….. .....………………… ……………………····· ··· …..... ... 2 1.1 HDFS 内存存储...............…··························· ·· ···············…….................…... . .. .. ................. 2 1.1.l HDFS 内存存储原理..................…... . .....……......………………………………… 2 1.1.2 Linux 虚拟内存盘........……………………………………………………………………………… 4 1.1.3 HDFS 的内存存储流程分析…·… ………………………………………………………………… 4 1.1.4 LAZY PERSIST 内存存储的使用……………················ · ································ 14 1.2 HDFS 异构存储......... 1.2.1 异构存储类型……………………….... ... .. … ………… ……………… … ……… ·… … 16 1.2.2 异构存储原理…………………………………………………………………….. .. . ..........……. 17 1.2.3 块存储类型选择策略........……………………………………………………………………….. 22 1.2.4 块存储策略集合………········ ·· · ··· ···……… ……….... .... . ...... .. ... .. ........................… 24 1.2.5 块存储策略的调用………… …………………… ……… ………………………………… ……….. 27 1.2.6 HDFS 异构存储策略的不足之处………..................... .... ...........………..........… 28 1.2.7 HDFS 存储策略的使用…… ……………………………………………………………………… M 1.3 小结…..............………………··…………….......….................….......….........……………….. 31 VI 第2 章HDFS 的数据管理与策略选择… . .... .. ....... … … ………… . .. . ... .. ... .. .. .. .. . .. ..… ... .... … … . . 32 2.1 HDFS 缓存与缓存块…………… … … ... .... . . ……..... . . ..….... ...………………………………………. 32 2 .1.1 HDFS 物理层面缓存块… … … ………………… … … …… ………… ……………………………. 33 2.1.2 缓存块的生命周期状态… …… ….........…........…….........………… …... ..... ......... 34 2.1.3 CacheBlock 、UnCacheBlock 场景触发· ··· ·· ·· ·· ·······….......... . ......………................ 36 2.1.4 CacheBlock 、UnCacheBlock 缓存块的确定... .. .. .. .. ..................…........ .. . .. .. . .... .. 38 2.1.5 系统持有的缓存块列表如何更新… ………… ………………………··· · ···· 39 2.1.6 缓存块的使用......... . ....…..............……….......……·········…………......………. 40 2.1.7 HDFS 缓存相关配置…·……………………………………… …… ……………………………… 40 2.2 HDFS 中心缓存管理…... ... .…· ·……………………………………………………………………….. 42 2.2.l HDFS 缓存适用场景…… ··· · ···· ·· ····…………………………………………………………….. 43 2.2.2 HDFS 缓存的结构设计………….......………..... ... ........… ......... .. ............ ... .......... 43 2.2 .3 HDFS 缓存管理机制分析· ····· ·…………………………………………………. . 45 2.2.4 HDFS 中心缓存疑问点…….. .. .. .………..... . . …….. ... . .. . .………….. . ............ . ............... 55 2.2.5 HDFS CacheAdmin 命令使用.. . ..........…..... . ............ . ....………… …… .................. 56 2.3 HDFS 快照管理…… …… ………….... .. …………… .......…·… …… .. . . . ..…………....... 58 2.3.1 快照概念…·……………………………………………………………………………………………. 59 2.3.2 HDFS 中的快照相关命令…........................…............... . .................................… ·59 2.3.3 HDFS 内部的快照管理机制…………………………………………………………… . . . .. . .. . .. 60 2.3.4 HDFS 的快照使用……………·…… ………………………… …… … …… ………………………. 71 2.4 HDFS 副本放置策略. .. ..... ... . . .. ... . ...… … .. .. ...….. .. .. .…..... . .…… .. .. .. .. . ……. .. .. . … …… …... . . . .. . 72 2.4.1 副本放置策略概念与方法....... . …........ . .....…........ . ........ . ………......... . .... . …….. 72 2.4 .2 副本放置策略的有效前提………………………………………………………………………. 73 2.4 .3 默认副本放置策略的分析……··………………………………………………………………. 73 2.4.4 目标存储好坏的判断.. . .....……… … ……… ………………·…………………… 82 2.4.5 chooseTargets 的调用··· · · ·· ·……… ……… … …………………………………………………….. 83 2.4.6 BlockPlacementPolicyWithNo deGroup 继承类……………………·· …… …….. 84 2.4.7 副本放置策略的结果验证… …… ..... . ... . … … …………………………………… 85 2.5 HDFS 内部的认证机制……………………………… …………………………………………… … ………盯 2.5. l BlockToken 认证…… …… … … ………........…. . ........ . ..............…........….........….. 85 2 .5. 2 HDFS 的Sas I 认证……··……………………………………………………………………………引 2 .5.3 BlockToken 认证与HDFS 的Sas I 认证对比…… ……… ........…......................... 97 VII 2.6 HDFS 内部的磁盘目录服务…..... .. .... .... ......….... ...... ....…….......….... ....….. ........ ...... ....... 98 2.6.1 HDFS 的三大磁盘目录检测扫描服务…·…………………………… ………… …………… 98 2.6 .2 Diskαiecker : 坏盘检测服务..... ...... ...........… ……... ......… ………… . .. .... ...……. 99 2.6.3 DirectoryScanner :目录扫描服务…·………………………… … ………………………….. 104 2.6.4 VolumeScanner : 磁盘目录扫描服务… · …………………………………… … …………… · 110 2.7 小结….......…........….......…………………………………………......................….........…·· 116 第3 章HDFS 的新颖功能特性....... .... .. . .… … …… 3.1 HDFS 视图文件系统: V1ewFileSystem · ··· ·· · ·· ·· ·· ··… ....... .... .. ..... ...... .. .………………… · 117 3.1.1 ViewFileSystem :视图文件系统……………………………………… ·· ·················· 118 3.1.2 ViewFileSystem 内部实现原理………………………………………………… …… ……… · · 119 3 .1.3 ViewFileSystem 的使用……… ……… … ………………………………………………………. 125 3.2 HDFS 的Web 文件系统: WebHdfsFileSystem · ·…... .. ...…... .... ..…........… .... .. ........ ....… 126 3 .2.1 WebHdfsFileSystem 的REST API 操作… ·…………… …… …………………………….. 127 3.2.2 WebHdfsFileSystem 的流程调用…….. . . ...….... ..... ........ .. ... . ........ . .…. ... .. .… …… 129 3.2.3 WebHdfsFileSystem 执行器调用……··……………………………………………………… 130 3.2.4 WebHDFS 的0Auth2 认证…·………………………………………………………………… 1 日 3.2.5 WebHDFS 的使用…………………………………………………………………… ………. . 135 3.3 HDFS 数据加密空间: Encryption zone …… ………………………… ………… ………………….. 136 3.3 . l Encryption zone 原理介绍.........…………………………………………………………….. 136 3.3.2 Encryption zone 源码实现…………··……………………………………………………….. 136 3.3.3 Encryption zone 的使用…·……………………………………………………………………… 144 3.4 HDFS 纠删码技术…... . .... . .....……..... . ............ ...… ··· · ··· …. .. ..... . ….... . …………. ·······…… 145 3.4.1 纠删码概念…..... . ...……………… ……………………… … …………………………… ……….. 145 3.4.2 纠删码技术的优劣势…·……… ……………………………………………………… …………. 146 3.4.3 Hadoop 纠删码概述…·…········· ·· ·· ····· ·· ····· · ··· · ······· ·· ….... . .. .…..... .. ....................... 147 3.4.4 纠删码技术在Hadoop 中的实现…… … ……… ……………… ………… … … …… … … ….. 148 3.5 HDFS 对象存储: Ozone· ……...............…….......….......……….......... .. ... … … … … … … 152 3.5.l Ozone 介绍... .. . .......….. .... ..………… …………………………………… … …………………… 153 3.5.2 Ozone 的高层级设计· · ···· ···………·· · ····……… ………………………………………………. 154 3.5.3 Ozone 的实现细节……… · ·…………………… ………………………………………… … …. 157 3.5.4 Ozone 的使用…·…………… ……………………………………………… … ……………… ……. 157 3.6 小结….......……………………………………………………… .... . ...........………….. .. .....………. 158 VIII 第二部分细节实现篇 第4 章HDFS 的块处理……·…………………………………………….... ......... ..…….... ....… 160 4.1 HDFS 块检查命令fsck … ··……………………… …………………… … ……… ……… ……………… . . 160 4 .1.l fsck 参数使用… . .. . .. .. . ... ..…… ··· · ···· ··· ·· ······· · · · ·…………………………….. 160 4 .1.2 fsck 过程调用….......………… …… ……………………………........................ 161 4. l.3 fsck 原理分析.........…… …. .. ... .………… …… ……… … ………………………………………. 162 4. l.4 fs 此使用场景······· · ·· · · · ··· ·… … …… ……………… ·… ……........……………........….......... 171 4.2 HDFS 如何检测并删除多余副本块...... . …....... . .………….... . .... . .............…….........……. 171 4.2.1 多余副本块以及发生的场景… …··…………………………………………………………… 172 4.2.2 OverReplication 多余副本块处理……………………………………………………………. 172 4.2.3 多余副本块清除的场景调用...... ...... .. .. .... .. .. ...... . . ...... . ... . .. ... . . .…................ . ….. 177 4.3 HDFS 数据块的汇报与处理…………………………………………………………………………….. 179 4 .3. l 块处理的五大类型………………………………………………………………………………… 179 4.3.2 toAdd : 新添加的块... .. ....….... .. . ..…… … ………………………………………… 181 4.3.3 toRemove : 待移除的块…·……………………… ………………………………………… … .. 184 4.3.4 tolnvalidate : 无效的块………………… …………………………………. . 186 4 .3.5 toCorrupt : 损坏的块… · ………………………………………………………………………… 189 4.3.6 toUC : 正在构建中的块………… ... .. .. .. ... ... .. ... .... . .. ....... -. ..... ...... .. ....……··…… 191 44 小结… … ………·· ·· ··· ……………… … ………… …… ·· …………………………………………….. 193 第5 章HDFS 的流量处理…··…………………………………………………… ………………………… .. 1 归 5.1 HDFS 的内部限流. . ..... .. . .... ........... . .. . …………………………… · …… ………… . . .. .. . .. . . 194 5.1.l 数据的限流….... ....…·………………………………………… … ……… …… …………………. 194 5.1.2 DataTransferThrottler 限流原理.. .... ... ………………………………………………………. 196 5.1.3 数据流限流在Hadoop 中的使用… ………… ·….. . .....................….................…… 198 5.1.4 Hadoop 限流优化点… ·………………… ………………………………………………………… 202 5.2 数据平衡…….. . ... ... ............................ .………… ………………………·······…·…....... 204 5.2. 1 Balancer 和Dispatcher········· ·· ···· …………………………………………… 204 5.2.2 数据不平衡现象… ·……… … ……... ....…..............… … ………………………….. 207 5.2. 3 Balancer 性能优化……………… …… …·……………………………………………….. 207 IX 5 3 HDFS 节点内数据平衡… …·………………… ………………………………………………………….. 210 5.3. l 磁盘问数据不平衡现象及问题……………………………………………………………… 0021 l 5.3.2 传统的磁盘问数据不平衡解决方案…………………………………··………… 211 5.3.3 社区解决方案: DiskBalancer ·… .. ......…...............….......…··….......….......…....... 212 第6 章HDFS 的部分结构分析… ··…………………………… … … …………………………… … ……… 217 6.1 HDFS 镜像文件的解析与反解析…··· ··· ········…...........……………………........…...... 217 6.1 .1 HDFS 的Fslmage 镜像文件... ......….........…………………………… · ·……................ 218 6.1.2 Fslmage 的解析.. . .....…·…………… …………………………………………………………….. 218 6.1.3 Fslmage 的反解析........…………………….. . .......…….......……......................….. 221 6.1.4 HDFS 镜像文件的解析与反解析命令…...........….......................................….. 226 6.2 DataNode 数据处理中心DataXceiver ……… .. ..... .……. ... ... ……..... . …... . ...…...... .... ....….. 227 6.2.l DataXceiver 的定义和结构...... . .. .. ...................……………… ………··…….. ..... 228 6.2.2 DataXceiver 下游处理方法…………………………………………………………………… 232 6.2.3 ShortCircuit …...... ..…......... .. .......….... .. ..... .............…·……………………………. 232 6.2.4 DataXceiver 的上游调用... .. .. . .. ...……………………………………………………….. 233 6.2 5 DataXceiver 与DataXce1verSe凹er .. ··………………………………………………………. 234 6.3 日DFS 邻近信息块: BlocklnfoContiguous ....... · ..........................………………. .. ...….. 235 6.3 .1 tnplets 对象数组···· · ··· ···· · ··· ·· ···· · ··…………………………………………………………….. 236 6 .3.2 BlocklnfoContiguous 的链表操作…·… · ···············….......... .. ….......…................. 239 6.3.3 块迭代器Blocklterator ..…… ............. ...…...............………………… ... ......…… 244 6.4 小结.......……… ….. .. . ...…………......................... . ..... ... . ... . . . ……………… ·· ····· ··…··…........ 246 第三部分解决方案篇 第7 章HDFS 的数据管理… .......…………........….......…........…·……………........................ 248 7.1 HDFS 的读写限流方案………...... . …….......….......….......….........….. ... ............….......… 248 7 . 1.1 限流方案实现要点以及可能造成的影响.. .. .. .…………···· · ··· ·….. . . .....…........... 248 7.1.2 限流方案实现…………….... ........ .... . ......…...............................................….. 249 7.1.3 限流测试结果……....... .………… …………………………………………………..... .. .… 250 x 7.2 HDFS 数据资源使用量分析以及趋势预测…........... . ....……..............…······· · ·······…… 250 7.2. 1 要获取哪些数据……. . . ... .... ... ... … ….......…... . ...… … …... . ............ . ...... . ............… 251 7.2.2 如何获取这些数据……. . . . ...………·· … … … …..... . ......................................... . ......... 251 7 .2 3 怎么用这些数据… ·……………………………………………………………….. . .. . ....... . … 254 7.3 H DFS 数据迁移解决方案… … ........ . …································…………….. .. ...… . ..............… 257 7.3. l 数据迁移使用场景………………………………………………………………………………… 257 7.3.2 数据迁移要素考量... . ............…··································· · ·…………….......………. 258 7 .3.3 HD F S 数据迁移解决方案: D istCp …………………………………………………………. 259 7.3.4 DistCp 优势特性…………………………………… … ………………………………………….. 260 7.3 .5 Hadoop DistCp 命令······· · ·····… … ……· · ……………………….....................… . 264 7.3.6 D is tC p 解决集群间数据迁移实例…… … . .... .. …… . ..................................…........ 265 7 4 D ataNo de 迁移方案…··… … …….......….. . .. .. .… . ......…................……….......…................… 265 7.4.1 迁移方案的目标... . ..... … ……………….. . .... . … h ………………………………………… 266 7.4.2 DataNo d e 更换主机名、i p 地址时的迁移方案…….......................................... 267 7.5 H D FS 集群重命名方案……....... . ... . ...…….. . .. . .. . .......…….............................. . .....……… 268 7.6 HD FS 的配置管理方案... . ...........…··…………………………………………………………….. 271 7.6. 1 HDFS 配置管理的问题………………………………………………………………………… . . 271 7.6.2 现有配置管理工具....................... . . … … . ........... . .....….......... . ...... . ................ . ...… 272 7.6.3 运用Git 来做配置管理………………………………………………………………………. 272 第8 章HDFS 的数据读写……… … …………………………................... . ..….............. 274 8.1 D ataNo d e 引用计数磁盘选择策略.... . ... . .............. . ...... . .... . ........... . .... . ... . ... . .............. .' .... 274 8.1.1 HD FS 现有磁盘选择策略..... . ............….......…….......……………………… . .. . . 274 8.1.2 自定义磁盘选择策略…………… … …………… … … … ……………………………………….. 279 8.2 Hadoo p 节点“慢磁盘”监控…… … .. ... ...……··…………………………………………………….. 282 8.2.1 慢磁盘的定义以及如何发现………………… … ……………………………….. 282 8.2.2 慢磁盘监控…·· · ···· · ·………··· · ···…………… . ......…........…................................... 284 第9 章HDFS 的异常场景……….. ... ... … .... . ..……. .. ....……………….... . ..……... . ..….......…······· 288 9 . 1 DataN ode 慢启动问题…·……………………………………………………………………………… … .. 288 XI 9 .1.1 DataN ode 慢启动现象………………………………·······……….......……......... 288 9.1.2 代码追踪分析.. .. .. ...... .………………… …………… ……………………………………… … … 290 9.1.3 参数可配置化改造…·…………………………………………………………………………….. 293 9.2 Hadoop 中止下线操作后大量剩余复制块问题….......…·….......................................…. 295 9.2.1 节点下线操作的含义及问题……………………………………… ………………………….. 295 9.2.2 死节点“复活”………. . .....………………………………………………………………… . . 297 9.2.3 Decommission 下线操作如何运作…… …………... ....…… .. .. . .. . .. ..... ... .. .... . ......... 299 9.2.4 中止下线操作后移除残余副本块解决方案…………………………..... ...…·······…… 3 03 9.3 DFSOutputStream 的DataStreamer 线程泄漏问题…... ... .. ..... ... .......……. ................... 306 9.3.1 DFSOutputStream 写数据过程及周边相关类、变量........ . ......…................….. 306 9 3.2 DataStreamer 数据流对象…·………………………………………………………………… 307 9.3.3 ResponseProcessor 回复获取类…·…..................................….........…………… ··311 9.3.4 DataStreamer 与DFSOutputStream 的关系……...............…….................…....... 313 9.3 5 Streamer 线程泄漏问题.........……… .. .... .……………………………… …………………… 3 16 9.4 小结. ..... ...………·…………………………………………………………………………………………. 319 附录如何向开源社区提交自己的代码………………………………. ... .. ............................ 320

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值