震惊!!!跟着我学Hadoop,既然如此简单。(快收藏起来学习吧)

例如,如果一个节点失败,HDFS可以自动将其数据复制到其他节点,从而保证数据的可靠性。

2,MapReduce:

MapReduce是一个分布式计算模型,用于处理大规模数据集。它将数据划分成小块,然后在分布式计算集群上并行处理这些块。MapReduce的核心是“map”和“reduce”两个阶段。

在“map”阶段,将数据分解成键值对并进行处理;在“reduce”阶段,对中间结果进行合并和汇总。

例如,可以使用MapReduce对Web日志文件进行分析,以了解用户的访问模式和行为。

MapReduce具有如下特点:
  1. 良好的扩展性
  2. 高容错性
  3. 适合PB级以上海量数据的离线处理
3,YARN:

YARN是一个资源管理器,用于管理Hadoop集群中的计算资源。它可以分配计算资源,管理应用程序,并提供集群级别的安全性和控制。

例如,YARN可以分配计算资源,让Spark应用程序在集群上运行。

Yarn具有如下特点:
  1. 良好的扩展性、高可用性
  2. 对多种数据类型的应用程序进行统一管理和资源调度
  3. 自带了多种用户调度器,适合共享集群环境
4,Hive:

Hive由facebook开源,最初用于解决海量结构化的日志数据统计问题;是一种ETL(Extraction-Transformation-Loading)工具。它也是构建在Hadoop之上的数据仓库;数据计算使用MR,数据存储使用HDFS。

Hive定义了一种类似SQL查询语言的HiveQL查询语言,除了不支持更新、索引和实物,几乎SQL的其他特征都能支持。它通常用于离线数据处理(采用MapReduce);我们可以认为Hive的HiveQL语言是MapReduce语言的翻译器,把MapReduce程序简化为HiveQL语言。但有些复杂的MapReduce程序是无法用HiveQL来描述的。

HQL(HiveQL)用于运行存储在Hadoop上的查询语句,Hive让不熟悉MapReduce开发人员也能编写数据查询语句,然后这些语句被翻译为Hadoop上面的MapReduce任务。

Hive提供shell、JDBC/ODBC、Thrift、Web等接口。

Hive应用场景
  1. 日志分析:统计一个网站一个时间段内的pv、uv;比如百度。淘宝等互联网公司使用hive进行日志分析
  2. 多维度数据分析
  3. 海量结构化数据离线分析
  4. 低成本进行数据分析(不直接编写MR)
5,Pig:

Pig由yahoo!开源,设计动机是提供一种基于MapReduce的ad-hoc数据分析工具。它通常用于进行离线分析

Pig定义了一种数据流语言—Pig Latin,它是MapReduce编程的复杂性的抽象,Pig平台包括运行环境和用于分析Hadoop数据集的脚本语言(Pig Latin)。

Pig是一个数据分析工具,可以处理非结构化数据。它提供了一个脚本语言,可以将脚本转换为MapReduce任务。

Pig有三种运行方式:Grunt shell、脚本方式、嵌入式。

例如,可以使用Pig处理社交媒体上的文本数据,并提取有用的信息。

Pig与Hive的比较

6,HBase:

HBase是一个分布式的非关系型数据库,可以处理非常大的数据集。它提供了高度可伸缩性和容错性,可以存储海量的数据。

例如,可以使用HBase存储物联网传感器数据,并对数据进行分析。

HBase的特点
  1. 高可靠性
  2. 高性能
  3. 面向列
  4. 良好的扩展性
7,ZooKeeper:

Zookeeper源自Google发表于2006年11月的Chubby论文,也就是说Zookeeper是Chubby的克隆版。

ZooKeeper是一个分布式的协调服务,可以协调集群中各个节点之间的交互。它可以确保节点之间的同步和一致性,提供可靠的服务。

例如,在Hadoop集群中,ZooKeeper可以用于管理HDFS的名称节点。

Zookeeper解决分布式环境下数据管理问题:
  1. 统一命名
  2. 状态同步
  3. 集群管理
  4. 配置同步
8,Spark:

Spark是一个基于内存的计算引擎,用于处理大规模数据集。它提供了比MapReduce更快的处理速度,并支持实时数据处理和机器学习。

例如,可以使用Spark对电商网站的销售数据进行实时分析,并对用户进行个性化推荐。

此外,Hadoop生态圈还包括Flume、Sqoop等日志收集和数据传输组件,以及数据存储、处理和协调组件,以及,共同构成了一个强大而灵活的生态系统,使得Hadoop能够应对不同的大数据应用场景。

Hadoop生态系统的特点
  1. 源代码开源
  2. 社区活跃、参与者众多
  3. 涉及分布式存储和计算的方方面面
  4. 已得到企业界验证

二,重点介绍mapreduce概述

MapReduce是一个分布式运算程序的编程框架,是用户开发"Hadoop的数据分析应用"的核心框架。

MapReduce的思想核心是"分而治之",适用于大量复杂的任务处理场景(大规模数据处理场景)。Map负责"分",即把复杂的任务分解为若干个"简单的任务"来并行处理。可以进行拆分的前提是这些小任务可以并行计算,彼此间几乎没有依赖关系。Reduce负责"合",即对Map阶段的结果进行全局汇总。

MapReduce用于大规模数据集(通常大于1TB)的并行运算,实现了Map和Reduce两个功能。

MapReduce的体系结构

主要由四个部分组成,分别是:Client、JobTracker、TaskTracker以及Task。
1、Client:程序通过Client提交到JT端,可以通过Cilent提供的接口查看作业运行状态。
2、JobTracker: 监控资源、调度作业,监控所有的TT和Job的健康,一旦发现失败,就会将任务转移到其他节点。
3、TaskTracker: 想JT汇报资源使用情况和作业运行情况,接受JT的命令并执行。
4、Task: Task 分为Map Task 和Reduce Task 两种,均由TaskTracker 启动。

各个执行阶段流程图

图中的split(分片): HDFS 以固定大小的block 为基本单位存储数据,而对于MapReduce 而言,其 处理单位是split。split 是一个逻辑概念,它只包含一些元数据信息,比如数据 起始位置、数据长度、数据所在节点等。它的划分方法完全由用户自己决定。
Map任务数量: 一个split创建一个Map,由split数量决定。
Reduce任务数量: 最优的Reduce任务个数取决于集群中可用的reduce任务槽(slot)的数目。通常设置比reduce任务槽数目稍微小一些的Reduce任务个数(这样可以预留一些系统资源处理可能发生的错误)

MapReduce提供了以下的主要功能:
1)数据划分和计算任务调度:

系统自动将一个作业(Job)待处理的大数据划分为很多个数据块,每个数据块对应于一个计算任务(Task),并自动 调度计算节点来处理相应的数据块。作业和任务调度功能主要负责分配和调度计算节点(Map节点或Reduce节点),同时负责监控这些节点的执行状态,并 负责Map节点执行的同步控制。

2)数据/代码互定位:

为了减少数据通信,一个基本原则是本地化数据处理,即一个计算节点尽可能处理其本地磁盘上所分布存储的数据,这实现了代码向 数据的迁移;当无法进行这种本地化数据处理时,再寻找其他可用节点并将数据从网络上传送给该节点(数据向代码迁移),但将尽可能从数据所在的本地机架上寻 找可用节点以减少通信延迟。

3)系统优化:

为了减少数据通信开销,中间结果数据进入Reduce节点前会进行一定的合并处理;一个Reduce节点所处理的数据可能会来自多个 Map节点,为了避免Reduce计算阶段发生数据相关性,Map节点输出的中间结果需使用一定的策略进行适当的划分处理,保证相关性数据发送到同一个 Reduce节点;此外,系统还进行一些计算性能优化处理,如对最慢的计算任务采用多备份执行、选最快完成者作为结果。

4)出错检测和恢复:

以低端商用服务器构成的大规模MapReduce计算集群中,节点硬件(主机、磁盘、内存等)出错和软件出错是常态,因此 MapReduce需要能检测并隔离出错节点,并调度分配新的节点接管出错节点的计算任务。同时,系统还将维护数据存储的可靠性,用多备份冗余存储机制提 高数据存储的可靠性,并能及时检测和恢复出错的数据。

MapReduce设计上具有以下主要的技术特征:
1)向"外"横向扩展,而非向"上"纵向扩展

即MapReduce集群的构建完全选用价格便宜、易于扩展的低端商用服务器,而非价格昂贵、不易扩展的高端服务器。

对于大规模数据处理,由于有大 量数据存储需要,显而易见,基于低端服务器的集群远比基于高端服务器的集群优越,这就是为什么MapReduce并行计算集群会基于低端服务器实现的原 因。

2)失效被认为是常态

MapReduce集群中使用大量的低端服务器,因此,节点硬件失效和软件出错是常态,因而一个良好设计、具有高容错性的并行计算系统不能因为节点 失效而影响计算服务的质量,任何节点失效都不应当导致结果的不一致或不确定性;任何一个节点失效时,其他节点要能够无缝接管失效节点的计算任务;当失效节 点恢复后应能自动无缝加入集群,而不需要管理员人工进行系统配置。

MapReduce并行计算软件框架使用了多种有效的错误检测和恢复机制,如节点自动重 启技术,使集群和计算框架具有对付节点失效的健壮性,能有效处理失效节点的检测和恢复。

3)把处理向数据迁移

传统高性能计算系统通常有很多处理器节点与一些外存储器节点相连,如用存储区域网络(Storage Area,SAN Network)连接的磁盘阵列,因此,大规模数据处理时外存文件数据I/O访问会成为一个制约系统性能的瓶颈。

为了减少大规模数据并行计算系统中的数据 通信开销,代之以把数据传送到处理节点(数据向处理器或代码迁移),应当考虑将处理向数据靠拢和迁移。MapReduce采用了数据/代码互定位的技术方法,计算节点将首先尽量负责计算其本地存储的数据,以发挥数据本地化特点,仅当节点无法处理本地数据时,再采用就近原则寻找其他可用计算节点,并把数据传送到该可用计算节点。

4)顺序处理数据、避免随机访问数据

大规模数据处理的特点决定了大量的数据记录难以全部存放在内存,而通常只能放在外存中进行处理。由于磁盘的顺序访问要远比随机访问快得多,因此 MapReduce主要设计为面向顺序式大规模数据的磁盘访问处理。

为了实现面向大数据集批处理的高吞吐量的并行处理,MapReduce可以利用集群中 的大量数据存储节点同时访问数据,以此利用分布集群中大量节点上的磁盘集合提供高带宽的数据访问和传输。

5)为应用开发者隐藏系统层细节

软件工程实践指南中,专业程序员认为之所以写程序困难,是因为程序员需要记住太多的编程细节(从变量名到复杂算法的边界情况处理),这对大脑记忆是 一个巨大的认知负担,需要高度集中注意力;而并行程序编写有更多困难,如需要考虑多线程中诸如同步等复杂繁琐的细节。由于并发执行中的不可预测性,程序的 调试查错也十分困难;而且,大规模数据处理时程序员需要考虑诸如数据分布存储管理、数据分发、数据通信和同步、计算结果收集等诸多细节问题。

MapReduce提供了一种抽象机制将程序员与系统层细节隔离开来,程序员仅需描述需要计算什么(What to compute),而具体怎么去计算(How to compute)就交由系统的执行框架处理,这样程序员可从系统层细节中解放出来,而致力于其应用本身计算问题的算法设计。

6)平滑无缝的可扩展性

这里指出的可扩展性主要包括两层意义上的扩展性:数据扩展和系统规模扩展性。

理想的软件算法应当能随着数据规模的扩大而表现出持续的有效性,性能上的下降程度应与数据规模扩大的倍数相当;在集群规模上,要求算法的计算性能应能随着节点数的增加保持接近线性程度的增长。绝大多数现有的单机算法都达不到 以上理想的要求;把中间结果数据维护在内存中的单机算法在大规模数据处理时很快失效;从单机到基于大规模集群的并行计算从根本上需要完全不同的算法设计。奇妙的是,MapReduce在很多情形下能实现以上理想的扩展性特征。

多项研究发现,对于很多计算问题,基于MapReduce的计算性能可随节点数目增长保持近似于线性的增长。

三,介绍spark技术特点和概述

1、Spark概述

Spark最初由美国加州伯克利大学(UCBerkeley)的AMP(Algorithms, Machines and People)实验室于2009年开发,是基于内存计算的大数据并行计算框架,可用于构建大型的、低延迟的数据分析应用程序。Spark在诞生之初属于研究性项目,其诸多核心理念均源自学术研究论文。2013年,Spark加入Apache孵化器项目后,开始获得迅猛的发展,如今已成为Apache软件基金会最重要的三大分布式计算系统开源项目之一(即Hadoop、Spark、Storm)

2、Spark的特点

Spark计算框架在处理数据时,所有的中间数据都保存在内存中,从而减少磁盘读写操作,提高框架计算效率。同时Spark还兼容HDFS、Hive,可以很好地与Hadoop系统融合,从而弥补MapReduce高延迟的性能缺点。所以说,Spark是一个更加快速、高效的大数据计算平台。

特点可以概括为以下四点

1:运行速度快

2:容易使用

3:通用性

4:运行模式多样

Spark支持使用Scala Java Python和R语言编程,由于Spark采用Scala语言进行开发,因此建议采用Scala语言进行Spark应用程序的编写,采用Scala语言编写Spark应用程序,可以获得最好的性能,和其他语言相比,Scala主要有以下三个方面的优势

1:Java代码比较繁琐

2:Python语言并发性能不好

3:Scala兼容Java

3、Spark生态系统

Spark在2013年加入Apache孵化器项目,之后获得迅猛的发展,并于2014年正式成为Apache软件基金会的顶级项目。Spark生态系统已经发展成为一个可应用于大规模数据处理的统一分析引擎,它是基于内存计算的大数据并行计算框架,适用于各种各样的分布式平台的系统。在Spark生态圈中包含了Spark SQL、Spark Streaming、GraphX、MLlib等组件。

Spark Core:Spark核心组件,实现了Spark的基本功能,包含任务调度、内存管理、错误恢复、与存储系统交互等模块。Spark Core中还包含对弹性分布式数据集的API定义。

Spark SQL:用来操作结构化数据的核心组件,通过Spark SQL可直接查询Hive、HBase等多种外部数据源中的数据。Spark SQL的重要特点是能够统一处理关系表和RDD。

Spark Streaming:Spark提供的流式计算框架,支持高吞吐量、可容错处理的实时流式数据处理,其核心原理是将流数据分解成一系列短小的批处理作业。

MLlib:Spark提供的关于机器学习功能的算法程序库,包括分类、回归、聚类、协同过滤算法等,还提供了模型评估、数据导入等额外的功能。

GraphX:Spark提供的分布式图处理框架,拥有对图计算和图挖掘算法的API接口及丰富的功能和运算符,便于对分布式图处理的需求,能在海量数据上运行复杂的图算法。

独立调度器、Yarn、Mesos:集群管理器,负责Spark框架高效地在一个到数千个节点之间进行伸缩计算的资源管理。

4、Spark运行架构与原理

Spark运行架构主要由SparkContext、Cluster Manager和Worker组成,其中Cluster Manager负责整个集群的统一资源管理,Worker节点中的Executor是应用执行的主要进程,内部含有多个Task线程以及内存空间。

5、Spark运行基本流程

1)当一个Spark应用被提交时,根据提交参数创建Driver进程,为应用构建起基本的运行环境,即由Driver创建一个SparkContext进行资源的申请、任务的分配和监控。

2)SparkContext根据RDD的依赖关系构建DAG图,DAG图提交给DAGScheduler解析成Stage,然后把一个个TaskSet提交给底层调度器Task Scheduler处理。

3)资源管理器Cluster Manager为Executor分配资源,并启动Executor进程

4)Executor向SparkContext申请Task,TaskScheduler将Task发放给Executor运行并提供应用程序代码。

5)Task在Executor上运行把执行结果反馈给TaskScheduler,然后反馈给DAGScheduler,运行完毕后写入数据并释放所有资源。

四,mapreduce和spark的区别

1. Spark处理数据是基于内存的,而MapReduce是基于磁盘处理数据的。

MapReduce是将中间结果保存到磁盘中,减少了内存占用,牺牲了计算性能。Spark是将计算的中间结果保存到内存中,可以反复利用,提高了处理数据的性能。

2. Spark在处理数据时构建了DAG有向无环图,减少了shuffle和数据落地磁盘的次数。

Spark 计算比 MapReduce 快的根本原因在于 DAG 计算模型。一般而言,DAG 相比MapReduce 在大多数情况下可以减少 shuffle 次数。Spark 的 DAGScheduler 相当于一个改进版的 MapReduce,如果计算不涉及与其他节点进行数据交换,Spark 可以在内存中一次性完成这些操作,也就是中间结果无须落盘,减少了磁盘 IO 的操作。但是,如果计算过程中涉及数据交换,Spark 也是会把 shuffle 的数据写磁盘的!有一个误区,Spark 是基于内存的计算,所以快,这不是主要原因,要对数据做计算,必然得加载到内存,Hadoop 也是如此,只不过 Spark 支持将需要反复用到的数据给 Cache 到内存中,减少数据加载耗时,所以 Spark 跑机器学习算法比较在行(需要对数据进行反复迭代)

3.Spark是粗粒度资源申请,而MapReduce是细粒度资源申请。

粗粒度申请资源指的是在提交资源时,spark会提前向资源管理器(yarn,mess)将资源申请完毕,如果申请不到资源就等待,如果申请到就运行task任务,而不需要task再去申请资源。 MapReduce是细粒度申请资源,提交任务,task自己申请资源自己运行程序,自己释放资源,虽然资源能够充分利用,但是这样任务运行的很慢。

Spark的优势:

1.每一个作业独立调度,可以把所有的作业做一个图进行调度,各个作业之间相互依赖,在调度过程中一起调度,速度快。

2.所有过程都基于内存,所以通常也将Spark称作是基于内存的迭代式运算框架。

3.spark提供了更丰富的算子,让操作更方便。

4.更容易的API:支持Python,Scala和Java

其实spark里面也可以实现Mapreduce,但是这里它并不是算法,只是提供了map阶段和reduce阶段,但是在两个阶段提供了很多算法。如Map阶段的map, flatMap, filter, keyBy,Reduce阶段的reduceByKey, sortByKey, mean, gourpBy, sort等。

五,结构化数据与非结构化数据

结构化数据:

结构化数据是指按照一定的规则和格式进行组织和存储的数据。它具有明确的数据类型和关系,可以通过预定义的模式或模型进行描述和解释。常见的结构化数据包括关系型数据库中的表格数据、电子表格中的数据、XML文件中的数据等。结构化数据通常可以通过查询和分析工具进行处理和分析,从中提取有用的信息和洞察。与结构化数据相对的是非结构化数据,如文本、图像、音频和视频等,它们没有明确的结构和格式,处理和分析起来更加困难。

非结构化数据:

非结构化数据是指没有明确的结构和格式的数据,它不符合传统的表格、行列或关系型数据库的组织形式。非结构化数据的特点是多样性、复杂性和不规则性,常见的非结构化数据包括文本文档、电子邮件、社交媒体帖子、音频和视频文件、图像、日志文件等。

与结构化数据不同,非结构化数据没有明确的数据模型或模式,因此处理和分析非结构化数据更具挑战性。传统的关系型数据库和查询语言无法直接处理非结构化数据,需要使用特定的技术和工具进行处理,如自然语言处理、文本挖掘、图像识别、语音识别等。

非结构化数据在现实生活中广泛存在,例如社交媒体上的用户评论、新闻文章、音频和视频文件中的内容、传感器数据等。对非结构化数据的分析和挖掘可以帮助企业和组织发现隐藏的信息、洞察用户需求、进行情感分析、进行风险评估等。

结构化数据和非结构化数据的区别

数据组织形式:结构化数据按照预定义的模式和格式进行组织,具有明确的数据类型和关系,通常以表格、行列或关系型数据库的形式存储。非结构化数据没有明确的结构和格式,多样性、复杂性和不规则性较高,以文本、图像、音频、视频等形式存在。

数据处理方式:结构化数据可以通过传统的查询语言(如SQL)进行处理和分析,可以进行数据的筛选、排序、聚合等操作。非结构化数据的处理需要使用特定的技术和工具,如自然语言处理、图像识别、语音识别等,以提取有用的信息和洞察。

数据分析能力:结构化数据由于有明确的结构和格式,可以进行较为精确的数据分析和建模,可以进行统计分析、预测建模等。非结构化数据的分析相对更具挑战性,需要使用更复杂的技术和算法,如文本挖掘、情感分析、图像识别等。

数据应用领域:结构化数据常用于企业的业务数据管理、报表生成、决策支持等方面。非结构化数据常用于社交媒体分析、舆情监测、情感分析、图像识别、语音识别等领域。

需要注意的是,现实世界中的数据往往是结构化数据和非结构化数据的混合,因此在数据处理和分析时,需要综合考虑两种类型的数据。

结构化数据和非结构化数据的应用
结构化数据的应用:
  • 企业数据管理:结构化数据常用于企业的业务数据管理,包括客户信息、销售数据、财务数据等。它们可以通过关系型数据库进行存储和管理,用于业务流程的支持和决策制定。
  • 报表生成和分析:结构化数据可以通过查询和分析工具进行数据提取、筛选、排序和统计,用于生成各种报表和数据分析,支持业务决策和业绩评估。
  • 数据挖掘和预测建模:结构化数据可以用于数据挖掘和预测建模,通过分析历史数据,发现隐藏的模式和关联,进行趋势预测、市场分析、客户行为分析等。
非结构化数据的应用:
  • 社交媒体分析:非结构化数据在社交媒体分析中起着重要的作用,可以通过文本挖掘和情感分析技术,了解用户的观点、情感和需求,进行舆情监测、品牌声誉管理等。
  • 图像和视频处理:非结构化数据中的图像和视频可以通过图像识别、目标检测、视频分析等技术进行处理,用于人脸识别、智能监控、图像搜索等应用。
  • 自然语言处理:非结构化数据中的文本可以通过自然语言处理技术进行处理,包括文本分类、实体识别、关系抽取、机器翻译等,用于智能客服、智能助手、文本分析等应用。

需要注意的是,结构化数据和非结构化数据往往是相互补充的,综合使用可以获得更全面的信息和洞察。在实际应用中,常常需要将结构化数据和非结构化数据进行整合,以支持更复杂的分析和决策需求。

六,Linux简单操作命令

根目录

linux文件与目录操作

pwd 命令

格式:pwd

功能:显示当前所在目录(即工作目录)。

ls 命令

格式:ls [选项] [文件|目录]

功能:显示指定目录中的文件或子目录信息。当不指定文件或目录时,显示 当前工作目录中的文件或子目录信息。

命令常用选项如下: -a :全部的档案,连同隐藏档( 开头为 . 的档案) 一起列出来。

-l :长格式显示,包含文件和目录的详细信息。

-R :连同子目录内容一起列出来。

说明:命令“ls –l”设置了别名:ll,即输入 ll 命令,执行的是 ls –l 4 命令。

cd 命令

格式:cd 路径>

功能:用于切换当前用户所在的工作目录,其中路径可以是绝对路径也可以 是相对路径。

mkdir 命令

格式: mkdir [选项] 目录

功能:用于创建目录。创建目录前需保证当前用户对当前路径有修改的权 限。

参数 -p 用于创建多级文件夹。

rm 命令

格式: rm [选项] 文件>

功能:用于删除文件或目录,常用选项-r -f,-r 表示删除目录,也可以用于 删除文件,-f 表示强制删除,不需要确认。删除文件前需保证当前用户对当 前路径有修改的权限。

cp 命令

格式: cp [选项] 文件> 目标文件>

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

b0970820aba0ee0a.png)

rm 命令

格式: rm [选项] 文件>

功能:用于删除文件或目录,常用选项-r -f,-r 表示删除目录,也可以用于 删除文件,-f 表示强制删除,不需要确认。删除文件前需保证当前用户对当 前路径有修改的权限。

cp 命令

格式: cp [选项] 文件> 目标文件>

[外链图片转存中…(img-X1EE4oEf-1714341335185)]
[外链图片转存中…(img-N7QIaWDD-1714341335186)]
[外链图片转存中…(img-PxYmL6Pc-1714341335186)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值