hdfs

本文探讨了大数据的基本概念,4V特性,涵盖了Hadoop生态系统的组成部分,如HDFS、Hive、Spark等,以及它们在企业中的工作流程,包括数据来源、采集、存储、清洗、分析和展示。重点介绍了Hadoop与云计算、物联网的关系,以及HDFS的使用和优化技巧。
摘要由CSDN通过智能技术生成

1.大数据的初了解

1.概念总结:拥有海量数据,具有高增长率、数据类型多样化、一定时间内无法使用常规软件工具进行捕捉、 管理和处理的数据集合。

2.特征:(4v)

  • 1.巨大的数据量(Volume)
  • 2.数据类型多样化(Variety)
  • 3.增长速度快(Velocity)
  • 4.价值密度低(Value)

3.大数据的应用场景:
-记录已经发生的一切
-描述正在发生的一切
-预测将要发生的一切
注:大数据技术的战略意义不在于掌握庞大的数据信息,而在于对这些含有意义的数据进行专业化处理。

例如:、
OFO故障告警
星期天,我扫一UFO,刚扫完… 一黄框蹦跶出来,温馨提示:“编号***车16人已上报维修,左侧脚踏板可能已坏,建议您换一辆,以免影响您行程”, 差点影响俺见富婆的速度,点赞赞赞

尿不湿与啤酒的故事
- 周末,已婚小明来到全球零售巨头沃尔玛,溜达溜达,买打啤酒
- 咦,还有尿不湿,顺便给娃带包尿不湿
- 强大数据分析发现,买啤酒的很多还买尿不湿。从此,啤酒+尿不湿组合卖,销量果真与日俱增
- 这就是啤酒+尿不湿的故事
- 由于受启发,于是有了红酒+??

4.企业中大数据的一般工作流程

  • 1.数据源
    来源内容
    • 关系型数据库
      各种关系表,如订单表,账号表,基本信息表
    • 日志文件
      用户行为数据
      浏览了哪些页面
    • 三方数据
      第三方的接口提供数据
      爬虫等
  • 2.数据采集或者同步
    sqoop、flume、kafka
  • 3.数据存储
    HDFS、HBase、ES
  • 4.数据清洗
    MapReduce、Hive(ETL)、SparkCore、sparksql等
  • 5.数据分析
    MapReduce、Hive、SparkSQL、impala、kylin
  • 6.数据展示
    metastore、Javaweb、hcharts、echarts

5.大数据与云计算和物联网之间的关系
云计算的概念:云计算是以虚拟技术为核心,进行统一管理硬件设施,平台、软件等;它通过网络提供了可伸缩的、廉价的分布式计算能力;它用出租的方式提供给用户,用户只要花低价,在具备网络接入条件的地方,就可以随时随地获得所需的各种IT资源;类似于国家统一管理水,电,煤气等等。
物联网的概念:物联网是物物相连的互联网,是互联网的延伸,它利用局部网络或互联网等通信技术把传感器、控制器、机器、人员和物等通过新的方式连在一起,形成人与物、物与物相连,实现信息化和远程管理控制。

这三者都代表了IT领域最新的技术发展趋势,三者既有区别又有联系。从云计算和大数据概念的诞生到现在,二者之间的关系非常微妙,既密不可分,又千差万别。因此,不能把云计算和大数据割裂开来作为截然不同的两类技术来看待。此外,物联网也是和云计算、大数据相伴相生的技术。
而三者的区别就在于:
-大数据侧重于对于海量数据的存储、处理与分析,从海量数据中发现价值,服务于生产和生活。
-云计算本质上旨在整合和优化各种IT资源并通过网络以服务的方式,廉价地提供给用户
-物联网的发展目标是实现物物相连,应用创建是物联网发展的核心
从整体上看,大数据、云计算和物联网这三者是相辅相成的:物联网的传感器源源不断的产生的大量数据,构成了大数据的重要数据来源,没有物联网的飞速发展,就不会带来数据产生方式的变革,即由人工产生阶段转向自动产生阶段,大数据时代也不会这么快到来。同时,物联网需要借助于云计算和大数据技术,实现物联网大数据的存储、分析和处理。

2.Hadoop概述

2.1hadoop的生态系统(所用技术解释)

在这里插入图片描述

  • Hbase

    是一个可扩展的分布式数据库,支持大型表格的结构化数据存储。 HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一不同的是HBase基于列的,而不是基于行的模式。

  • Hive

    数据仓库基础架构,提供数据汇总和临时查询,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。Hive提供的是一种结构化数据的机制,定义了类似于传统关系数据库中的类SQL语言:Hive QL,通过该查询语言,数据分析人员可以很方便地运行数据分析业务。

  • Spark

    Hadoop数据的快速和通用计算引擎。 Spark提供了一个简单而富有表现力的编程模型,支持广泛的应用程序,包括ETL,机器学习,流处理和图计算。

  • ZooKeeper

    一个面向分布式应用程序的高性能协调服务,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

  • Sqoop(数据ETL/同步工具)

    Sqoop是SQL-to-Hadoop的缩写,主要用于传统数据库和Hadoop之前传输数据。数据的导入和导出本质上是Mapreduce程序,充分利用了MR的并行化和容错性。

  • Flume(日志收集工具)

    Cloudera开源的日志收集系统,具有分布式、高可靠、高容错、易于定制和扩展的特点。它将数据从产生、传输、处理并最终写入目标的路径的过程抽象为数据流,在具体的数据流中,数据源支持在Flume中定制数据发送方,从而支持收集各种不同协议数据。同时,Flume数据流提供对日志数据进行简单处理的能力,如过滤、格式转换等。

  • Kafka(分布式消息队列)

    Kafka是Linkedin于2010年12月份开源的消息系统,它主要用于处理活跃的流式数据。这些数据包括网站的pv、用户访问了什么内容,搜索了什么内容等。这些数据通常以日志的形式记录下来,然后每隔一段时间进行一次统计处理。

  • Ambari

    用于供应,管理和监控Apache Hadoop集群的基于Web的工具。Ambari目前已支持大多数Hadoop组件,包括HDFS、MapReduce、Hive、Pig、 Hbase、Zookeper、Sqoop和Hcatalog等。Ambari还提供了一个用于查看集群健康状况的仪表板,例如热图以及可视化查看MapReduce,Pig和Hive应用程序的功能以及用于诊断其性能特征的功能,以方便用户使用。

  • Avro

    数据序列化系统。可以将数据结构或者对象转换成便于存储和传输的格式,其设计目标是用于支持数据密集型应用,适合大规模数据的存储与交换。Avro提供了丰富的数据结构类型、快速可压缩的二进制数据格式、存储持久性数据的文件集、远程调用RPC和简单动态语言集成等功能。

  • Cassandra

    可扩展的多主数据库,没有单点故障。是一套开源分布式NoSQL数据库系统。

  • Chukwa

    于管理大型分布式系统的数据收集系统(2000+以上的节点, 系统每天产生的监控数据量在T级别)。它构建在Hadoop的HDFS和MapReduce基础之上,继承了Hadoop的可伸缩性和鲁棒性。Chukwa包含一个强大和灵活的工具集,提供了数据的生成、收集、排序、去重、分析和展示等一系列功能,是Hadoop使用者、集群运营人员和管理人员的必备工具。

  • Mahout

    Apache旗下的一个开源项目,可扩展的机器学习和数据挖掘库

  • Pig

    用于并行计算的高级数据流语言和执行框架。它简化了使用Hadoop进行数据分析的要求,提供了一个高层次的、面向领域的抽象语言:Pig Latin。

  • Tez

    一个基于Hadoop YARN的通用数据流编程框架,它提供了一个强大而灵活的引擎,可执行任意DAG任务来处理批处理和交互式用例的数据Hado™生态系统中的Hive™,Pig™和其他框架以及其他商业软件(例如ETL工具)正在采用Tez,以替代Hadoop™MapReduce作为底层执行引擎。

  • Oozie(工作流调度器)

    一个可扩展的工作体系,集成于Hadoop的堆栈,用于协调多个MapReduce作业的执行。它能够管理一个复杂的系统,基于外部事件来执行,外部事件包括数据的定时和数据的出现。

  • Pig(ad-hoc脚本)

    由yahoo!开源,设计动机是提供一种基于MapReduce的ad-hoc(计算在query时发生)数据分析工具,通常用于进行离线分析。它定义了一种数据流语言—Pig Latin,它是MapReduce编程的复杂性的抽象,Pig平台包括运行环境和用于分析Hadoop数据集的脚本语言(Pig Latin)。

3.全分布式、伪分布式、单机

2.集群搭建
暂无,后期整理

1.比较全分布式,单机,伪分布式区别

从数据存储的形式区分:分布式文件系统和本地系统

单机:没有分布式的概念,存储在本地系统,所有的节点都存放在一台主机上,用于测试

伪分布式:有分布式概念,数据存储在分布式系统,所有的节点都存放在一台主机上,拥有集群所有的节点,都处于一台主机,用于测试,测试集群的结构

全分布式:有分布式概念,数据存储在分布式系统,拥有集群所有的节点,分别处于不同的主机,用于生产

2.启动脚本和关闭脚本介绍

  1. 启动脚本
    – start-dfs.sh 用于启动hdfs集群的脚本
    – start-yarn.sh 用于启动yarn守护进程
    – start-all.sh 用于启动hdfs和yarn

  2. 关闭脚本
    – stop-dfs.sh 用于关闭hdfs集群的脚本
    – stop-yarn.sh 用于关闭yarn守护进程
    – stop-all.sh 用于关闭hdfs和yarn

  3. 单个守护进程脚本
    – hadoop-daemons.sh 用于单独启动或关闭hdfs的某一个守护进程的脚本
    – hadoop-daemon.sh 用于单独启动或关闭hdfs的某一个守护进程的脚本
    reg:
    hadoop-daemon.sh [start|stop]
    [namenode|datanode|secondarynamenode]

-- yarn-daemons.sh 	用于单独启动或关闭hdfs的某一个守护进程的脚本 
-- yarn-daemon.sh 		用于单独启动或关闭hdfs的某一个守护进程的脚本 
      	reg: 
      		yarn-daemon.sh  {start|stop}[resourcemanager|nodemanager]

4.集群守护进程不能开启的情况

  1. 格式化集群时,报错原因
    - 当前用户使用不当
    - /etc/hosts里的映射关系填写错误
    - 免密登录认证异常
    - jdk环境变量配置错误
    - 防火墙没有关闭
  2. namenode进程没有启动的原因:
    - 当前用户使用不当
    - 重新格式化时,忘记删除 h a d o o p . t m p . d i r 目 录 下 的 内 容 − 网 络 震 荡 , 造 成 e d i t 日 志 文 件 的 事 务 I D 序 号 不 连 续 3. d a t a n o d e 出 现 问 题 的 原 因 − / e t c / h o s t s 里 的 映 − / e t c / h o s t s 里 的 映 射 关 系 填 写 错 误 − 免 密 登 录 异 常 − 重 新 格 式 化 时 , 忘 记 删 除 {hadoop.tmp.dir}目录下的内容 - 网络震荡,造成edit日志文件的事务ID序号不连续 3.datanode出现问题的原因 - /etc/hosts里的映 - /etc/hosts里的映射关系填写错误 - 免密登录异常 - 重新格式化时,忘记删除 hadoop.tmp.direditID3.datanode/etc/hosts/etc/hosts{hadoop.tmp.dir}目录下的内容,造成datanode的唯一 标识符不在新集群中。
    4.上述问题暴力解决办法:重新格式化
    如果想重新格式化,那么需要先删除每台机器上的${hadoop.tmp.dir}指定路径下的所 有内容,然后再格式化:最好也把logs目录下的内容也清空,因为日志内容已经是前一个废弃集群的日志信息了,留着也无用。

4.HDFS的shell操作

HDFS其实就是一个分布式的文件系统,我们可以使用一些命令来操作这个分布式文件系统上的文件。
- 访问HDFS的命令:
hadoop dfs — 已过时
hadoop fs – 使用范围更大
hdfs dfs --范围相对较小
hadoop fs 和 hdfs dfs之间没有太大的区别
- 小技巧
1. 在命令行中输入hdfs,回车后,就会提示hdfs后可以使用哪些命令,其中有一个是dfs。
2. 在命令行中输入hdfs dfs,回车后,就会提示dfs后可以添加的一些常用shell命令。
- 注意事项 分布式文件系统的路径在命令行中,要从/开始写,即绝对路径。

1.创建目录 

	[-mkdir [-p] <path> ...]    #在分布式文件系统上创建目录 -p,多层级创建  

2.上传指令

    	[-put [-f][-p] [-l] <localsrc> ... <dst>] #将本地文件系统的文件上传到分布式文件系统

3.查看指令
    [-ls [-d][-h] [-R][ ...]] 	\#查看分布式文件系统的目录里内容 	调用格式:hdfs dfs -ls / 
    [-cat [-ignoreCrc] <src> ...] 	\#查看分布式文件系统的文件内容 		调用格式:hdfs dfs -cat /xxx.txt 
    [-tail [-f] <file>] 	\#查看分布式文件 	系统的文件内容 	调用格式:hdfs dfs -tail /xxx.txt 

注意:默认最多查看1000行

4.下载指令 

[-copyToLocal [-p][-ignoreCrc] [-crc] <src> ... <localdst>] 		注意:本地路径的文件夹可以不存在 

[-moveToLocal <src> <localdst>] 		注意:从hdfs的某个路径将数据剪切到本地,已经被遗弃了 

[-get [-p][-ignoreCrc] [-crc] <src> ... <localdst>] 		调用格式:同copyToLocal

5.删除命令

[-rm [-f][-r|-R] [-skipTrash] <src> ...] 		注意:如果删除文件夹需要加-r 

[-rmdir [--ignore-fail-on-non-empty] <dir> ...] 		注意:必须是空文件夹,如果非空必须使用rm删除 

6.查看磁盘利用率和文件大小 

[-df [-h][ ...]] 		查看分布式系统的磁盘使用情况 

[-du [-s][-h] <path> ...] 		\#查看分布式系统上当前路径下文件的情况 

-h: 		human 以人类可读的方式显示 

7.向分布式文件系统中的文件里追加内容 

[-appendToFile <localsrc> ... <dst>] 		调用格式:hdfs dfs -appendToFile 本地文件 hdfs上的文件 

注意:不支持在中间随意增删改操作

8.修改权限的 

跟本地的操作一致,-R是让子目录或文件也进行相应的修改 

[-chgrp [-R] GROUP PATH...] 

[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...] 

[-chown [-R][OWNER][:[GROUP]] PATH...] 

9.修改文件的副本数 

[-setrep [-R][-w] <rep> <path> ...] 		调用格式:hadoop fs -setrep 3 / 将hdfs根目录及子目录下的内容设置成3个副本 

注意:当设置的副本数量与初始化时默认的副本数量不一致时,集群会作出反应,比原来多了会自动进行复制. 

10.查看文件的状态

hdfs dfs [generic options] -stat [format] <path> ... 

命令的作用:当向hdfs上写文件时,可以通过dfs.blocksize配置项来设置文件的block的大小。 

这就导致了hdfs上的不同的文件block的大小是不相同的。有时候想知道hdfs上某个文件的block 

大小,可以预先估算一下计算的task的个数。stat的意义:可以查看文件的一些属性。 

调用格式:hdfs dfs -stat [format] 文件路径 

format的形式: 

%b:打印文件的大小(目录大小为0) 

%n:打印文件名 

%o:打印block的size 

%r:打印副本数 

%y:utc时间 yyyy-MM-dd HH:mm:ss 

%Y:打印自1970年1月1日以来的utc的微秒数 

%F:目录打印directory,文件打印regular file 

注意: 

1)当使用-stat命令但不指定format时,只打印创建时间,相当于%y 

2)-stat 后面只跟目录,%r,%o等打印的都是0,只有文件才有副本和大小 

11.测试

hdfs dfs [generic options] -test -[defsz] <path> 

参数说明: -e:文件是否存在 存在返回0 -z:文件是否为空 为空返回0 -d:是否是路径(目录) ,是返回0 

调用格式:hdfs dfs -test -d 文件 

实例:hdfs dfs -test -d /shelldata/111.txt && echo "OK" || echo "no" 

解释:测试当前的内容是否是文件夹 ,如果是返回ok,如果不是返回no 

12.创建空文件

hdfs dfs [generic options] -touchz <path> ... 

调用格式:hdfs dfs touchz /hadooptest.txt

13.显示当前文件夹及子文件夹的数量 

hdfs dfs [generic options] -count [-q][-h] <path> ... 

调用格式:hdfs dfs -count /hadoop 

14.合并下载

hdfs dfs [generic options] -getmerge [-nl] <src> <localdst> 

调用格式:hdfs dfs -getmerge hdfs上面的路径 本地的路径 

实例:hdfs dfs -getmerge /hadoopdata/*.xml /root/test.test

15.移动hdfs中的文件(更名) 

hdfs dfds [generic options] -mv <src> ... <dst> 

调用格式:hdfs dfs -mv /hdfs的路径1 /hdfs的另一个路径2 

实例:hfds dfs -mv /aaa /bbb 这里是将aaa整体移动到bbb中 

16.复制hdfs中的文件到hdfs的另一个目录 "

hdfs dfs [generic options] -cp [-f][-p | -p[topax]] <src> ... <dst> 

调用格式:hdfs dfs -cp /hdfs路径_1 /hdfs路径_2 

5.HDFS块儿认识

  1. 传统型分布式文件系统的缺点
    现在想象一下这种情况:有四个文件 0.5TB的file1,1.2TB的file2,50GB的file3,100GB的file4;有7个服务器,每个服务器上有10个1TB的硬盘。

在这里插入图片描述
在存储方式上,我们可以将这四个文件存储在同一个服务器上(当然大于1TB的文件需要切分),我们需要使用一个文件来记录这种存储的映射关系吧。用户是可以通过这种映射关系来找到节点硬盘相应的文件的。那么缺点也就暴露了出来:
第一、负载不均衡。

因为文件大小不一致,势必会导致有的节点磁盘的利用率高,有的节点磁盘利用率低。

第二、网络瓶颈问题。

一个过大的文件存储在一个节点磁盘上,当有并行处理时,每个线程都需要从这个节点磁盘上读取 这个文件的内容,那么就会出现网络瓶颈,不利于分布式的数据处理。

  1. HDFS的块
    HDFS与其他普通文件系统一样,同样引入了块(Block)的概念,并且块的大小是固定的。但是不像普通文件系统那样小,而是根据实际需求可以自定义的。块是HDFS系统当中的最小存储单位,在hadoop2.0中默认大小为128MB(hadoop1.x中的块大小为64M)。在HDFS上的文件会被拆分成多个块,每个块作为独立的单元进行存储。多个块存放在不同的DataNode上,整个过程中 HDFS系统会保证一个块存储在一个数据节点上 。但值得注意的是,如果某文件大小或者文件的最后一个块没有到达128M,则不会占据整个块空间 。
    我们来看看HDFS的设计思想:以下图为例,来进行解释。

在这里插入图片描述
3. HDFS的块大小
HDFS上的块大小为什么会远远大于传统文件?

  1. 目的是为了最小化寻址开销时间。
    在I/O开销中,机械硬盘的寻址时间是最耗时的部分,一旦找到第一条记录,剩下的顺 序读取效率是非常高的,因此以块为单位读写数据,可以尽量减少总的磁盘寻道时间。
    HDFS寻址开销不仅包括磁盘寻道开销,还包括数据块的定位开销,当客户端需要访问一 个文件时,首先从名称节点获取组成这个文件的数据块的位置列表,然后根据位置列表获取实际存 储各个数据块的数据节点的位置,最后,数据节点根据数据块信息在本地Linux文件系统中找到对 应的文件,并把数据返回给客户端,设计成一个比较大的块,可以减少每个块儿中数据的总的寻址 开销,相对降低了单位数据的寻址开销
    磁盘的寻址时间为大约在5~15ms之间,平均值为10ms,而最小化寻址开销时间普遍认为 占1秒的百分之一是最优的,那么块大小的选择就参考1秒钟的传输速度,比如2010年硬盘的传输 速率是100M/s,那么就选择块大小为128M。
    2.为了节省内存的使用率
    一个块的元数据大约150个字节。1亿个块,不论大小,都会占用20G左右的内存。因此 块越大,集群相对存储的数据就越多。所以暴漏了HDFS的一个缺点,不适合存储小文件。

不适合存储小文件解释:
1. 从存储能力出发(固定内存)
因为HDFS的文件是以块为单位存储的,且如果文件大小不到128M的时候,是不会占用整个块的 空间的。但是,这个块依然会在内存中占用150个字节的元数据。因此,同样的内存占用的情况 下,大量的小文件会导致集群的存储能力不足。
例如: 同样是128G的内存,最多可存储9.2亿个块。如果都是小文件,例如1M,则集群存储的 数据大小为9.2亿1M = 877TB的数据。但是如果存储的都是128M的文件,则集群存储的数据大小 为109.6PB的数据。存储能力大不相同.
2.从内存占用出发(固定存储能力)
同样假设存储1M和128M的文件对比,同样存储1PB的数据,如果是1M的小文件存储,占用的内 存空间为1PB/1Mb
150Byte = 150G的内存。如果存储的是128M的文件存储,占用的内存空间为 1PB/128M*150Byte = 1.17G的内存占用。可以看到,同样存储1PB的数据,小文件的存储比起大 文件占用更多的内存。

  1. 块的存储位置
    在 hdfs-site.xml 中我们配置过下面这个属性,这个属性的值就是块在linux系统上的存储位置
<!-- 确定DFS数据节点应该将其块存储在本地文件系统的何处--> 
<property> 
	<name>dfs.datanode.data.dir</name>
	<value>file://${hadoop.tmp.dir}/dfs/data</value> 
</property>
  1. HDFS的优点

    1. 高容错性(硬件故障是常态):数据自动保存多个副本,副本丢失后,会自动恢复
    2. 适合大数据集:GB、TB、甚至PB级数据、千万规模以上的文件数量,1000以上节点规模。
    3. 数据访问: 一次性写入,多次读取;保证数据一致性,安全性
    4. 构建成本低:可以构建在廉价机器上。
    5. 多种软硬件平台中的可移植性
    6. 高效性:Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度 非常快。
    7. 高可靠性:Hadoop的存储和处理数据的能力值得人们信赖.
  2. HDFS的缺点

    1. 不适合做低延迟数据访问:
      HDFS的设计目标有一点是:处理大型数据集,高吞吐率。这一点势必要以高延迟为代价 的。因此HDFS不适合处理用户要求的毫秒级的低延迟应用请求
    2. 不适合小文件存取:
      一个是大量小文件需要消耗大量的寻址时间,违反了HDFS的尽可能减少寻址时间比例的 设计目标。第二个是内存有限,一个block元数据大内存消耗大约为150个字节,存储一亿个block 和存储一亿个小文件都会消耗20G内存。因此相对来说,大文件更省内存。
    3. 不适合并发写入,文件随机修改:
      HDFS上的文件只能拥有一个写者,仅仅支持append操作。不支持多用户对同一个文件 的写操作,以及在文件任意位置进行修改
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值