| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> Hadoop介绍 -> 正文阅读 |
|
[大数据]Hadoop介绍 |
目录 1 Hadoop简介1.1什么是大数据????????大数据(Big Data),指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。 ????????一种规模大到在获取、存储、管理、分析方面大大超出了传统数据库软件工具能力范围的数据集合,具有海量的数据规模、快速的数据流转、多样的数据类型和价值密度低四大特征。大数据包括结构化、半结构化和非结构化数据,非结构化数据越来越成为数据的主要部分。 ????????具体来说,比如电商网站的用户浏览行为记录、购买行为记录,社交网站的用户行为数据记录、用户关系数据,通信行业的用户通信行为记录、上网行为记录,APP应用的用户行为数据,交通部门的海量探测数据、路况监控数据,政府部门的民生数据,舆情数据等,由于用户基数大,因而形成的数据动辄日增数百T甚至P级别数据,这些都是真实、物化、具体的大数据。 1.2什么是大数据技术????????处理数据需要技术,而在处理规模不同的数据集时,就算处理需求一致,由于存储难度不同,计算难度不同,所使用的技术也不同。在进行大规模数据处理时,需要解决的两个核心问题是: ????????1、数据存储 ????????由于大数据动辄好几百T,甚至上P级别,如果用一个单机文件系统或者一个单机数据库,都无法胜任。因此,在大数据技术体系中,一般都是采用分布式存储:将数据(文件)分散到一个集群上的N多台机器上存储。 ????????2、数据运算 ????????什么叫运算?比如,某大型电商网站有大量的用户浏览行为记录,需要从这些记录日志中分析出以下信息: ????????最热门的Top N个商品; ????????用户浏览网站的平均深度; ????????用户浏览商品时的路径; ????????这些数据分析需求,最终都需要转化成运算程序来实现。而在海量数据的场景下,单机资源(无论是CPU,还是内存)配置到极限,也无法在合理的限定时间内运算出结果,所以,在大数据技术体系下,数据运算主要通过运算资源(计算节点)的水平扩展来实现,即使用分布式集群运算系统。 1.3Hadoop简介????????Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。 ????????Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。 ????????HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。 ????????Hadoop的框架最核心的设计就是:HDFS,MapReduce,Yarn。HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算,Yarn进行集群资源调度。其中Hadoop的系统架构图如图1-1所示。 图1-1 Hadoop2.0系统架构图 2.HDFS分布式文件系统2.1 HDFS分布式文件系统????????当数据集的大小超过一台独立的物理计算机的存储能力时,就有必要对他进行分区并存储到若干台单独的计算机上管理网络中跨多台计算机存储的文件,系统称为分布式文件系统。 ????????HDFS就是Hadoop技术体系中用来将文件存储在多台服务器上的分布式文件系统。 ????????HDFS的优点主要有几下点: ????????1.适合运行在通用硬件(commodity hardware)上。 ????????2.HDFS是一个高度容错性的系统,适合部署在廉价的机器上。 ????????3.HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。 ????????4.HDFS放宽了一部分POSIX约束,来实现流式读取文件系统数据的目的。 2.2 HDFS的设计目标????????(1)硬件错误 ????????硬件错误是常态而不是异常。HDFS可能由成百上千的服务器所构成,每个服务器上存储着文件系统的部分数据。因此构成系统的组件数目是巨大的,而且任一组件都有可能失效,这意味着总是有一部分HDFS的组件是不工作的。因此错误检测和快速、自动的恢复是HDFS最核心的架构目标。 ????????(2)流式数据访问 ????????运行在HDFS上的应用和普通的应用不同,需要流式访问它们的数据集。HDFS的设计中更多的考虑到了数据批处理,而不是用户交互处理。比之数据访问的低延迟问题,更关键的在于数据访问的高吞吐量。POSIX标准设置的很多硬性约束对HDFS应用系统不是必需的。为了提高数据的吞吐量,在一些关键方面对POSIX的语义做了一些修改。 ????????(3)大规模数据集 ????????运行在HDFS上的应用具有很大的数据集。HDFS上的一个典型文件大小一般都在G字节至T字节。因此,HDFS被调节以支持大文件存储。它应该能提供整体上高的数据传输带宽,能在一个集群里扩展到数百个节点。一个单一的HDFS实例应该能支撑数以千万计的文件。 ????????(4)简单的一致性模型 ????????HDFS应用需要一个“一次写入多次读取”的文件访问模型。一个文件经过创建、写入和关闭之后就不需要改变。这一假设简化了数据一致性问题,并且使高吞吐量的数据访问成为可能。Map/Reduce应用或者网络爬虫应用都非常适合这个模型。 ????????(5)“移动计算比移动数据更划算” ????????一个应用请求的计算,离它操作的数据越近就越高效,尤其是在数据达到海量级别的时候。因为这样就能降低网络阻塞的影响,提高系统数据的吞吐量。将计算移动到数据附近,比将数据移动到应用所在显然更好。HDFS为应用提供了将它们自己移动到数据附近的接口。 ????????(6)异构软硬件平台间的可移植性 ????????HDFS在设计的时候就考虑到平台的可移植性。这种特性方便了HDFS作为大规模数据应用平台的推广。 2.3 namenode和datanode????????HDFS采用master/slave架构。HDFS结构如图2-1所示。一个HDFS集群是由一个namenode(管理节点)和一定数目的datanode(工作节点)组成。 ????????namenode是一个中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。 ????????datanode是文件系统的工作节点,一般是一个节点一个,负责管理它所在节点上的存储(受客户端或namenode调度),并且定期向namenode发送它们所存储的数据列表。 ?图2-1 HDFS架构 ????????用户能够以文件的形式在上面存储数据。从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组Datanode上。Namenode执行文件系统的命名空间操作,比如打开、关闭、重命名文件或目录。它也负责确定数据块到具体Datanode节点的映射。Datanode负责处理文件系统客户端的读写请求。在Namenode的统一调度下进行数据块的创建、删除和复制。? 2.4 文件系统的命名空间HDFS支持传统的层次型文件组织结构。用户或者应用程序可以创建目录,然后将文件保存在这些目录里。 文件系统命名空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。 2.5数据流2.5.1 HDFS写入数据????????HDFS写入数据流程为: ????????1.客户端调用Distributed FileSystem对象调用create()来新建文件。 ????????2.Distributed FileSystem对namenode创建一个RPC调用,在文件系统的命名空间中新建一个文件,此时该文件还没有对应的数据块。Namenode 执行检查以确保这个文件不存在,并且客户端新建文件的权限。 ????????3.客户端开始写入数据。DFSata InputStream 将它分成一个个的数据包,写入队列。Data Streamer处理数据队列。挑选出适合存储数据副本的一组datanode的。并以此来分配新的数据块. ????????4.Distributed FileSystem等待datanode的确认回复,收到确认信息后,该数据包才会从确认队列中删除。 ????????5.客户端完成写入后调用close方法。 ????????HDFS写入数据的流程图如图2-2所示。 图2-2 HDFS写入数据流程图 2.5.2 HDFS读出数据????????HDFS读出数据流程为: ????????1.客户端调用open()方法打开文件; ?????2.Distributed FileSystem通过调用(RPC)来调用namenode,来确定文件初始块的位置。namenode返回存有该块副本的datanode地址。datanode根据它们与客户端的距离来排序(网络拓扑)。如果该客户机本身就是namenode,则从本地namenode读取数据。 ????????Distributed FileSystem类返回一个FSData InputStream对象(输入流)给客户端用来读取数据。FSData InputStream类转而封装FSData InputStream对象,该对象管理着datanode和namenode的I/O。 ????????3.客户端对这个输入流调用read()方法。 ? ? ? 4.可以将数据从datanode传输到客户端。到达快的末端时,FSDataInputStream关闭与该datanode的连接,然后开始寻找下一个块的最佳datanode(步骤5)。 ????????这些操作对用户来讲都会透明的,在客户看来它一直读取的是一个连续的流。HDFS数据读出的流程图如图2-3所示。 图2-3 HDFS数据读出流程图 2.6数据复制????????HDFS旨在大型集群中的计算机之间可靠地存储非常大的文件。它将每个文件存储为一系列块。复制文件的块是为了容错。块大小和复制因子是每个文件可配置的。???????? ????????文件中除最后一个块外的所有块都具有相同的大小,而在添加了对可变长度块的支持后,用户可以在不填充最后一个块的情况下开始新的块,而不用配置的块大小。 ????????应用程序可以指定文件的副本数。复制因子可以在文件创建时指定,以后可以更改。HDFS中的文件只能写入一次(追加和截断除外),并且在任何时候都只能具有一个写入器。 ????????NameNode做出有关块复制的所有决定。它定期从群集中的每个DataNode接收心跳信号和Blockreport。收到心跳信号表示DataNode正常运行。Blockreport包含DataNode上所有块的列表。 2.7健壮性????????HDFS的主要目标是即使出现故障也能可靠地存储数据。三种常见的故障类型是NameNode故障,DataNode故障和网络分区。 ????????(1)数据磁盘故障,心跳和复制 ????????DataNode定期向NameNode发送心跳消息。网络分区可能导致DataNode失去与NameNode的连接。NameNode通过缺少心跳消息来检测NameNode将没有最近心跳的DataNode标记为dead,并且不会将任何新的IO请求转发给它们。已失效的DataNode的任何数据不再用于HDFS。DataNode死亡可能导致某些块的复制因子降至其指定值以下。NameNode不断跟踪需要复制的块,并在必要时启动复制。 ????????当DataNode可能不可用,副本可能损坏,DataNode上的硬盘可能发生故障等情况发生时。用户可以设置较短的时间间隔以将DataNode标记为过时,并通过配置来避免对性能敏感的工作负载进行读或写时出现过时的节点。 ????????(2)集群再平衡 ????????如果DataNode的可用空间低于某个阈值,则可能会自动将数据从一个DataNode移至另一个DataNode。如果对特定文件的需求突然增加,则可能会动态创建其他副本并重新平衡群集中的数据。 ????????(3)快照 ????????快照支持在特定时间存储数据副本。快照功能的一种用法可能是将损坏的HDFS实例回滚到以前已知的良好时间点。 ????????(4)数据的完整性 ????????由于存储设备故障,网络故障或软件故障,可能导致从DataNode提取的数据块损坏。HDFS客户端对HDFS文件的内容执行校验和检查。客户端创建HDFS文件时,它将计算文件每个块的校验和,并将这些校验和存储在同一HDFS命名空间中隐藏的文件中。客户端检索文件内容时,它将验证从每个DataNode接收的数据是否与存储在namenode中的文件相匹配。如果不是,则客户端可以选择从另一个具有该块副本的DataNode中检索该块。 3 Yarn集群资源管理系统3.1 Yarn的基本思想????????将资源管理和作业调度/监视的功能拆分为单独的守护程序。拥有一个全局的ResourceManager(RM)和每个应用程序的ApplicationMaster(AM)。应用程序可以是单个作业,也可以是集群作业。Yarn的内部结构如图3-1所示。 ????????ResourceManager和NodeManager组成数据计算框架。 ????????ResourceManager具有在系统中所有应用程序之间仲裁资源的最终权限。 ????????NodeManager是每台机器的框架代理,负责容器,监视其资源使用情况(cpu,内存,磁盘,网络),并将其报告给ResourceManager / Scheduler。 ?图3-1 Yarn的内部结构 3.2剖析Yarn应用机制Yarn的应用机制如图3-2所示。 1.客户端联系资源管理器,要求它运行一个application master进程。(步骤1) 2.资源管理器找到一个能够在容器中启动application master的节点管理器。(步骤2a,2b) 3.application master运行之后,可以进行: (1)在所在容器简单运行一个计算,并将结果返回给客户端(步骤3); (2)向资源管理器请求更多的容器,以运行一个分布式计算(步骤4a,4b)。 图3-2 Yarn的内部机制 3.3 Yarn中的调度策略Yarn的调度策略主要分为三种,分别是:FIFO调度器、容器调度器、公平调度器。分别介绍这三种调度策略的优缺点。 1.FIFO调度器:将应用放置在一个队列中,按照任务提交的顺序(先进先出)运行应用。如图3-3左图所示。 优点:简单易懂。 缺点:不适合共享集群。大的应用会占用所有资源,导致小应用一直被阻塞。 2.容量调度器:保留一个独立的队列,保证小作业已提交就可以启动。如图3-3中图所示。 缺点:整个集群的利用率低,大作业的的执行时间长 3.公平调度器:无需预留一定量的资源,调度器会在所有作业之间动态平衡资源。如图3-3右图所示。 作业一启动会获得所有资源,作业二启动会被分配一半资源。使得每个作业都能公平共享资源。 图3-3 Yarn的三种调度策略 4 MapReduce分布式计算模型4.1MapReduce介绍Hadoop MapReduce是一个软件框架,可以轻松地编写应用程序,以可靠,容错的方式并行处理大型硬件集群(数千个节点)上的大量数据(多TB数据集)。 MapReduce框架组成: 一个主资源管理器; 一个集群节点; 一个工作器NodeManager; 每个应用程序ApplicationMaster组成。 应用程序通过适当的接口或抽象类的实现来指定输入/输出位置。 客户端将程序(jar /可执行文件等)和配置文件提交给ResourceManager,然后由ResourceManager负责将软件/配置分发给节点,安排任务并对其进行监视,为工作提供状态和诊断信息。 4.2MapReduce的计算流程图4-1 MapReduce计算流程 ????????MapReduce的计算如4-1所示。从HDFS输入要进行处理的文本文件,分布式下可将一个文本文件中的自然语言处理成多句话同时进行处理,将文本文件的中的自然语言经过mapreduce内部的spilt()函数,将自然语言进行切割处理,切割后的单词或文本输入到map()任务中,将每一个单词都封装成<key,value>键值对的形式,其中key为单词,value为这个单词出现的频率,初始时value值为1;然后经过mapreduce内部的排序组合将分隔后的键值对中的key值进行排序,排序后对相同的单词或文本进行统计,统计后仍以<key,value>的键值对形式,其中key为单词,value为该单词统计后出现的频率。将统计后的键值对输入到reduce()任务中,将统计结果输出。 4.3 实例WordCount源码解析
4.3.1 map()阶段
需要继承 org.apache.hadoop.mapreduce.Mapper 这个类,自定义实现 Map() 方法,其中参数有四个(keyIn、valueIn、keyOut、valueOut),即Map()任务的输入和输出都是< key,value >对的形式。 各参数含义: 1、Object:输入< key, value >对的 key 值,此处为文本数据的起始位置的偏移量。 2、Text:输入< key, value >对的 value 值,此处为一段具体的文本数据。 3、Text:输出< key, value >对的 key 值,此处为一个单词。 4、IntWritable:输出< key, value >对的 value 值,此处固定为 1 。 4.3.2 Reduce()阶段
需要继承import org.apache.hadoop.mapreduce.Reducer这个类,参数也是四个(keyIn、valueIn、keyOut、valueOut),即Reduce()任务的输入和输出都是< key,value >对的形式。 各参数含义: 1、Text:输入< key, value >对的key值,此处为一个单词 2、IntWritable:输入< key, value >对的value值。 3、Text:输出< key, value >对的key值,此处为一个单词 4、IntWritable:输出< key, value >对,此处为相同单词词频累加之后的值。实际上就是一个数字。 4.3.3主函数
5搭建Hadoop单节点环境5.1搭建环境1.支持平台: 支持GNU / Linux作为开发和生产平台。Windows也是受支持的平台,但是以下步骤仅适用于Linux。 2.所需软件 必需安装java,其中每个hadoop守护程序都在单独的java进程中运行。 3.有三种支持的模式可以启动Hadoop集群: (1)本地(独立)模式——方便测试。 (2)伪分布模式——可以在单节点下运行。 (3)全分布模式——集群环境 4.本机的搭建环境:centos7 5.2远程连接工具远程连接工具:使用mobaxterm远程工具进行连接。Mobaxterm工具无需安装,下载后打开运行即可使用。如图5-1、5-2所示。 优点:多种操作界面,支持上传文件。 图 5-1 Mobaxterm远程连接工具(1) 图 5-2 Mobaxterm远程连接工具(2) 5.3 java安装部署hadoop的前提是需要安装java环境。首先进行java环境的安装。 1.下载离线安装包 jdk-8u144-linux-x64.tar.gz 2.解压缩文件夹:# tar zxvf jdk-8u144-linux-x64.tar.gz 3.移动文件夹至/opt/jdk目录下并重命名:# mv jdk1.8.0_144/ /opt/jdk/jdk1.8 4.配置环境变量,编辑/etc/profile文件,使用命令:#vim /etc/profile
5.4 Hadoop安装5.4.1准备工作一、安装包下载 在官网下载:http://www.apache.org/dyn/closer.cgi/hadoop/common/ 1.下载离线安装包 hadoop-2.8.0.tar.gz 2.解压缩文件夹:#tar zxvf hadoop-2.8.0.tar.gz 3.移动文件夹至/opt/hadoop目录下并重命名:# mv hadoop-2.8.0/ /opt/hadoop/hadoop2.8/ 二、设置ssh免密登录,如图5-3所示。
?图5-3 设置SSH免密登录 三、hadoop目录介绍 Hadoop安装目录如图5-4所示。 图5-4 Hadoop安装目录 1.sbin文件: 存放脚本文件。sbin文件如图5-5所示。 ?图5-5 sbin文件目录 ?启动 hdfs:strat-dfs.sh 停止hdfs:stop-dfs.sh 启动yarn:start-yarn.sh 停止yarn:stop-dfs.sh 2./share文件:存放官方提供的demo和jar包。share文件如图5-6所示。 图5-6 share文件目录 ?3../etc/hadoop/文件:存放配置文件。如图5-7所示。 ?图5-7 /etc/hadoop文件目录 5.4.2配置hadoop-env.sh1.配置环境变量,编辑/etc/profile文件,使用命令:#vim /etc/profile
2.使配置文件生效:#source? /etc/profile 3.切换至hadoop的安装目录下:cd /opt/hadoop/hadoop2.8/etc/hadoop 进行如下文件的配置。 4.编辑hadoop-env.sh文件,配置JAVA_HOME的根目录 (1)编辑命令:# vim /opt/hadoop/hadoop2.8/etc/hadoop/hadoop-env.sh (2)文件内容如图5-8所示: 图5-8 hadoop-env.sh文件内容 5.4.3配置core-site.xml编辑core-site.xml文件,配置hadoop存储数据相关参数: (1)编辑命令:#vim /opt/hadoop/hadoop2.8/etc/hadoop/core-site.xml (2)在core-site.xml添加以下内容:
fs.defaultFS为namenode的地址,hadoop.tmp.dir为hadoop临时目录地址。 默认情况下,namenode 和datanode的数据文件都会存在这个目录下的对应子目录。 (3)创建存储文件目录:mkdir -p /app/hadoop/tmp (4)授予权限:chmod 750 /app/hadoop/tmp 5.4.4配置hdfs-site.xml(1)编辑命令:#vim /opt/hadoop/hadoop2.8/etc/hadoop/hdfs-site.xml (2)在Hdfs-site.xml添加以下内容:
(3)创建配置指定目录:mkdir -p /home/hduser_/hdfs (4)授权:chmod 750 /home/hduser_/hdfs 5.4.5配置mapred-site.xml编辑mapred-site.xml配置mapreduce。 (1)复制文件:# cp /opt/hadoop/hadoop2.8/etc/hadoop/mapred-site.xml.template?? /opt/hadoop/hadoop2.8/etc/hadoop/mapred-site.xml (2)编辑命令:# vim /opt/hadoop/hadoop2.8/etc/hadoop/mapred-site.xml (3)在mapred-site.xml添加以下内容:
5.4.6配置yarn-site.xml编辑yarn-site.xml配置yarn (1)编辑命令:# vim /opt/hadoop/hadoop2.8/etc/hadoop/yarn-site.xml (2)在yarn-site.xml添加以下内容:
5.4.7格式化并启动hdfs和yarn一、namenode格式化 (1) cd /opt/hadoop/hadoop2.8/bin (2)./hdfs name -format 只要不报错则初始化成功。启动成功如图5-9所示。 ?图5-9 hdfs启动成功 二、启动&停止hdfs ???? 启动hdfs:start-dfs.sh ???? 停止hdfs:stop-dfs.sh 三、启动&停止yarn ????? 启动yarn: start-yarn.sh? ????? 停止yarn:stop-yarn.sh 四、使用jps查看进程,如图5-10所示。 ?图5-10 jps进程 ?五、查看hdfs web页面http://10.50.28.3:50070/,如图5-11所示。 图5-11 hdfs web页面 ?六、查看yarn web页面:http://10.50.28.3:8088/。如图5-12所示。 ?图5-12 yarn web页面 5.5 hdfs操作命令1.创建一个文件夹?? ?hdfs dfs -mkdir /data 2.创建多个文件夹?? ?hdfs dfs -mkdir -p /data/wordcount 3.上传文件?? hdfs dfs -put /home/qlqtest/wordcount.txt /data/wordcount 4.查看总目录下的文件和文件夹?? hdfs dfs -ls / 5.查看data下的文件和文件夹?? hdfs dfs -ls /data 6.查看data下的wordcount.txt的内容?? hdfs dfs -cat /data/wordcount.txt 7.删除总目录下的data文件夹以及里面的文件和文件夹 hdfs dfs -rmr /data 8.删除data下的wordcount.txt?? hdfs dfs -rmr /data/oytput/wordcount.txt 9.下载hdfs中data/wordcount.txt到本地opt文件夹中 hdfs dfs -get /myTask/input/wordcount.txt /opt 5.6 WordCount测试1.编译WordCount.java并创建一个jar如图5-13所示。 命令:cd /opt/hadoop/hadoop2.8/share/hadoop 图5-13 WordCount.java 或者使用如下命令将程序打包成jar包:
2.在hdfs上新建文件作为输入输出目录。如图5-14所示。
? ?图5-14 新建输入输出文件 3.在本地新建/home/qlqtest/目录存放wordcount.txt测试文件。如图5-15所示。 ?图5-15 新建测试文件目录 wordcount.txt测试内容如图5-16所示: 图5-16 wordcount.txt文本内容 4.使用: hdfs dfs -put /home/qlqtest/wordcount.txt /data/wordcount将wordcount.txt提交至/data/wordcount 5.hdfs web页面:管理hdfs文件。如图5-17所示。 图5-17 hdfs管理界面 6.执行:hadoop jar *.jar 执行文件 /输入目录? /输出目录: hadoop jar hadoop-mapreduce-examples-2.8.0.jar wordcount /data/wordcount? /data/output/wordcount 如图5-18所示。 ?图5-18 wordCount运行 7.WordCount计算结果输出,如图5-19所示。 ? ?图5-19 WordCount 计算结果 6 总结通过学习,了解了hadoop的核心架构:hdfs、Yarn、Mapreduce的内部运行结构和原理。通过搭建了Hadoop的伪分布式下的单节点运行环境,从理论到实践,清晰的了解各个架构的运行机制及使用过程。最后使用WordCount代码进行词频统计测试。 参考资料本课程主要的参考教材是《Hadoop权威指南:大数据的存储与分析 第4版》。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年4日历 | -2025/4/22 4:40:51- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |