尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

基于Hadoop与Spark的车辆CO2排放量可视化分析系统设计实践

基于Hadoop与Spark的车辆CO2排放量可视化分析系统设计实践 做这种“车辆二氧化碳排放量可视化分析系统”的题目我最大的感触是它看起来只是一个毕业设计但真正把它从头到尾跑通考验的东西一点都不少。Hadoop、Spark、Anaconda三件套就像一台旧式生产线的三个环节任何一环没接好后面全是坑。我前阵子帮一个学弟把这类项目从环境配置跑到最后的可视化展示页顺便把自己当年踩过的坑又温习了一遍。这个文章我会完全按照实际落地的顺序写从技术选型、环境搭建、数据处理到最后的成果展示和答辩技巧希望帮你少走弯路。这类题目在大数据方向里之所以受欢迎是因为它“麻雀虽小五脏俱全”。不是让你写个Python脚本把Excel画几个图就交差而是要求你在本地把Hadoop、Spark、Anaconda这一整套工具链组装起来真正跑通一个“从HDFS读数据、Spark做清洗分析、再到可视化展示”的闭环。如果你正准备大数据方向的毕业设计或者想快速了解HadoopSpark怎么配合Python做数据分析这篇内容应该能给你一个完整的参考。1. 项目到底在做什么需求拆解与选题价值1.1 一个典型的毕业设计需要交付什么拿到这个题目第一件事不是急着下载Hadoop压缩包而是先想清楚要交付什么。一般来说学校老师不会只看你跑通一个Spark任务就放你过关常规要求至少包含四个方面数据层准备车辆信息、油耗和CO2排放数据集最好有几千条以上能够支撑“大数据处理”的故事存储层把CSV、JSON等原始数据上传到HDFS体现分布式文件系统的存储过程计算层用Spark做数据清洗、去重、缺失值处理并按车型、年份、排量、油耗等维度做聚合统计展示层把聚合结果用可视化库或前端页面展示出来生成图表和指标卡直观回答“哪类车排放高”“油耗和CO2排放是什么关系”这类问题。很多同学一上来就陷入困境环境装了半个月代码写了一堆结果数据还没想清楚页面也没有落地。我的建议是先在纸上画出数据流向把所有环节用文字写下来再动手配环境。否则你会在后面无数次返工。这个项目完全可以拆成三个阶段来推进第一阶段搭环境第二阶段写数据处理逻辑第三阶段做展示。三个阶段分别对应“基础设施”“算法逻辑”“业务表达”每一段都有独立的成果物答辩时也能讲出层次感。1.2 技术选型为什么是HadoopSpark而不是直接pandas这里要先说一句大实话如果单论处理几万行车辆排放数据Pandas确实比Spark快多了资源占用也小。那为什么还要选Hadoop和Spark核心原因是这个题目不是纯粹的算法题而是一个“数据工程”题。Hadoop里最常用的是HDFS负责分布式文件存储Spark负责内存计算能直接读取HDFS也能把结果交给Python侧做可视化。Anaconda则负责Python环境和库的管理。你选用这套技术栈本质上是把教材里的大数据生态在本地复现一遍。从实际找工作的角度看面试官也更愿意听一个能讲清“数据从哪来、存在哪里、用什么计算、怎么展示”的项目经历。哪怕是在单机伪分布式环境里跑的你再说明可以横向扩展到多节点这也比只写“会用Pandas处理Excel”更有说服力。1.3 整体数据流设计这个项目我建议的数据流用文字描述大概是下面这样原始数据集(CSV) ↓ 上传到HDFS分布式存储 ↓ Spark读取CSV → 数据清洗 → Spark SQL聚合统计 ↓ 导出结果为中间文件CSV/Parquet ↓ Python可视化Matplotlib/Seaborn ↓ 生成HTML报告 / 简易Web展示页这样设计的好处是每一层都有产物HDFS里能看到原始文件Spark UI里能看到Job执行日志输出目录里能看到聚合结果。答辩的时候即使不现场跑完整流程也可以把每一步的截图和日志甩出来比干讲“我用了Spark”要扎实得多。2. 环境搭建AnacondaHadoopSpark完整配置2.1 版本搭配是环境的“地基”很多同学在环境配置上反复折腾不是因为操作笨而是版本搭配不对。这里我直接给一套经过验证的组合软件推荐版本原因Anaconda2023.09及以上自带Python 3.9/3.10conda管理方便JDK1.8Hadoop和Spark对JDK8的兼容性最稳Hadoop3.3.6稳定伪分布式配置资料多Spark3.4.1或3.3.2PySpark集成好支持Hadoop 3.x记住一点别追求最新版。毕业设计求的不是新技术而是稳定性。Hadoop 3.3.6配Spark 3.4.1搭配JDK8在网络上能找到大量现成解决方案遇到问题也容易搜到答案。2.2 Anaconda安装与虚拟环境创建Anaconda的安装我就不逐字演示了下载安装包后一路Next就行。但安装完一定要做一件事创建独立的虚拟环境不要把所有包堆在base环境里。打开终端或Anaconda Prompt执行conda create -n bigdata python3.9 -y conda activate bigdata conda install pandas matplotlib seaborn jupyter -y pip install pyspark创建虚拟环境的好处是让项目的依赖互相隔离。比如你另一个项目需要Python 2.7或者TensorFlow它们之间不会互相污染。pyspark我用pip install而不是conda install是因为现在PySpark的版本更新频繁pip渠道的新版本发布更快。如果之后在Jupyter Notebook里要用这个环境建议执行一次conda install ipykernel -y python -m ipykernel install --user --name bigdata --display-name Python(bigdata)这样Jupyter里就会出现一个名为“Python(bigdata)”的内核选择它就可以用环境里的pandas、pyspark了。2.3 Hadoop伪分布式搭建Hadoop支持单机、伪分布式、分布式三种模式。毕业设计项目在本地跑最合适的方案是“伪分布式”。也就是一台机器上同时启动NameNode、DataNode、ResourceManager、NodeManager等所有角色进程但配置文件已经为分布式做好了准备。在Linux环境下的搭建步骤大概是tar -zxvf hadoop-3.3.6.tar.gz -C /opt/ mv /opt/hadoop-3.3.6 /opt/hadoop然后配置环境变量编辑/etc/profile.d/hadoop.shexport HADOOP_HOME/opt/hadoop export PATH$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin执行source /etc/profile.d/hadoop.sh让它生效。接着修改$HADOOP_HOME/etc/hadoop/hadoop-env.sh把JDK路径写死export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64这里有个常见的坑有些人喜欢在脚本里写export JAVA_HOME$(dirname $(dirname $(readlink -f $(which java))))这种写法在部分Linux发行版上会解析成空值导致后面“JAVA_HOME is not set”的报错。最稳的方式就是先执行which java和dirname命令把最终路径拿到手再直接写死。下面还要修改几个配置文件。core-site.xml用来设置NameNode的访问地址configuration property namefs.defaultFS/name valuehdfs://localhost:9000/value /property /configurationhdfs-site.xml里把副本数改成1并指定NameNode和DataNode的数据存储目录configuration property namedfs.replication/name value1/value /property property namedfs.namenode.name.dir/name value/opt/hadoop/namenode/value /property property namedfs.datanode.data.dir/name value/opt/hadoop/datanode/value /property /configuration副本数设成1是因为本地只有一台机器设置成默认3的话DataNode会一直报副本不足的告警还浪费磁盘空间。接下来是mapred-site.xml把计算框架切到YARNconfiguration property namemapreduce.framework.name/name valueyarn/value /property /configuration然后是yarn-site.xml设置辅助服务configuration property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property /configuration到这里Hadoop的配置就算完成了。第一次启动前需要先格式化NameNodehdfs namenode -format格式化会在NameNode指定目录下生成fsimage和edits日志文件。注意这个命令只能在第一次使用或者在你清空数据目录后使用。如果多次格式化NameNode的clusterID会变DataNode注册时发现ID不匹配就会出现“DataNode起不来”的情况。启动命令start-dfs.sh start-yarn.sh然后输入jps如果看到NameNode、DataNode、SecondaryNameNode、ResourceManager、NodeManager五个进程说明伪分布式Hadoop启动成功。2.4 Spark安装与启动验证Spark安装相对简单下载二进制包后解压再配置环境变量tar -zxvf spark-3.4.1-bin-hadoop3.tgz -C /opt/ mv /opt/spark-3.4.1-bin-hadoop3 /opt/spark编辑spark-env.sh这个文件在$SPARK_HOME/conf目录下export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 export SPARK_MASTER_HOSTlocalhost export SPARK_LOCAL_IP127.0.0.1验证Spark是否能启动$SPARK_HOME/bin/spark-shell --master local[2]如果出现Spark的Logo和提示说明Scala版本的Spark没问题。我们后续还要用PySpark所以前面在Anaconda环境里执行过pip install pyspark后可以直接在终端输入pyspark --master local[2]能进入PySpark的交互式环境就说明Python侧对接成功了。2.5 把PySpark与Anaconda环境正确衔接这是很多人忽略的重点PySpark启动时并不知道要用哪一个Python解释器。如果你在Anaconda环境里装了 pyspark但系统的默认Python是/usr/bin/python那提交作业时可能找不到pandas、matplotlib这些依赖。最稳妥的做法是在项目的启动脚本里显式设置export PYSPARK_PYTHON/home/你的用户名/anaconda3/envs/bigdata/bin/python export PYSPARK_DRIVER_PYTHON$CONDA_PREFIX/bin/python如果在Jupyter Notebook里跑可以设置成export PYSPARK_DRIVER_PYTHONjupyter export PYSPARK_DRIVER_PYTHON_OPTSnotebook --notebook-dir/你的项目目录然后执行pyspark它就会自动拉起Jupyter。这样Spark的Driver和Executor都用同一个conda环境包管理不会乱。3. 数据接入、清洗与特征处理3.1 数据集怎么准备和字段理解车辆CO2排放方面的公开数据集不少比如加拿大政府关于机动车燃料消耗评级的数据集里面就包含了车辆型号、排量、气缸数、综合油耗、CO2排放量等字段。如果你的毕业设计是从零开始做我建议用英文列名的CSV避免后续辛辛苦苦处理中文编码问题。一份典型的数据长这样MakeModelVehicle ClassEngine Size(L)CylindersFuel Consumption Comb (L/100 km)CO2 Emissions(g/km)ToyotaCorollaCompact1.847.1165HondaCR-VSUV2.449.4219FordF-150Pickup Truck5.0814.2326字段不多但足够做出一套像样的分析。你至少可以回答这些问题哪种车型平均排放最高排量和CO2排放的相关性有多强同一品牌下不同车型的排放差异大不大3.2 把CSV上传到HDFS数据准备好以后第一步不是读取而是上传到HDFS。在HDFS里建一个项目目录hdfs dfs -mkdir -p /user/hadoop/vehicle hdfs dfs -put /你的数据目录/co2_emissions.csv /user/hadoop/vehicle/查看上传结果hdfs dfs -ls /user/hadoop/vehicle/ hdfs dfs -du -h /user/hadoop/vehicle/这里可以直接观察到HDFS的“三副本”策略。虽然我们在伪分布式里设置了副本数为1但如果你在hdfs-site.xml里改了副本数就能在查看文件时看到对应数量的block信息。这个小点可以写进答辩PPT里实际证明你对HDFS原理的理解。3.3 用Spark读取CSV并处理字段类型伪分布式环境搭好后正式进入数据科学环节。在PySpark中我建议在读取CSV时就定义好Schema而不是让Spark自己推断。否则数字字段可能被推断成int或string后面再转换就麻烦。示例代码from pyspark.sql import SparkSession from pyspark.sql.types import StructType, StructField, StringType, DoubleType, IntegerType spark SparkSession.builder \ .appName(VehicleCO2) \ .master(local[*]) \ .config(spark.sql.adaptive.enabled, true) \ .getOrCreate() schema StructType([ StructField(Make, StringType(), True), StructField(Model, StringType(), True), StructField(Vehicle_Class, StringType(), True), StructField(Engine_Size_L, DoubleType(), True), StructField(Cylinders, IntegerType(), True), StructField(Fuel_Consumption_Comb_L_100km, DoubleType(), True), StructField(CO2_Emissions_g_km, DoubleType(), True) ]) df spark.read.option(header, True) \ .schema(schema) \ .csv(hdfs://localhost:9000/user/hadoop/vehicle/co2_emissions.csv) df.printSchema() df.show(10, truncateFalse)这里的local[*]表示使用本地所有CPU核。在本地调试时用这个参数最省事。需要特别说明的是Spark在读取数据的时候不会立刻执行全部计算它采用惰性求值。上面的代码只是构造了一个DataFrame的“执行计划”等你真正调用show()或者write时Spark才会触发Job。3.4 清洗与去重注意业务逻辑数据清洗的第一步是去重。如果你只是简单地df.dropDuplicates()那整行重复才会被删掉。实际业务中同一款车型可能因为配置不同而出现多条记录所以需要指定组合键df df.dropDuplicates([Make, Model, Engine_Size_L, Cylinders])这里的逻辑是如果厂商、车型、排量、气缸数都一样才认为这是一条重复记录。如果只按“Make”和“Model”去重就会把同一车型下不同排量的版本误删后面分析发动机排量和排放的关系就没意义了。然后是缺失值处理df df.na.drop(subset[CO2_Emissions_g_km, Fuel_Consumption_Comb_L_100km])如果CO2排放量或者油耗是空值这条记录对后续回归和统计没有意义直接删除即可。但如果只是品牌字段为空你可以考虑填充而不能一刀切。处理逻辑最好在报告里写清楚这也是答辩中容易被追问的地方。对异常值也可以做一个简单过滤。比如发动机排量范围一般在0.5到8.0之间油耗在3到30之间明显超出这个区间的记录可以视为数据质量问题。3.5 Spark SQL做聚合统计清洗完成后注册成临时视图就能用Spark SQL做统计df.createOrReplaceTempView(vehicle)下面按车辆类型统计平均CO2排放量SELECT Vehicle_Class, COUNT(*) AS cnt, ROUND(AVG(CO2_Emissions_g_km), 2) AS avg_co2, ROUND(AVG(Fuel_Consumption_Comb_L_100km), 2) AS avg_fuel FROM vehicle GROUP BY Vehicle_Class HAVING COUNT(*) 10 ORDER BY avg_co2 DESC这里HAVING条件是防止某些样本量很少的Vehicle Class以个例拉高统计结果。比如某个类目只有1辆车它的平均值不具备代表性。再比如按照排量区间做分桶统计SELECT CASE WHEN Engine_Size_L 1.5 THEN 小型排量 WHEN Engine_Size_L 2.0 THEN 中等排量 WHEN Engine_Size_L 3.0 THEN 较大排量 ELSE 大排量 END AS engine_group, ROUND(AVG(CO2_Emissions_g_km), 2) AS avg_co2, COUNT(*) AS cnt FROM vehicle GROUP BY engine_group ORDER BY avg_co2 DESC这组聚合结果可以直接导出成CSV供后续可视化使用。3.6 导出聚合结果两种导出方式要分清楚。方式一把结果集转成Pandas DataFrame再写文件。result_pd result.toPandas() result_pd.to_csv(./vehicle_class_stats.csv, indexFalse, encodingutf-8-sig)这种方式适合结果集小、下一步要直接用Python做可视化的场景。缺点是大数据量时toPandas会把数据都拉回Driver导致内存溢出。方式二用Spark的DataFrame直接写文件到HDFS或本地。result.write.mode(overwrite).csv(./output/vehicle_class_stats, headerTrue)这种方式可以保留分布式的优势但写出来的文件可能是一堆part-xxx文件后续可视化前还需要merge。所以在这个项目里我建议统计结果量小直接用方式一但你要在报告里能讲清楚方式二的原理并说明什么场景下应该选它。4. 可视化分析与“可交付”展示4.1 核心分析指标体系可视化不是把一堆图堆在一个页面上而是要有“指标逻辑”。我建议围绕下面这张表来设计分析方向图表类型想说明的问题不同车辆类型的平均CO2横向柱状图/条形图哪些车型整体更费油、排放更高发动机排量与CO2散点图排量升高是否一定推高排放综合油耗与CO2散点图回归线油耗和排放是否存在强正相关气缸数与平均CO2柱状图气缸多是否一定排放高品牌平均排放Top10水平柱状图哪些品牌平均排放最高或最低答辩时候不要只放图要在每张图下面写一句“业务结论”。比如“SUV平均CO2排放为235g/km明显高于Compact小型车的165g/km”“油耗和CO2排放相关系数达到0.96说明燃油消耗是碳排放的主要来源”。4.2 用Seaborn画图并输出绘图阶段把Spark跑出来的聚合结果调成Pandas DataFrame然后交给matplotlib和seaborn。import pandas as pd import matplotlib.pyplot as plt import seaborn as sns plt.rcParams[font.sans-serif] [SimHei, DejaVu Sans] plt.rcParams[axes.unicode_minus] False fig, axes plt.subplots(2, 2, figsize(14, 10)) sns.barplot(datadf_class, xavg_co2, yVehicle_Class, axaxes[0][0]) axes[0][0].set_title(不同车辆类型平均CO2排放量) sns.scatterplot(datadf, xFuel_Consumption_Comb_L_100km, yCO2_Emissions_g_km, hueCylinders, alpha0.6, axaxes[0][1]) axes[0][1].set_title(综合油耗与CO2排放关系) sns.boxplot(datadf, xCylinders, yCO2_Emissions_g_km, axaxes[1][0]) axes[1][0].set_title(气缸数与CO2排放分布) sns.regplot(datadf, xEngine_Size_L, yCO2_Emissions_g_km, axaxes[1][1]) axes[1][1].set_title(发动机排量与CO2排放回归) plt.tight_layout() plt.savefig(co2_analysis.png, dpi150)这里有个实际经验中文标签在Linux服务器上容易变成方框。如果系统没有SimHei字体最简单的办法是把图内标题改成英文在HTML页面里用中文解释。硬装中文字体也可以但会多花不少时间。做毕业设计效率优先能用英文标签就用英文标签。4.3 把图表整合成HTML报告图表生成以后如何展示给导师一张张小图贴进Word显得不专业。我推荐做一个极简的HTML页面把所有图表放上去再配一段文字结论。用Flask做一个简单的Web服务from flask import Flask, render_template_string app Flask(__name__) html !DOCTYPE html html langzh-CN head meta charsetutf-8 title车辆CO2排放量可视化分析/title /head body h1车辆CO2排放量可视化分析/h1 p本项目基于HadoopSpark进行数据处理使用Python进行可视化。/p img src/static/co2_analysis.png stylewidth:85% / h2核心结论/h2 ul liSUV和Pickup Truck的平均CO2排放量显著高于小型轿车。/li li综合油耗与CO2排放强正相关是预测排放的核心指标。/li li同一排量区间内不同车型的排放差异明显说明发动机技术影响显著。/li /ul /body /html app.route(/) def index(): return render_template_string(html) if __name__ __main__: app.run(host0.0.0.0, port8080, debugTrue)把co2_analysis.png放到项目的static目录下然后在项目根目录执行python app.py浏览器访问http://localhost:8080就能看到成果页。这套东西不需要复杂前端技术但足以展示完整的项目闭环。5. 常见问题与排查记录5.1 HDFS格式化后DataNode启动不了这个问题我在网上见到过无数次自己也踩过。具体现象是执行start-dfs.sh后jps只能看到NameNode和SecondaryNameNodeDataNode进程消失查看日志发现clusterID不匹配。原因很简单你重复执行了hdfs namenode -format。每次格式化都会生成新的clusterID但DataNode目录里保留的还是旧的clusterID导致互相认不了。解决办法是停掉集群把NameNode和DataNode目录都清空重新格式化stop-dfs.sh rm -rf /opt/hadoop/namenode/* rm -rf /opt/hadoop/datanode/* hdfs namenode -format start-dfs.sh我个人的习惯是格式化之前一定先确认namenode和datanode目录下的文件是否需要保留。在项目开发阶段数据随时可以重传直接清空是最省事的。5.2 JAVA_HOME is not set这个报错在各种教程里的出现率很高。原因很直接hadoop-env.sh或spark-env.sh里没有正确配置JAVA_HOME。建议执行以下命令查看真实的JDK路径echo $JAVA_HOME which java然后在hadoop-env.sh中直接写export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64不要依赖readlink -f那套动态获取因为很多从源码编译安装的JDK路径结构不一定兼容。5.3 Spark on YARN时CPU只能用1个vCore这是搜索词里很典型的问题“spark on yarn cpu只能用1个是为什么”。原因有三层你需要逐一检查。第一NodeManager能识别到的CPU核数是有限的。如果你在虚拟机或Docker容器里跑宿主机可能只给了一个vCPU这种情况下yarn.nodemanager.resource.cpu-vcores需要显式设置。假设你的机器有4个逻辑核property nameyarn.nodemanager.resource.cpu-vcores/name value4/value /property第二Spark执行器分配的核数由spark.executor.cores控制。如果你在提交任务时写--executor-cores 1那每个Executor就只能用一个核。第三如果用了动态分配还要检查spark.dynamicAllocation.enabled。本地伪分布式下我建议直接关闭动态分配避免它把资源调度搞得很复杂。5.4 PySpark找不到用户的conda包症状写好的代码在普通Python里能跑但通过spark-submit提交时提示“ModuleNotFoundError: No module named pandas”。原因是Spark的Driver和Executor用了不同的Python解释器。解决办法是在提交前设置环境变量export PYSPARK_PYTHON$CONDA_PREFIX/bin/python export PYSPARK_DRIVER_PYTHON$CONDA_PREFIX/bin/python如果你的作业要在多节点上跑所有节点都必须安装同样的conda环境并且路径要一致。否则Executor无法找到解释器和依赖包。5.5 中文乱码问题中文乱码分两个地方第一个是CSV文件读取乱码。用Spark读取时可以通过.option(encoding, UTF-8)指定编码。如果是Excel导出的CSV很可能是GBK编码你要先转成UTF-8再上传到HDFS。第二个是Matplotlib绘图乱码。默认matplotlib字体不支持中文需要在绘图前设置plt.rcParams[font.sans-serif] [SimHei]但Linux服务器不一定有SimHei所以图解方案就是用英文标签。如果论文里需要中文图可以在本地Windows环境重新生成一遍图再把图复制到文档里。5.6 端口被占用Web UI打不开Hadoop 3.x 的NameNode Web UI默认端口是9870Spark UI默认端口是4040YARN的ResourceManager UI是8088。如果你本地跑了实验班环境这些端口很容易冲突。最简单的办法是改端口比如Spark可以这样改spark SparkSession.builder \ .appName(VehicleCO2) \ .config(spark.ui.port, 4041) \ .getOrCreate()或者杀掉占用端口的进程用lsof -i:8088和kill -9 进程号。6. 毕业设计答辩与项目扩展6.1 怎么讲解才能让老师觉得“有技术含量”很多同学答辩时习惯上去就说“我用了Hadoop和Spark”但老师问一句“你的HDFS目录结构是什么Spark执行计划里有什么”就卡壳了。建议准备一张项目架构图把整个流程按“数据接入 → HDFS存储 → Spark计算 → 可视化”四层画出来然后每一层都准备好一句“为什么这么选”。比如老师问“你数据量才几万行为什么不用MySQL”你要回答“MySQL适合结构化事务但HDFS适合大文件批量存储和后续扩展。本项目的核心目标是掌握分布式存储和计算技术在数据量增长到亿级时HDFSSpark仍然可以通过加节点实现横向扩容。”这样的回答既诚实又能体现工程认知比空喊“大数据”更有说服力。6.2 给项目加分的几个扩展点这个题目的基础版是“统计 图表”如果想要更好看的成果可以考虑以下方向一是加入MLlib回归模型。用发动机排量、油耗、气缸数作为特征训练线性回归或随机森林模型来预测CO2排放量再用RMSE和R2评估效果。这样项目既有可视化又有机器学习技术栈会更完整。二是使用Spark Streaming模拟实时数据流。把CSV里的数据一条条模拟成实时窗口统计最近5分钟平均CO2排放再通过WebSocket推送前端。这个扩展会让项目从“离线分析”升级到“实时计算”但代码量会大不少适合时间充裕的同学。三是用Superset或者ECharts做更专业的可视化大屏。ECharts的好处是支持动态交互和响应式布局视觉效果比matplotlib强很多。只需要把Spark计算结果导出成JSON再用ECharts渲染柱状图和散点图。6.3 给学弟学妹的踩坑提醒最后结合我个人实际体验说几句。环境配置阶段我强烈建议至少预留两天时间不要指望半天搞定。Hadoop的启动顺序、格式化操作、端口占用这些都是“教程不会写在显眼处的坑”。数据清洗阶段不要沉迷于堆技术很多指标直接用Spark SQL就能算出来非要用RDD的map/reduce反而容易出bug。项目开发时优先用DataFrame和Spark SQL至少在演示阶段它足够稳定。演示之前一定要录一段屏幕视频作为备用。现场演示有个老问题环境随时可能因为内存不足、端口冲突、进程假死而崩溃你有视频就不慌。视频录完以后把讲解词写成一页纸答辩前读几遍。这个项目做完以后你对Hadoop的HDFS、Spark的RDD和DataFrame、PySpark与Python环境的关系会有一个很具体、很落地的理解而不是停留在教科书的概念里。把这套流程完整复盘一遍简历上写实习和项目经历时你会发现自己能聊的东西比想象中多。
返回列表