尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Hadoop+Spark+Django构建足球数据可视化大屏完整实战
拿这种项目的人十有八九是在做毕业设计、课程实训或者想往大数据方向投简历需要撑场面的作品。我当年也是从这种“三件套”项目起步的Hadoop负责把数据存起来Spark负责算Django把结果变成网页上能看的大屏。今天就把这套架构从数据采集到可视化大屏的完整链路拆开讲一遍包括我当时踩过的坑和最终跑通的方案。这个大屏不是摆设是真能拿去答辩、演示、甚至放简历作品集里的东西。先说清楚这套东西解决的是什么问题足球数据量一旦跨过“几万行”这个量级Excel就扛不住了单机脚本也慢得让人抓狂而且数据来源杂、格式乱、更新频率高需要有一整套“存、算、展示”的分工体系。Hadoop解决分布式存储Spark解决分布式计算Django负责把计算结果以接口形式暴露给前端最后在浏览器里拼出一块可视化大屏。整套项目做下来你既能把大数据生态的骨架摸一遍又能拿得出手一个完整可演示的系统。1. 项目整体设计技术栈怎么选、数据流怎么走1.1 为什么偏偏是HadoopSparkDjango这套组合很多人第一次看到这个组合会疑惑Hadoop和Spark不都是大数据框架吗为什么两个都要Django不是做Web的吗和它们凑在一起能干嘛这里的关键在于“职责分离”。Hadoop在这套系统里主要用它的HDFS分布式文件系统来存原始数据。足球数据虽然不像电商日志那样动辄PB级但如果你把多个赛季的比赛详情、事件流、球员每场技术统计都爬下来也有几百万行甚至上千万行的量级。单机文本文件根本没法管理用HDFS至少能做到统一存储、多副本容错。至于Hadoop里的MapReduce我基本不用计算全交给Spark。Spark是真正的“算力核心”。它基于内存的分布式计算模型在跑聚合、过滤、关联这类数据分析任务时比MapReduce快一个数量级。而且Spark SQL的语法接近传统SQL做数据清洗和指标统计非常顺手团队成员即使不熟悉函数式编程也能快速上手。Django则是“应用外壳”。它把Spark算好的结果从结果表里读出来通过REST API提供给前端页面。选Django而不是Flask是因为这类课程设计/实训项目往往还需要后台管理的功能Django自带admin、ORM、用户认证几个小时就能把一个带登录的后台搭起来比Flask省事不少。数据可视化部分则用ECharts在前端渲染大屏。这套组合的定位可以这么理解Hadoop是仓库Spark是加工车间Django是展厅ECharts是展厅里的屏幕。数据从仓库取出来加工成指标再送到展厅展示。提示如果你的数据量只有几百MB这么搭确实属于“杀鸡用牛刀”。但这类项目的本质是展示大数据处理流程所以即使数据量不大架构也一定要完整否则评分和面试官都不买账。1.2 整体数据流架构我最终跑通的链路是这样的数据采集 → 数据预处理 → HDFS存储 → Hive建表 → Spark清洗与指标计算 → MySQL结果表 → Django后端读取 → 大屏API → ECharts前端渲染整个流程分成三大块存储层原始CSV/JSON文件上传到HDFS指定目录然后用Hive建外部表指向这些文件这样就能用SQL方式做探索性查询也给Spark后续读取提供了统一的元数据入口。计算层Spark SQL从Hive表读取数据完成空值处理、字段类型转换、非法值过滤然后按业务需求做聚合统计胜率、进球分布、球员排名、主客场差异等最后把聚合结果写回MySQL。展示层Django的views里写接口逻辑从MySQL查数据返回JSON前端大屏页面通过Ajax轮询或者页面加载时一次性请求这些接口用ECharts绘制图表。这套数据流的好处是每一层都松耦合。存储层出问题不影响计算层计算层跑挂了不影响已有结果展示因为MySQL里已经存了历史统计结果。我当时调试时经常出现Spark任务跑一半失败的情况但大屏页面依然能正常显示上一次成功写入的数据这点对演示场景非常友好。1.3 服务器与开发环境规划这种项目一般不会有人在一台机器上真搭Hadoop集群但为了体现“分布式”至少要在虚拟机上模拟3个节点的集群。我当时的资源配置可以参考节点角色配置建议master节点NameNode ResourceManager Spark Standalone Master4核8Gslave1节点DataNode NodeManager Worker2核4Gslave2节点DataNode NodeManager Worker2核4G如果电脑性能有限也可以只在单机装伪分布式模式HDFS和Spark都跑在本机。但呈现效果会差一些毕竟大屏演示时如果能展示“集群节点监控”之类的内容会显得项目更完整。开发环境这里我强烈建议用Windows做Django开发用Linux虚拟机跑HadoopSpark。不要试图在Windows上原生跑Hadoop全家桶虽然能跑起来但各种权限、路径、脚本兼容性问题会消耗你大量时间。Linux用CentOS 7或者Ubuntu Server都行注意Hadoop 3.x需要JDK 8以上Spark 3.x需要JDK 8或11版本搭配在安装前先确认清楚。2. 数据获取与预处理喂给大数据系统的“原材料”2.1 足球数据从哪里来这个项目的关键难点其实不在技术栈而在数据本身。没有一套好的数据后续所有分析都是空中楼阁。我当时的数据来源主要有几个方向公开的足球数据CSV包包含多个赛季的比赛结果、进球时间、球队技术统计等字段这种数据通常整理得比较规整适合快速跑通流程。爬虫抓取实时数据但需要注意网站的访问频率限制我当时用模拟请求加随机延时的方式每天固定时段抓取增量数据存成JSON文件。手工整理一部分“脏样例数据”专门用来测试清洗逻辑比如缺失值、重复记录、异常比分等。字段设计直接影响后续分析。以比赛数据表为例关键字段至少有赛季、联赛、主队名称、客队名称、主队进球、客队进球、比赛日期、半场比分、全场射门次数、控球率、角球数、裁判。球员数据表则包括球员姓名、所属球队、位置、出场次数、进球数、助攻数、传球成功率、评分等。爬虫代码我建议用Scrapy或者纯requestsBeautifulSoup实现不要搞太复杂。爬下来的数据先落成本地JSON文件做一次简单的格式统一再上传HDFS。这个“先落地再上传”的习惯很重要因为网络请求不可控如果边爬边写HDFS一个网络抖动就会破坏数据完整性。2.2 HDFS目录设计与文件格式选择HDFS目录我建议按“数据层级/来源/日期”的三级结构组织比如/football/raw/match/2024-01-15.json /football/raw/player/2024-01-15.json /football/clean/match/ /football/clean/player/raw目录存原始数据clean目录存清洗后的数据。上传命令很简单hdfs dfs -mkdir -p /football/raw/match hdfs dfs -put match_2024.json /football/raw/match/这里有一个容易被忽略的细节HDFS默认会把你上传的文件复制3份副本如果你的虚拟机磁盘空间只有几十GB数据量一大很容易把磁盘塞满。我当时上传了大约2GB的JSON文件实际占用磁盘近6GB。解决方法是设置副本数为2或者干脆用1个副本用于开发环境在hdfs-site.xml里修改dfs.replication参数后重启HDFS生效。文件格式方面原始数据用JSON没问题但供Spark分析时强烈建议转成Parquet格式。Parquet是列式存储Spark读取时只扫描涉及的列加上内置的压缩比直接读JSON能快3到5倍还能省一半以上的存储空间。后续清洗好的文件我都是统一转成Parquet再落到clean目录。2.3 Hive外部表和分区策略HDFS上的数据已经就位后用Hive建一张外部表指向这些文件。这样Spark可以通过Hive的元数据直接读取表结构不用每次自己推断Schema。CREATE EXTERNAL TABLE football.ods_match ( season STRING, league STRING, home_team STRING, away_team STRING, home_goals INT, away_goals INT, match_date STRING, home_shots INT, away_shots INT, possession_home DOUBLE ) PARTITIONED BY (dt STRING) ROW FORMAT SERDE org.apache.hadoop.hive.serde2.JsonSerDe LOCATION /football/raw/match;分区字段dt建议按比赛日期粒度建这样Spark执行“只查某个月数据”的任务时不需要全表扫描。不过分区数量也要控制如果每场比赛一个分区会产生大量小文件Spark处理小文件的开销反而更大。我当时是按月分区的性能比较均衡。注意Hive建表时一旦指定了LOCATION千万不要用hdfs dfs -put直接往这个目录里丢一个格式不一致的文件。Hive不会做格式校验只会把错误数据读成NULL给你看。排查半天才发现是文件里混进了一行脏数据。3. Spark核心指标计算从原始数据到统计指标3.1 计算哪些指标才“有含金量”可视化大屏上放什么指标直接决定这个项目的专业度。最基础的是总比赛场次、总进球数、场均进球但这些太幼儿园了。我当时设计了一套更有说服力的指标体系联赛维度各联赛总进球数、场均进球趋势按月份滑动平均、主客场进球差异、场均黄牌数。球队维度胜平负分布、主场胜率vs客场胜率、进球数Top10球队、净胜球排名、近期5场状态走势胜胜平平负这种字符串序列。球员维度射手榜Top10、助攻榜Top10、球员评分分布、位置与进球关联分析前锋、中场、后卫的进球占比。相关性维度控球率与胜率的相关性、射门次数与进球数的散点关系、角球数是否影响比赛结果。这套指标覆盖了“宏观—中观—微观”三个层面大屏上既有总量数字又有排名列表还有关系型图表内容非常丰满。关键是每个指标都能通过Spark SQL写出来难度适中不会卡住你。3.2 Spark作业的代码结构与执行流程我习惯把Spark任务封装成一个标准的三段式结构加载数据、聚合逻辑、结果输出。这里给一段球队维度统计的核心代码示例from pyspark.sql import SparkSession from pyspark.sql.functions import col, count, when, sum as _sum, avg, row_number from pyspark.sql.window import Window spark SparkSession.builder \ .appName(FootballTeamAnalysis) \ .config(spark.sql.warehouse.dir, /user/hive/warehouse) \ .enableHiveSupport() \ .getOrCreate() # 1. 加载Hive表 df spark.table(football.ods_match) # 2. 基础清洗过滤异常比分、剔除空值 df_clean df.filter( col(home_goals) 0, col(away_goals) 0, col(home_team).isNotNull() ) # 3. 计算球队维度的胜平负和主客场统计 home_stats df_clean.groupBy(home_team).agg( count(*).alias(home_matches), _sum(when(col(home_goals) col(away_goals), 1).otherwise(0)).alias(home_wins), _sum(when(col(home_goals) col(away_goals), 1).otherwise(0)).alias(home_draws), _sum(col(home_goals)).alias(home_goals) ) away_stats df_clean.groupBy(away_team).agg( count(*).alias(away_matches), _sum(when(col(away_goals) col(home_goals), 1).otherwise(0)).alias(away_wins), _sum(when(col(away_goals) col(home_goals), 1).otherwise(0)).alias(away_draws), _sum(col(away_goals)).alias(away_goals) ) # 4. 关联主客场结果合成球队总战绩 team_stats home_stats.join(away_stats, home_stats[home_team] away_stats[away_team], outer) \ .select( coalesce(col(home_team), col(away_team)).alias(team_name), col(home_matches).cast(int).alias(home_matches), ... ) # 5. 写出到MySQL team_stats.write \ .format(jdbc) \ .option(url, jdbc:mysql://localhost:3306/football_db) \ .option(dbtable, team_stats) \ .option(user, root) \ .option(password, yourpassword) \ .mode(overwrite) \ .save()这里有几个容易被新手忽略的点写出MySQL时一定要指定mode(overwrite)否则如果结果表已存在默认会报错。但overwrite模式会先删表再写入如果中途失败MySQL里就什么都没有了所以稳妥的做法是先写入一张临时表成功后再通过SQL语句替换正式表。如果你用groupBy聚合后直接写库MySQL表的字段顺序不一定跟DataFrame一致建议在Django的models里用对应字段名明确映射避免写完数据后发现字段串位。Spark写MySQL时性能瓶颈在数据库端如果结果表数据量太大可以开启批量写入。我当时通过设置rewriteBatchedStatementstrue参数写入速度快了好几倍。3.3 Spark参数调优与三个经典坑跑Spark任务时默认参数在虚拟机配置下几乎必出问题。我建议至少做这几项调整spark-submit \ --master spark://master:7077 \ --executor-memory 2g \ --driver-memory 1g \ --num-executors 2 \ --executor-cores 2 \ --conf spark.sql.shuffle.partitions20 \ --conf spark.serializerorg.apache.spark.serializer.KryoSerializer \ team_analysis.pyspark.sql.shuffle.partitions默认是200也就是说哪怕你的数据只有几十MBshuffle时还是会生成200个任务分片。在单机/小型集群上这200个分片大部分都是空转白白浪费调度开销。调成20到50之间性能提升立竿见影。第一个坑是内存溢出。默认executor内存如果只有1GB遇到groupBy和join这种操作很容易OOM。我遇到过数据量不大但shuffle后单个分区数据量暴涨的情况最后是靠加大executor内存加上设置spark.sql.autoBroadcastJoinThreshold把大表关联变成广播变量解决。第二个坑是中文乱码。如果你的原始数据里有中文球队名、球员名Hive表读取时没有指定UTF-8编码Spark处理后的结果写到MySQL里可能是一堆问号。这个问题的根源往往在Hive SerDe配置建表时加上TBLPROPERTIES (serialization.encodingUTF-8)能规避一部分但更可靠的方式是在Spark读取时显式指定option(encoding, UTF-8)。第三个坑是Spark作业在集群上跑的时候日志里报各种Java类找不到。这通常是因为提交作业的机器本地maven仓库没有把依赖jar打进提交包里。我后来统一用spark-submit --py-files把依赖包带上才彻底解决。4. Django后端与可视化大屏把数据变成看得见的东西4.1 Django项目结构与数据接口设计Django项目我推荐用标准的app结构拆成两个应用statistics负责读取统计数据返回JSONdashboard负责大屏页面渲染和后台管理。如果你的系统有用户登录需求还可以拆一个accounts应用。关键models设计要跟Spark写入MySQL的结果表一一对应避免出现字段名不一致的隐患。比如球队统计表from django.db import models class TeamStats(models.Model): team_name models.CharField(max_length100, uniqueTrue) home_matches models.IntegerField(default0) home_wins models.IntegerField(default0) home_draws models.IntegerField(default0) home_goals models.IntegerField(default0) away_matches models.IntegerField(default0) away_wins models.IntegerField(default0) away_draws models.IntegerField(default0) away_goals models.IntegerField(default0) total_points models.FloatField(default0) class Meta: db_table team_statsDjango的ORM查询接口非常方便比如大屏需要“主场胜率前10球队”的接口在views里这样写from django.http import JsonResponse from .models import TeamStats def top_home_win_rate(request): teams TeamStats.objects.all().order_by(-home_win_rate)[:10] data [ { name: t.team_name, value: round(t.home_wins / t.home_matches * 100, 2) if t.home_matches else 0 } for t in teams ] return JsonResponse({code: 200, data: data})大屏页面加载时通常需要一次性请求十几个接口如果每张图表分别请求页面首屏会刷很久。我建议合并接口一个总览接口返回所有大屏组件需要的JSON数据前端只请求一次。这个方案对后端压力稍大但页面体验好很多。把查询结果加个Redis缓存五分钟过期大屏演示的时候秒开。4.2 可视化大屏的布局与图表选型大屏可视化不是简单地把几个图表堆在页面上。布局的层次感很重要我最终采用的三段式布局如下顶部区域放项目标题、核心指标滚动数字总比赛数、总进球、场均进球、参与球队数和当前时间。中间区域左中右三栏。左栏放联赛进球趋势折线图、各联赛总进球对比条形图中间放一个大型中国地图或世界地图用散点图/涟漪图标注各联赛球队分布或者赛区热度右栏放球队胜率Top10横向条形图、球员射手榜。底部区域放控球率与胜率相关性散点图、主客场胜率对比雷达图、比赛结果饼图以及一个滚动的比赛资讯列表。图表选型有讲究球队排名用条形图比柱状图视觉效果好中文标签更长也不会拥挤进球趋势用平滑折线图适合展示变化趋势相关性分析用散点图加一条趋势线更直观胜率分布用雷达图能同时对比多个球队的多维度数据。ECharts的配置代码不算复杂难的是数据格式转换。比如Django返回的JSON是[{name: A队, value: 82.5}, ...]而ECharts的条形图数据格式需要整理成{yAxis: {data: [...]}, series: [{data: [...]}]}。我建议在前端用JavaScript的map方法做一次转换而不是让后端直接返回图表数据结构这样后端接口的复用性更高。4.3 大屏页面性能优化与调试技巧大屏页面如果卡顿直接影响演示效果。我当时遇到过一个典型的性能问题页面加载后浏览器CPU占用持续100%排查后发现是一张包含全国散点的地图图例每秒都在刷新动画加上折线图的tooltip触发频繁重绘显卡渲染跟不上。解决办法有几个开启ECharts的animation: false或者把动画时长调短数据大屏的实时感主要靠定时刷新数据而不是靠动画效果。图表在屏幕外的部分不要渲染。ECharts没有内置懒加载功能但可以用ECharts.getInstanceByDom手动控制组件可见性或者把页面结构改成切换式tab减少同时渲染的图表数量。用dataZoom控制大数据量的图表展示比如“近五赛季每月进球趋势”如果数据点太多折线图会挤成一团加上滑动缩放组件比单纯缩小图表可读性好得多。调试时还有一个非常实用的技巧在浏览器开发者工具里把Network面板的“Disable cache”勾上同时在后端接口调试模式下打印SQL执行时间。如果某个接口响应超过200ms优先看是不是ORM查询没有加索引。Spark写入MySQL的结果表千万记得在team_name这类经常作为查询条件的字段上加索引否则数据量一大大屏接口会越来越慢。5. 调试部署与问题排查实录5.1 环境搭建阶段最容易翻车的三个地方Hadoop、Spark、Hive的版本兼容性问题简直是这个项目的第一大坑。Hadoop 3.2配Spark 2.4会报各种奇怪的RPC错误Hive 3.1和Spark 3.0整合时需要额外下载spark-hive的兼容包。我的建议是照着一份成功跑通的版本组合抄作业别自己搞创新搭配。我这里用的是Hadoop 3.2.2 Spark 3.0.3 Hive 3.1.2 JDK 8这个组合踩坑最少。第二个坑是Windows开发环境下Django连接HDFS的路径问题。因为开发时Django跑在Windows而Spark在Linux虚拟机里Django不能直接读HDFS上的文件。解决办法是让Spark把计算结果写入MySQLDjango只和MySQL交互。不要在Django里通过Java API操作HDFS完全没有必要还会引入一堆兼容性麻烦。第三个坑是虚拟机网络模式。Hadoop集群节点之间通信依赖主机名解析如果三台虚拟机的/etc/hosts配置不正确会出现DataNode启动后频繁宕机的情况。我建议在每台机器的/etc/hosts里写清楚192.168.1.100 master 192.168.1.101 slave1 192.168.1.102 slave2不要用虚拟机自动生成的随机主机名容易导致节点互相找不到。SSH免密登录也要提前配好不然每次启动集群都要输密码在调试阶段会烦死你。5.2 数据链路不通时怎么快速定位我把这套系统的数据链路总结为“四段排查法”每一段都有明确的验证手段第一段原始数据是否成功上传HDFS。用hdfs dfs -ls /football/raw/match/看文件大小是否大于0再hdfs dfs -cat抽样看几行内容是否完整。第二段Hive表能否查到数据。在Hive命令行执行SELECT * FROM football.ods_match LIMIT 10如果能返回数据说明存储层没问题。这里有个常见的错误Hive表建好了但数据是后来才put进HDFS的外部表本身能看到数据是因为Hive每次查询都会扫目录但如果你的表是内部表需要先MSCK REPAIR TABLE刷新分区信息。第三段Spark任务是否成功把结果写入MySQL。直接查MySQL的team_stats表有没有最新数据。如果表为空去看Spark的executor日志重点看有没有报JDBC连接异常。当时我遇到过MySQL的max_allowed_packet默认值太小Spark写入稍微大一点的数据就报“Packet too large”只能在my.cnf里调大。第四段Django接口是否正常返回JSON。curl http://localhost:8000/api/top_home_win_rate/如果返回的JSON数据正常大屏还显示不出图表问题就在前端JavaScript的拼数据逻辑去Console面板看报错。绝大多数问题都能通过这四段快速定位到具体环节不用在整条链路里瞎猜。5.3 答辩/演示前的最后一小时清单这个项目做到最后很多人忽略了一个重要环节演示环境的稳定性。我吃过一次亏在答辩现场Hadoop集群起不来大屏上全是空白图表。吸取教训后我每次演示前都按这个清单走一遍用start-dfs.sh和start-all.sh启动集群后执行hdfs dfsadmin -report确认DataNode都活着。Spark Web UI的端口能访问说明SparkContext可以正常创建。手动触发一次Spark作业把最新的数据算好写入MySQL。大屏演示时不要现场跑Spark任务万一某个节点内存不够任务挂了你没有时间重来。数据提前算好Django接口直接从MySQL读页面性能最稳。检查大屏页面是否有跨域请求。如果Django接口和前端静态页面不在同一个域名下浏览器会拦截请求。我当时用Django直接渲染大屏模板把ECharts的CDN资源也换成本地静态文件彻底避开网络依赖。关掉所有无关的浏览器标签页和后台程序。大屏页面本身就耗资源演示机器的性能有限把微信、IDE之类的全部退出只留浏览器和终端。提示如果答辩现场只有一台电脑演示时优先考虑“功能完整”而不是“技术炫技”。把Spark日志翻出来展示几条计算过程、把HDFS的文件列表截个图比现场敲命令更稳妥因为现场网络和资源不可控。写在最后的实际操作体会这个项目做完我的最大感受是Hadoop和Spark本身的学习曲线不算陡真正耗时间的是把整个链路串起来之后的各种环境兼容问题。如果重新做一遍我会先把Django后端和可视化大屏的Mock数据做好再去接真实Spark计算结果。这样前后端并行开发大屏可以先跑起来后续只替换数据源能省不少时间。另外如果你是用这个项目去找大数据方向的实习或工作面试官大概率会揪住几个细节问Spark为什么比MapReduce快HDFS副本机制是怎么设计的你们的数据倾斜怎么处理这些问题在项目演示时可能不会问但简历写了就必须答得上来。建议每写完一个模块就想想“如果别人问我为什么这么设计我能不能说出三点理由”。最后分享一个小技巧给MySQL里的结果表加一个updated_at时间戳字段Spark每次写入时更新时间。大屏页面上可以展示“最近更新几秒前”这个细节特别能体现项目的实时性也是答辩时加分的地方。不要只在演讲稿上花心思系统真实呈现的每个细节都会说话。
RELATED

相关推荐

WebStorm配置ESLint:Vue项目代码规范实战指南

WebStorm配置ESLint:Vue项目代码规范实战指南

先说句题外话,标题里“WebStrom”这个拼法我见过太多次了,正主其实是WebStorm,中间是大写的 S。不过这不影响我们今天聊的内容:在 WebStorm 里写 Vue 项目,到底怎么把 ESLint 这个代码风格检查工具装得明明白白、真正用…

📅 2026/10/22 12:05:59
.NET 构建发布革新:中央包版本管理、AOT 与容器直出实践

.NET 构建发布革新:中央包版本管理、AOT 与容器直出实践

如果你和我一样,从 .NET Core 时代就开始把dotnet build和dotnet publish当日常命令来敲,你会明显感觉到:构建和发布的方式每隔一两个大版本,就会被刷新一次。这个系列前两篇,我分别聊过 SDK 风格项目的基线配置&#…

📅 2026/10/22 12:00:57
.NET 日志框架核心原理与手写迷你框架实战

.NET 日志框架核心原理与手写迷你框架实战

.NET 诊断技巧 | 日志框架原理、手写日志框架学习我一直觉得,会写日志和懂日志,中间隔着一整个框架的距离。很多 .NET 开发者每天都在用 NLog、Serilog,_logger.LogInformation("xxx")打得飞起,但一旦被问到“日志框架是…

📅 2026/10/22 12:00:57
MORE NEWS

更多资讯

📰

ComfyUI漫画分镜二实战:同Seed角色一致性验证+侧脸特写生成,国漫雨巷第2格

你是不是已经把第 1 格画好了,远景背影、雨巷氛围都对了,但一到第 2 格要画侧脸特写,心里就开始打鼓——同一个 Seed、同一套参数,侧脸会不会又变成另一张脸? 别慌,我也担心过这个,直到我把第 1 格和第 2 格并排放在一起,发现角色的发色、服装、发饰都稳住了,只是视角…

📰

【零基础学AI】第 15 章课后练习与答案

第 15 章练习与答案🌈 关于《AI 零基础 36 讲》课后训练 📚 与正式讲解配套学习 本篇是《AI 零基础 36 讲》的配套课后训练,与对应章节的正式讲解一起使用。整个系列面向初学者,从日常 AI 使用逐步进入编程、模型训练和大模型应用…

📰

DouK-Downloader 抖音TikTok 作品下载实战指南

DouK-Downloader 抖音TikTok 作品下载实战指南 【免费下载链接】TikTokDownloader 抖音 / TikTok 平台作品下载/数据采集工具 项目地址: https://gitcode.com/GitHub_Trending/ti/TikTokDownloader 你需要把某个抖音账号近三个月的作品全部归档,或者只是想把…

📰

【AI Infra小白入门⑪】AI Infra工具链指南:性能分析与调试工具一网打尽

【AI Infra小白入门⑪】AI Infra工具链指南:性能分析与调试工具一网打尽本文是「AI Infra 小白入门」系列的第十一篇。工欲善其事,必先利其器。对于AI Infra工程师来说,工具就是第二双手——性能优化、问题排查、崩溃调试,样样都离…

📰

【AI Infra小白入门⑩】集合通信基础:AllReduce、Ring算法与NCCL全解析

【AI Infra小白入门⑩】集合通信基础:AllReduce、Ring算法与NCCL全解析本文是「AI Infra 小白入门」系列的第十篇。分布式训练/推理的本质是"计算 通信"。集合通信就是多卡之间"传话"的方式,是理解DDP、ZeRO、TP通信开销的钥匙。本…

📰

Egg.js 接 MySQL 数据库:Sequelize 教程,6 步做出带分页的用户增删改查接口

Egg.js 接 MySQL 数据库:Sequelize 教程,6 步做出带分页的用户增删改查接口 【免费下载链接】hotgo HotGo 是AI 赋能企业级全栈前后端分离开发及移动应用基础平台,基于 Vue 和 GoFrame2.0 构建;内置 AI 开发规范、适配主流 AI 开发…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬