当前位置: 首页 > news >正文

Hadoop面试题及详细答案 110题 (96-105)-- Hadoop性能优化

前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux… 。

前后端面试题-专栏总目录

在这里插入图片描述

文章目录

  • 一、本文面试题目录
      • 96. 如何优化HDFS的读写性能?
      • 97. MapReduce任务的性能优化有哪些方法?(从Map、Shuffle、Reduce阶段分析)
        • **1. Map阶段优化**
        • **2. Shuffle阶段优化**
        • **3. Reduce阶段优化**
      • 98. 如何优化Hadoop集群的资源利用率?
      • 99. 小文件问题对Hadoop的影响是什么?如何解决?(如Hadoop Archive、SequenceFile等)
      • 100. 数据倾斜的原因是什么?如何解决MapReduce中的数据倾斜?
      • 101. 如何优化YARN的资源调度效率?
      • 102. Hadoop集群的网络配置对性能有什么影响?如何优化?
      • 103. 如何调整HDFS的副本数来平衡性能和存储成本?
      • 104. 如何优化Hadoop的JVM参数?
      • 105. 如何通过监控工具发现Hadoop集群的性能瓶颈?
  • 二、110道Hadoop面试题目录列表

一、本文面试题目录

96. 如何优化HDFS的读写性能?

HDFS的读写性能优化需从硬件配置、参数调优、应用设计等多方面入手,核心目标是减少IO瓶颈、提升数据传输效率。

原理说明

  • 读性能优化:减少NameNode压力、提升DataNode数据读取效率、优化客户端缓存。
  • 写性能优化:优化副本写入策略、减少小文件写入、提升网络传输效率。

优化方法

  1. 硬件层面

    • 使用SSD作为DataNode的数据存储介质,提升随机读写速度。
    • 增加NameNode内存,减少元数据访问延迟(元数据常驻内存)。
    • 配置万兆网络,减少节点间数据传输的网络瓶颈。
  2. HDFS参数调优

    • 读优化:
      • dfs.client.read.shortcircuit:开启短路读取(绕过DataNode直接读本地文件,需配置dfs.domain.socket.path)。
      • dfs.replication:合理设置副本数(如冷数据减少副本,降低读时选择压力)。
    • 写优化:
      • dfs.client.block.write.replace-datanode-on-failure.policy:配置副本写入失败时的替换策略(如DEFAULT自动替换)。
      • dfs.datanode.max.transfer.threads:增加DataNode处理并发传输的线程数(默认4096,可根据负载调整)。
  3. 应用层面

    • 避免大量小文件写入(合并为大文件,减少元数据开销)。
    • 读文件时使用FSDataInputStreamseek()定位,避免全量读取。
    • 利用HDFS的append功能(需开启dfs.support.append),减少重复创建文件的开销。

97. MapReduce任务的性能优化有哪些方法?(从Map、Shuffle、Reduce阶段分析)

MapReduce性能优化需针对各阶段的瓶颈(如IO、网络、计算资源)分别优化。

1. Map阶段优化
  • 减少Map任务数量:通过合并小文件(如使用CombineFileInputFormat),减少Map任务数(每个Map任务有启动开销)。
    <!-- 配置CombineFileInputFormat作为输入格式 -->
    <property><name>mapreduce.job.inputformat.class</name><value>org.apache.hadoop.mapreduce.lib.input.CombineFileInputFormat</value>
    </property>
    
  • 增大Map任务内存:若Map函数处理数据量大(如解析大文件),可增加内存避免OOM。
    <property><name>mapreduce.map.memory.mb</name><value>4096</value> <!-- 4GB -->
    </property>
    
  • 本地计算优化:确保Map任务的数据本地化(输入数据在当前节点),减少网络传输(由YARN调度保证)。
2. Shuffle阶段优化

Shuffle是MapReduce的核心瓶颈(涉及大量网络传输和磁盘IO),优化重点如下:

  • 启用Combiner:在Map端对输出数据预聚合,减少Shuffle传输的数据量。
    job.setCombinerClass(WordCountReducer.class); // 复用Reducer作为Combiner
    
  • 调整溢写和合并参数
    • mapreduce.map.sort.spill.percent:溢写阈值(默认0.8,数据达到缓冲区80%时溢写),可降低至0.7减少单次IO量。
    • mapreduce.task.io.sort.mb:Map输出缓冲区大小(默认100MB,可增至200MB提升排序效率)。
  • 压缩Shuffle数据:对Map输出和Reduce输入进行压缩(如Snappy),减少网络传输量。
    <property><name>mapreduce.map.output.compress</name><value>true</value>
    </property>
    <property><name>mapreduce.map.output.compress.codec</name><value>org.apache.hadoop.io.compress.SnappyCodec</value>
    </property>
    
3. Reduce阶段优化
  • 合理设置Reduce任务数:通常为集群CPU核心数的1~2倍,避免过多任务导致资源竞争。
    <property><name>mapreduce.job.reduces</name><value>10</value> <!-- 根据集群规模调整 -->
    </property>
    
  • 增加Reduce内存和CPU:若Reduce处理数据量大,提升资源配置。
    <property><name>mapreduce.reduce.memory.mb</name><value>8192</value>
    </property>
    <property><name>mapreduce.reduce.cpu.vcores</name><value>4</value>
    </property>
    
  • 延迟启动Reduce:配置mapreduce.job.reduce.slowstart.completedmaps(默认0.05),让Reduce在大部分Map完成后启动,避免资源闲置。

98. 如何优化Hadoop集群的资源利用率?

Hadoop集群资源利用率优化需平衡CPU、内存、磁盘、网络等资源,避免资源闲置或竞争。

优化方法

  1. YARN资源配置合理化

    • 根据节点硬件配置(CPU核心数、内存)设置yarn.nodemanager.resource.memory-mbyarn.nodemanager.resource.cpu-vcores,避免资源分配不足或浪费。
    • 配置容器(Container)的最小/最大资源限制(yarn.scheduler.minimum-allocation-mbyarn.scheduler.maximum-allocation-mb),防止小任务占用过多资源。
  2. 调度器优化

    • 选择合适的调度器:多租户场景用Capacity Scheduler,公平共享场景用Fair Scheduler。
    • 配置队列资源占比(如Capacity Scheduler的队列capacity参数),避免资源倾斜。
  3. 任务资源匹配

    • 根据任务类型(CPU密集型/内存密集型)调整资源分配,例如Map任务分配2GB内存,Reduce任务分配4GB内存。
    • 启用资源抢占(如Fair Scheduler的preemption),回收长期闲置的资源。
  4. 集群负载均衡

    • 启用HDFS均衡器(hdfs balancer),避免DataNode存储不均。
    • 配置YARN的节点标签,将任务调度到适合的节点(如将计算任务调度到SSD节点)。

99. 小文件问题对Hadoop的影响是什么?如何解决?(如Hadoop Archive、SequenceFile等)

小文件问题的影响

  • HDFS层面:大量小文件会增加NameNode的元数据存储压力(每个文件元数据约150字节),导致NameNode内存不足,同时降低读写效率(需频繁寻址)。
  • MapReduce层面:每个小文件会启动一个Map任务,导致Map任务数量激增,任务启动和调度开销增大,资源利用率降低。

解决方法

  1. Hadoop Archive(HAR)

    • 原理:将多个小文件打包成一个HAR文件(类似TAR),减少NameNode的元数据条目(HAR文件作为一个目录项),但文件内容仍存储在HDFS上。
    • 操作示例:
      # 创建HAR文件(将/user/data下的小文件打包到/user/archive.har)
      hadoop archive -archiveName archive.har -p /user/data /user# 查看HAR文件内容
      hdfs dfs -ls har:///user/archive.har
      
    • 缺点:HAR文件创建后不可修改,不适合需要频繁更新的场景。
  2. SequenceFile

    • 原理:将小文件按键值对(Key为文件名,Value为文件内容)写入SequenceFile,合并为一个大文件,支持压缩。
    • 代码示例(Java):
      Configuration conf = new Configuration();
      FileSystem fs = FileSystem.get(conf);
      Path outputPath = new Path("/user/sequencefile");
      SequenceFile.Writer writer = SequenceFile.createWriter(conf,SequenceFile.Writer.keyClass(Text.class),SequenceFile.Writer.valueClass(BytesWritable.class),SequenceFile.Writer.path(outputPath)
      );// 写入小文件(key为文件名,value为文件内容)
      Text key = new Text();
      BytesWritable value = new BytesWritable();
      for (String filename : smallFiles) {key.set(filename);byte[] content = readSmallFile(filename); // 读取小文件内容value.set(content, 0, content.length);writer.append(key, value);
      }
      writer.close();
      
    • 优点:支持随机读写,适合需要频繁访问的场景。
  3. CombineFileInputFormat

    • 原理:MapReduce的输入格式优化,将多个小文件合并为一个输入分片(Split),减少Map任务数量。
    • 配置示例:
      job.setInputFormatClass(CombineFileInputFormat.class);
      CombineFileInputFormat.setMaxInputSplitSize(job, 134217728); // 每个Split最大128MB
      
  4. HBase存储

    • 原理:HBase适合存储大量小文件,通过LSM树结构将小文件合并为大的HFile,减少元数据开销。
    • 适用场景:需要随机读写或实时访问的小文件(如日志、图片缩略图)。
  5. Spark或Flink批量处理

    • 原理:使用分布式计算框架的文件合并功能(如Spark的wholeTextFiles读取小文件后合并)。
    • Spark示例:
      val sc = new SparkContext()
      val smallFiles = sc.wholeTextFiles("hdfs:///user/smallfiles") // 读取所有小文件
      smallFiles.saveAsTextFile("hdfs:///user/mergedfile") // 合并为大文件
      

100. 数据倾斜的原因是什么?如何解决MapReduce中的数据倾斜?

数据倾斜的原因
数据倾斜指MapReduce任务中,部分Reduce任务处理的数据量远大于其他任务,导致整体任务耗时被拖长。常见原因包括:

  • 输入数据中存在热点Key(某一Key的记录数占比极高)。
  • 数据分布不均(如某类数据远多于其他类)。
  • 自定义Partitioner逻辑不合理,导致数据分配不均。

解决方法

  1. 预处理数据,消除热点Key

    • 对热点Key进行拆分(如在Key后添加随机后缀),分散到多个Reduce任务,处理后再合并。
    • 示例:将Key user1000 拆分为 user1000_0user1000_1 等,Reduce处理后去掉后缀合并结果。
  2. 使用自定义Partitioner

    • 针对数据分布特点设计Partitioner,避免热点Key集中到单个Reduce。
    • 示例(按Key哈希后取模,分散热点Key):
      public class CustomPartitioner extends Partitioner<Text, IntWritable> {@Overridepublic int getPartition(Text key, IntWritable value, int numPartitions) {String k = key.toString();// 若为热点Key,按随机数分散;否则按哈希分区if (isHotKey(k)) {return new Random().nextInt(numPartitions);} else {return (k.hashCode() & Integer.MAX_VALUE) % numPartitions;}}
      }
      
  3. 增加Reduce任务数量

    • 适当提高Reduce任务数(mapreduce.job.reduces),增加数据分配的粒度,降低单个Reduce的压力。
  4. 启用Combiner减少Shuffle数据量

    • 在Map端对数据预聚合,减少传输到Reduce的数据量,缓解热点Key的处理压力。
  5. 过滤或拆分倾斜数据

    • 对倾斜的Key单独处理(如离线处理热点数据),避免影响整体任务。
    • 示例:将热点Key的数据拆分为小文件,单独启动MapReduce任务处理,再与其他结果合并。
  6. 调整Reduce任务的内存和CPU资源

    • 为处理倾斜数据的Reduce任务分配更多资源(如增加内存),避免OOM或计算超时。

101. 如何优化YARN的资源调度效率?

YARN资源调度效率直接影响集群任务的执行速度和资源利用率,优化需从调度策略、资源配置、任务管理等方面入手。

优化方法

  1. 选择合适的调度器

    • FIFO Scheduler:适用于单用户、任务优先级明确的场景,简单但可能导致资源饥饿。
    • Capacity Scheduler:多租户场景下,通过队列划分资源配额,保证公平性(如为生产队列分配70%资源,测试队列30%)。
    • Fair Scheduler:动态调整资源,确保所有队列/用户公平共享资源,适合共享集群。
  2. 调度参数调优

    • 队列资源配置(以Capacity Scheduler为例):
      <queue name="production"><capacity>70</capacity> <!-- 占总资源70% --><maxCapacity>90</maxCapacity> <!-- 最多使用90%资源 -->
      </queue>
      <queue name="test"><capacity>30</capacity>
      </queue>
      
    • 调度延迟优化
      • yarn.resourcemanager.scheduler.monitor.policies:启用调度监控,及时释放闲置资源。
      • yarn.scheduler.minimum-allocation-mb:减小最小内存分配单位(如1GB),提升资源利用率。
  3. 启用资源抢占

    • 配置Fair Scheduler的抢占机制,回收长期未充分利用的资源(如某队列占用资源超过公平份额且闲置10分钟)。
    <fairScheduler><preemption><enabled>true</enabled><maxWaitingTime>600000</maxWaitingTime> <!-- 等待10分钟后抢占 --></preemption>
    </fairScheduler>
    
  4. 任务资源请求优化

    • 避免任务请求过多资源(如申请16GB内存但实际仅用4GB),通过mapreduce.map.memory.mbmapreduce.reduce.memory.mb合理设置。
    • 启用资源弹性调整(YARN的Dynamic Resource Allocation),根据任务负载自动增减资源。
  5. 节点管理优化

    • 增加NodeManager的容器启动线程(yarn.nodemanager.resourcemanager.connect.max-wait-ms),加快容器启动速度。
    • 配置节点健康检查(yarn.nodemanager.health-checker.script.path),及时排除故障节点,避免任务调度到异常节点。

102. Hadoop集群的网络配置对性能有什么影响?如何优化?

Hadoop集群依赖网络进行节点间通信(如HDFS副本复制、MapReduce Shuffle传输),网络性能直接影响整体集群效率。

网络配置的影响

  • 带宽瓶颈:小带宽会导致数据传输延迟(如Map输出到Reduce的Shuffle阶段),拖慢任务进度。
  • 网络拓扑:不合理的网络拓扑(如跨机架数据传输过多)会增加通信延迟,降低可靠性。
  • 并发连接限制:节点间并发连接数不足会导致任务排队,影响资源利用率。

优化方法

  1. 提升网络带宽

    • 核心节点(如NameNode、ResourceManager)使用万兆以太网,普通DataNode使用千兆以太网,减少带宽瓶颈。
    • 分离管理网络和数据网络(如管理流量走1G网卡,数据流量走10G网卡),避免相互干扰。
  2. 优化网络拓扑

    • 配置Hadoop的网络拓扑脚本(net.topology.script.file.name),让HDFS和YARN感知机架结构,优先在同机架内传输数据(减少跨机架带宽消耗)。
    • 示例拓扑脚本(返回节点所属机架):
      #!/bin/bash
      # 脚本路径:/etc/hadoop/topology.sh
      case $1 innode1) echo "/rack1";;node2) echo "/rack1";;node3) echo "/rack2";;*) echo "/default-rack";;
      esac
      
    • 配置HDFS使用拓扑信息:
      <property><name>net.topology.script.file.name</name><value>/etc/hadoop/topology.sh</value>
      </property>
      
  3. 调整网络参数

    • 增加TCP缓冲区大小(net.ipv4.tcp_memnet.ipv4.tcp_wmem),提升大文件传输效率。
    • 关闭防火墙或配置规则允许Hadoop端口通信(如HDFS的50010、YARN的8088),避免连接阻塞。
  4. 限制并发连接数

    • 配置DataNode的最大传输线程(dfs.datanode.max.transfer.threads,默认4096),避免连接数过多导致节点过载。
    • 限制MapReduce的Shuffle并发连接(mapreduce.reduce.shuffle.parallelcopies,默认5),根据网络负载调整。
  5. 使用网络压缩

    • 对Shuffle数据和HDFS传输数据启用压缩(如Snappy),减少网络传输量。

103. 如何调整HDFS的副本数来平衡性能和存储成本?

HDFS的副本数(dfs.replication)决定了数据的可靠性和存储开销,需根据数据重要性、访问频率和存储成本动态调整。

调整策略

  1. 默认副本数设置

    • 集群默认副本数为3(兼顾可靠性和成本),适用于大部分生产数据。
    • 配置位置:hdfs-site.xml
      <property><name>dfs.replication</name><value>3</value>
      </property>
      
  2. 按数据类型调整

    • 热数据(高频访问):副本数设为3~4,提升读取性能(多副本可并行读取)。
    • 温数据(中频访问):副本数设为2,平衡存储成本和可用性。
    • 冷数据(低频访问):副本数设为1,降低存储成本(如归档数据)。
  3. 按数据重要性调整

    • 核心业务数据(如交易记录):副本数≥3,确保高可靠性。
    • 临时数据(如中间计算结果):副本数=1,减少存储开销。
  4. 调整方法

    • 创建文件时指定副本数
      hdfs dfs -D dfs.replication=2 -put localfile /user/data/
      
    • 修改已有文件的副本数
      hdfs dfs -setrep -w 2 /user/data/file.txt
      # -w:等待副本调整完成
      
    • 通过DistCp批量调整:复制文件时指定副本数
      hadoop distcp -D dfs.replication=1 /user/source /user/dest
      
  5. 结合存储策略

    • 使用HDFS的存储策略(如HotWarmCold),自动管理不同存储介质(SSD、HDD、归档存储)的副本分布,进一步平衡性能和成本。

104. 如何优化Hadoop的JVM参数?

Hadoop组件(如NameNode、DataNode、Map/Reduce任务)运行在JVM上,JVM参数配置直接影响稳定性和性能(如内存溢出、GC耗时过长)。

优化方法

  1. NameNode JVM优化

    • 核心需求:NameNode需存储大量元数据,需足够内存且减少GC停顿。
    • 配置(hadoop-env.sh):
      export HADOOP_NAMENODE_OPTS="-Xms16g -Xmx16g -XX:NewRatio=3 -XX:SurvivorRatio=4 -XX:+UseG1GC"
      # -Xms/-Xmx:堆大小(设为物理内存的50%~70%,避免频繁GC)
      # -XX:NewRatio=3:老年代:新生代=3:1(元数据多为长期存活对象,老年代分配更多空间)
      # -XX:+UseG1GC:使用G1垃圾收集器,适合大堆内存,减少停顿时间
      
  2. DataNode JVM优化

    • 核心需求:DataNode主要处理IO,内存需求较低,但需稳定运行。
    • 配置:
      export HADOOP_DATANODE_OPTS="-Xms4g -Xmx4g -XX:+UseConcMarkSweepGC"
      # CMS收集器:IO密集型场景下,减少GC对IO的影响
      
  3. Map/Reduce任务JVM优化

    • Map任务:通常内存需求较低,重点减少启动开销。
      <property><name>mapreduce.map.java.opts</name><value>-Xms2g -Xmx2g -XX:+UseParallelGC</value><!-- ParallelGC:适合计算密集型,GC效率高 -->
      </property>
      
    • Reduce任务:Shuffle阶段需缓存数据,内存需求较高。
      <property><name>mapreduce.reduce.java.opts</name><value>-Xms4g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200</value><!-- G1GC控制最大停顿时间,避免Reduce任务超时 -->
      </property>
      
  4. 通用JVM优化

    • 启用JVM监控:添加-XX:+PrintGCDetails -XX:+PrintGCTimeStamps,记录GC日志,分析瓶颈。
    • 避免堆内存过大:超过32GB可能触发JVM指针压缩失效(64位模式下),增加内存开销。
    • 设置元空间大小(-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m),避免元空间溢出。

105. 如何通过监控工具发现Hadoop集群的性能瓶颈?

通过监控工具实时跟踪集群指标(如资源使用率、任务进度、IO负载),可快速定位性能瓶颈(如CPU过载、内存不足、网络延迟)。

常用监控工具及指标

  1. Ambari

    • 功能:Hadoop官方推荐的集群管理工具,支持可视化监控、告警和配置管理。
    • 关键指标
      • HDFS:NameNode内存使用率、DataNode磁盘IO、块副本健康状态。
      • YARN:ResourceManager资源使用率(CPU/内存)、队列负载、任务失败率。
      • MapReduce:Map/Reduce任务进度、Shuffle传输速率、GC耗时。
    • 瓶颈发现:通过仪表盘的红色告警(如“DataNode磁盘使用率>90%”)直接定位问题节点。
  2. Ganglia

    • 功能:分布式监控系统,擅长收集集群节点的系统级指标(CPU、内存、网络IO)。
    • 关键指标
      • 节点CPU使用率(若持续>90%,可能存在计算资源瓶颈)。
      • 网络吞吐量(若接近带宽上限,存在网络瓶颈)。
      • 磁盘IOPS(若读写延迟>100ms,可能是磁盘IO瓶颈)。
    • 瓶颈发现:通过趋势图识别异常节点(如某节点网络传输量远高于其他节点)。
  3. Nagios

    • 功能:专注于节点可用性和服务健康监控,支持自定义告警规则。
    • 关键指标
      • 服务状态(NameNode/ResourceManager是否存活)。
      • 端口连通性(如DataNode的50010端口是否正常)。
      • 磁盘空间(HDFS数据目录剩余空间)。
    • 瓶颈发现:通过邮件/SMS告警(如“NameNode磁盘空间不足”)及时发现故障。
  4. Hadoop自带工具

    • jps/jstat:查看JVM进程状态和GC情况(如jstat -gc <PID> 1000监控Map任务GC频率)。
    • hdfs dfsadmin -report:查看HDFS集群状态(如副本缺失、DataNode离线)。
    • yarn top:实时查看YARN任务资源使用(如某Reduce任务内存使用率>95%,可能内存不足)。
  5. 日志分析

    • HDFS日志(${HADOOP_LOG_DIR}/hadoop-hdfs-namenode-<host>.log):查找“BlockMissingException”(副本丢失)、“OutOfMemoryError”(内存瓶颈)。
    • MapReduce日志(${HADOOP_LOG_DIR}/userlogs/<application_id>/):分析任务失败原因(如“Shuffle error”可能是网络问题)。

瓶颈定位流程
6. 用Ambari确认业务指标异常(如MapReduce任务耗时过长)。
7. 用Ganglia检查对应节点的系统资源(CPU/内存/网络)。
8. 结合Hadoop日志分析具体组件(如Shuffle阶段慢是因网络还是GC)。
9. 通过Nagios确认无服务故障,排除硬件问题。

二、110道Hadoop面试题目录列表

文章序号Hadoop面试题110道
1Hadoop面试题及详细答案110道(01-15)
2Hadoop面试题及详细答案110道(16-35)
3Hadoop面试题及详细答案110道(36-55)
4Hadoop面试题及详细答案110道(56-70)
5Hadoop面试题及详细答案110道(71-85)
6Hadoop面试题及详细答案110道(86-95)
7Hadoop面试题及详细答案110道(96-105)
8Hadoop面试题及详细答案110道(106-110)
http://www.dtcms.com/a/486034.html

相关文章:

  • 监控系统理论与实践:从认知到Zabbix入门
  • ROS 传感器模块的通用架构设计与跨中间件扩展实践
  • 措美网站建设游戏网站开发名字
  • openwrt 环境安装
  • iis 发布网站内部服务器错误东莞沙田门户网站建设
  • 订单 API 接口调试常见问题排查:3 类高频问题 + 落地解决方案
  • JavaWeb--使用JDBC操作数据库(一)
  • 【Web开发】待办事项列表
  • Linux IIO研究(二)
  • 浙江建设厅网站那三类人员爱给网官网免费素材
  • Spring Boot整合Apache Shiro权限认证框架(实战篇)
  • Rust 错误处理
  • 【在 Windows 上运行 Apache Hadoop 或 Spark/GeoTrellis 涉及 HDFS 】
  • Linux操作系统-命令行参数及环境变量
  • 系统架构设计师备考第40天——软件可靠性基础
  • RAG 问题处理系统架构解析:企业级智能问答QuestionsProcessor.py的工程实现
  • LlamaIndex多模态RAG开发实现详解
  • springboot实现微信小程序支付(服务商和普通商户模式)
  • 石景山网站建设好的公司有特色的企业网站
  • 个人建网站怎么赚钱网站一般用什么数据库
  • 【机器学习03】学习率与特征工程、多项式回归、逻辑回归
  • PyTorch解析使用张量与动态计算图实现深度学习模型的高效训练
  • 大二java学习笔记:二维数组
  • 缓存行Cache Line
  • 10-机器学习与大模型开发数学教程-第1章 1-2 O(n) 表示法与时间复杂度
  • toLua[六] Examples 05_LuaCoroutine分析
  • keil5使用STlink下载程序到stm32后不自动运行的解决办法
  • stm32大项目阶段20251015
  • 机器学习四范式(有监督、无监督、强化学习、半监督学习)
  • 源码分析 golang bigcache 高性能无 GC 开销的缓存设计实现