ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于Hadoop的大数据销售数据分析平台设计与实现全流程

基于Hadoop的大数据销售数据分析平台设计与实现全流程 去年帮不少同学看过大数据方向的毕设项目其中“基于Hadoop的销售数据分析平台”这类题目几乎每隔几天就会出现一次。看多了之后就发现一个普遍问题很多人把项目做成了“把文件丢进HDFS再用Hive跑两条SQL最后套一个Echarts模板画几张图”。流程看似完整但答辩时老师随便问一句“你的数据清洗到底做了什么”“为什么选这个指标”“HDFS写文件时发生了什么”场面就很容易冷下来。这篇内容就是围绕“基于大数据Hadoop小米产品销售数据处理与分析平台设计与开发”这个典型题目把从选题拆解、技术选型、环境搭建、数据全流程处理、可视化设计到论文和答辩准备的完整思路整理出来。没有官方文档式的照本宣科全部是实际做过之后才说得清的细节。这篇文章适合正在做大数据毕业设计的本科生、想短时间跑通一个完整Hadoop项目的研究生以及刚开始接触工程化数据处理、想找一个完整练手场景的开发者。你不需要有一堆服务器不需要准备多大的数据量只要一台还能用的电脑就能把这套链路从头到尾走通而且每一步在论文里都能写出实打实的内容。1. 为什么选小米销售数据做Hadoop毕设选题背后的需求逻辑很多人在选题的时候只看到“Hadoop”这个技术词很热门却没想清楚为什么偏偏是“销售数据”而不是其他数据集。这个选择不是随意的它决定了项目后续每一步是否好开展。1.1 这个选题天然的“闭环”优势我一直觉得评判一个毕设题目好不好最简单的方法是看它能不能覆盖一条完整的数据处理链路。数据获取、数据存储、数据清洗、数据分析、结果可视化这五个环节如果某个题目覆盖不全那你的工作量就会集中在某一块写论文时会出现“一章特别厚、其他章节很薄”的结构失衡。小米产品销售数据天然具备这个优势。它字段丰富订单ID、用户ID、商品名称、品类、单价、数量、总金额、购买渠道、收货区域、下单时间这些字段基本覆盖了你能想到的所有分析维度。而且销售数据的结果非常容易解释不需要评委具备很深的技术背景就能理解你想表达的业务结论。简单说算出什么指标大家都能看懂论文里也好写。还有一点容易被忽略销售数据非常适合“按时间维度和分类维度”做聚合分析。Hadoop生态里最擅长的就是离线批量处理Hive SQL做分组聚合、趋势统计、占比分析几乎不需要什么高阶操作就能跑出有说服力的结果。这和Hadoop的技术特性是天然匹配的。1.2 数据从哪里来三种方案的实际对比很多同学卡在这第一步就很久。这里结合我见过的情况把这三种数据来源方案放在一起对比。方案优点缺点适合场景公开数据集Kaggle、天池等权威性高来源正规论文里可以直接引用字段固定不一定有渠道、区域等维度数据量大小不可控和“小米销售”这个主题对不上题目对数据源有硬性要求的场景爬虫采集爬小米商城等真实感强数据是“活的”合规风险不可忽视反爬机制会消耗大量时间数据字段不稳定很难拿到完整的销售订单数据不推荐作为毕设主数据源模拟数据生成自写脚本字段自己定义数据量可控可主动制造脏数据用于清洗环节需要说明数据为模拟生成部分母校老师会追问真实性绝大多数课程设计和毕业设计场景我当时推荐的是第三种自己写一个Python脚本生成模拟数据。有人会觉得这不是“真实数据”论文里不好写。其实完全不用担心只要在论文里明确写清楚“本平台采用模拟销售数据验证数据处理与分析全流程”同时把数据生成逻辑讲明白这就够了。大数据项目考察的核心是数据处理的完整性和工程实现能力数据本身从哪里来可以按照研究需求灵活设计。反过来想如果你真的去爬小米商城的公开页面拿到的也只是商品信息和评价而不是订单数据反而更不真实。1.3 需求拆解老师和答辩评委真正想看到什么选题定了之后最忌讳上来就写代码。我见过太多同学环境还没搭好就急着跑WordCount最后代码写了一堆答辩时连自己项目的业务流程图都画不出来。正确做法是先做需求分析。这个平台按功能可以拆成五个模块数据采集模块负责把原始销售数据导入HDFS模拟数据生成器也归在这一部分数据预处理模块完成缺失值处理、去重、格式标准化、异常值过滤数据仓库模块在Hive中完成表的建模、分区设计和数据装载数据分析模块基于业务需求编写Hive SQL产出各类统计指标数据可视化模块通过前端大屏展示分析结果支持图表联动和指标切换非功能性需求这块至少要考虑三点。一是稳定性程序在伪分布式环境下多跑几轮不崩这是基本功二是易用性即使是原始数据文件也应该按日期和渠道规划好目录而不是随手一丢三是可扩展性比如数据量变大之后可以通过增加DataNode节点提升存储能力这个在论文架构图里要体现出来。把这些需求理清楚你后面每一步都会顺畅很多。而且需求分析一章在论文里占的分量不轻提前想清楚写的时候自然有内容。2. Hadoop生态选型拿什么组件组这条处理流水线选型是项目开始前最常见也最容易纠结的环节。Hadoop生态里组件太多了如果每个都往项目里塞性能和稳定性都会出问题。我的原则就一句话够用、能讲清楚、自己能驾驭。2.1 技术栈分层与各组件定位整个平台按数据流转方向可以分为五层每一层选一个最成熟的组件即可。层级选型职责说明数据接入层Python脚本、可选Flume生成模拟数据并将数据文件上传至HDFS分布式存储层HDFS存储原始数据文件提供高容错的海量文件存储资源调度与计算层YARN MapReduce对文件执行分布式计算Hive的SQL本质上也会转为MapReduce任务执行数据仓库层Hive用SQL方式完成数据的清洗、过滤、聚合分析可视化展示层Spring Boot Echarts提供查询接口渲染大屏图表这套组合看起来没什么“新意”但对一个教学性和工程实践性并重的毕设项目来说刚刚好。HDFS负责存储YARN负责资源调度MapReduce负责计算Hive让分析师能用SQL操作海量数据Echarts负责把计算结果变成可视化图表。每一层都能在论文里单独开一章写原理这是“组件太少没内容、组件太多讲不透”之间的一个平衡点。2.2 为什么这次不推荐贸然上Spark现在很多同学一上来就问老师我们能不能用Spark代替MapReduce我的建议是除非题目里明确写了Spark否则不要主动给自己加戏。原因有三条。第一Spark的部署和维护成本明显更高尤其新手容易在环境配置上消耗大量时间压缩了真正做业务实现的时间。第二MapReduce虽然“老”但是它的执行流程Map阶段、Shuffle阶段、Reduce阶段是分布式计算的基础模型把它讲透答辩时反而更有底气。第三Hive on MapReduce的执行过程是“SQL到MR任务”的典型体现更容易解释清楚而Hive on Spark会多一层抽象老师追问起来你要额外理解很多底层细节。如果你以后想做实时计算方向完全可以在这个项目跑通之后再把离线链路升级成Spark版本作为论文的“后续展望”来写。已有的Hadoop基础不会白费HDFS和YARN依然是Spark的底座。2.3 版本矩阵先定死后面能少走一半弯路版本问题是我见过翻车最多的坑没有之一。Hadoop和Hive的版本之间存在兼容性矩阵装之前一定要先定好不要“最新版装完再慢慢调”。我自己跑过比较稳的组合是这样组件版本备注JDK1.8Hadoop 3.x和Hive 3.x都要求JDK 1.8以上但太高版本反而可能出兼容问题Hadoop3.3.6稳定版端口和生态兼容性都比较好Hive3.1.2与Hadoop 3.x能正常衔接MySQL5.7作为Hive元数据库5.7稳定且资料多Ubuntu20.04集群环境不推荐在Windows上直接跑Hadoop需要特别提醒的是Hive 2.x和Hadoop 3.x的兼容性并不好如果你遇到Hive执行SQL时任务一直卡住或者报一堆空指针先查版本兼容性别急着改代码。Hadoop内置的Java接口在3.x里做了不少调整老版本Hive调用时会出各种诡异问题。3. 环境搭建与集群部署伪分布式还是真分布式很多人的毕设项目就死在环境搭建这一步。这个环节的坑是高度重复的我把整个流程和关键点拆开讲你照着走一遍半小时到一小时能跑通。3.1 先想清楚伪分布式还是完全分布式如果你的电脑内存在16G以下或者你之前完全没接触过Linux操作直接选伪分布式。伪分布式和完全分布式在原理上并没有本质区别核心组件都齐全只是所有进程跑在同一台机器上。论文里你可以画“物理节点部署图”标注清楚各进程所在节点的逻辑角色然后把伪分布式的限制写明白这就不算造假。如果你的电脑内存有32G以上或者实验室给了几台云服务器可以考虑搭一个1台Master加2台Slave的完全分布式集群。完全分布式确实更接近生产环境但随之而来的问题也更多比如节点间SSH通信、HDFS数据块副本数配置、各节点内存分配。综合看下来大多数人用伪分布式完成毕设是性价比最高的选择。3.2 从零到通的三个关键步骤第一步是给Hadoop配JDK和SSH免密。JDK解压后在/etc/profile里配置JAVA_HOME和PATH。然后执行ssh-keygen -t rsa一路回车再把公钥加到本机信任列表执行ssh-copy-id localhost最后用ssh localhost验证是否免密登录成功。这一步如果跳过后面启动集群时每次都会要求输密码分布式场景下会非常痛苦。第二步是修改Hadoop的配置文件。伪分布式模式下最重要的两个文件是core-site.xml和hdfs-site.xml。!-- core-site.xml -- configuration property namefs.defaultFS/name valuehdfs://localhost:9000/value /property property namehadoop.tmp.dir/name value/home/hadoop/data/tmp/value /property /configuration!-- hdfs-site.xml -- configuration property namedfs.replication/name value1/value /property property namedfs.namenode.name.dir/name value/home/hadoop/data/namenode/value /property property namedfs.datanode.data.dir/name value/home/hadoop/data/datanode/value /property /configurationdfs.replication在伪分布式下必须设成1因为只有一台DataNode默认副本数3会导致数据块副本无法落盘。hadoop.tmp.dir推荐改成自定义路径不要用默认的/tmp因为系统清理临时目录时会把你的NameNode元数据一起清了下次启动集群会各种报错。第三步是启动和验证。先执行hdfs namenode -format格式化NameNode再执行start-dfs.sh和start-yarn.sh最后用jps命令查看进程。如果能看到NameNode、DataNode、SecondaryNameNode、ResourceManager、NodeManager这五个进程基本就成功了大半。然后访问http://localhost:9870能看到HDFS的Web管理界面说明集群已经正常运转。3.3 Hive环境让SQL上手数据分析Hive本身只是个客户端工具它需要把元数据存到MySQL里。安装MySQL后创建一个hive用户和hive数据库然后在hive-site.xml里配好连接信息。configuration property namejavax.jdo.option.ConnectionURL/name valuejdbc:mysql://localhost:3306/hive?createDatabaseIfNotExisttrueamp;useSSLfalse/value /property property namejavax.jdo.option.ConnectionDriverName/name valuecom.mysql.jdbc.Driver/value /property property namejavax.jdo.option.ConnectionUserName/name valuehive/value /property property namejavax.jdo.option.ConnectionPassword/name valuehive123/value /property /configuration配置好之后执行schematool -dbType mysql -initSchema初始化元数据库再启动Hive。进入Hive命令行后执行show databases;能正常返回结果就说明Hive已经能用了。另外建议在hive-site.xml里加上本地模式相关配置小数据量任务能跑得更快property namehive.exec.mode.local.auto/name valuetrue/value /property这个配置意味着当输入数据量小于一个阈值时Hive会在本地单机执行SQL而不是提交到YARN速度会快很多。毕设阶段的大部分SQL都能触发这个阈值体验会好很多。4. 从原始数据到可用数据采集、清洗与入库的完整链路环境通了之后就进入了项目最核心的部分数据怎么进来、怎么变干净、怎么进仓库。很多项目做出来“假大空”问题就出在这一段不够扎实。4.1 模拟销售数据生成器的设计思路模拟数据不是随便random一堆数字。为了让分析结果有意义生成器得考虑业务合理性。我设计的生成器品类包括手机、智能手环、路由器、智能音箱、电视、扫地机器人等渠道包括小米商城、京东、天猫、小米之家、线下授权店区域覆盖华东、华南、华北、西南、西北、东北。生成逻辑上我让每天的订单量在800到3000之间波动周末和电商大促日比如6月18日、11月11日订单量翻倍这样后面做趋势分析时能看出明显的周期性波动。商品单价按照品类设定合理的价格区间手机2500元档、手环200元档、路由器300元档符合大家对小米产品的基本认知。还要在数据中故意埋一些“脏数据”不然清洗环节没东西可写。我埋了这几类5%的订单金额为空1%的重复订单少量日期格式为2023/01/05而非2023-01-05个别订单的单价为0或负数。import random import uuid from datetime import datetime, timedelta categories { 手机: (1499, 6999), 手环: (169, 399), 路由器: (129, 599), 智能音箱: (99, 399), 电视: (1999, 7999), 扫地机器人: (1299, 3999) } channels [小米商城, 京东, 天猫, 小米之家, 线下授权店] regions [华东, 华南, 华中, 华北, 西南, 西北, 东北] def gen_order_date(): start datetime(2023, 1, 1) end datetime(2023, 12, 31) return start timedelta(daysrandom.randint(0, (end - start).days)) def gen_one_order(): category random.choice(list(categories.keys())) price_range categories[category] price round(random.uniform(price_range[0], price_range[1]), 2) qty random.randint(1, 3) order_date gen_order_date().strftime(%Y-%m-%d) return [ str(uuid.uuid4())[:12], fU{random.randint(10000, 99999)}, category, price, qty, round(price * qty, 2), random.choice(channels), random.choice(regions), order_date ]这个简版脚本生成的字段顺序是订单号、用户ID、品类、单价、数量、金额、渠道、区域、日期。生成到一定量级后写入CSV文件再统一上传到HDFS。论文里写到“数据采集”这一节时把生成策略和字段说明放进去就能写得非常扎实。4.2 数据清洗的四个关键动作原始数据里埋了脏数据清洗环节就正好逐一解决。清洗我分四步来做每一步都对应明确的判断标准。第一步是缺失值处理。金额字段为空的记录如果单价和数量都存在就按“单价乘数量”重新计算如果单价也不存在直接删除该记录。删除的标准是“关键分析字段缺失且无法从其他字段推导”。第二步是去重。同一订单号出现超过一次的情况保留首次出现的记录删除后面重复的内容。分布式环境下做去重要特别注意最好在Hive里按订单号分组取最早一条避免在不同DataNode上产生重复计算。第三步是格式标准化。日期字段统一为yyyy-MM-dd格式文本类型字段统一使用UTF-8编码金额字段统一保留两位小数。这一步主要解决不同来源数据格式不一致的问题。第四步是异常值过滤。单价小于等于0的记录直接删除数量超过100的判定为异常值金额显著偏离均价比如超过品类均价的三倍的记录单独标记在分析时排除。清洗完成的标志是一张“清洗前清洗后数据量对照表”论文里放一张这样的表比任何文字描述都有说服力。4.3 Hive分区表设计与数据装载清洗完的数据要落到Hive里。这里建议使用外部表加分区的方式。分区字段选择有两个思路一是按日期分区方便做时间趋势分析二是按渠道分区方便做渠道对比。综合考虑我选用按日期分区因为趋势分析是最重要的展示内容渠道对比用GROUP BY就够。CREATE EXTERNAL TABLE IF NOT EXISTS ods_sales_orders ( order_id STRING, user_id STRING, category STRING, price DOUBLE, quantity INT, amount DOUBLE, channel STRING, region STRING, order_date STRING ) PARTITIONED BY (dt STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY , STORED AS TEXTFILE LOCATION /warehouse/ods/sales_orders;建表之后把清洗后的数据文件放到对应分区目录下然后执行修复命令hdfs dfs -mkdir -p /warehouse/ods/sales_orders/dt2023-01-01 hdfs dfs -put clean_data_20230101.csv /warehouse/ods/sales_orders/dt2023-01-01/MSCK REPAIR TABLE ods_sales_orders;外部表相比内部表的优势在于删除表时只删除元数据不会误删HDFS里的原始文件。对毕设项目来说做实验时反复修改表结构的概率很高外部表更安全。4.4 分析SQL示例从销售额到复购率数据分析部分不建议用很复杂的算法重点是把业务问题回答清楚。我列几个最核心的分析指标和对应SQL。按月份统计总销售额和订单数SELECT SUBSTR(order_date, 1, 7) AS sales_month, SUM(amount) AS total_amount, COUNT(DISTINCT order_id) AS order_cnt FROM ods_sales_orders GROUP BY SUBSTR(order_date, 1, 7) ORDER BY sales_month;统计各品类销售额贡献和销量占比SELECT category, SUM(amount) AS total_amount, SUM(quantity) AS total_qty, ROUND(SUM(amount) / SUM(SUM(amount)) OVER () * 100, 2) AS amount_ratio FROM ods_sales_orders GROUP BY category ORDER BY total_amount DESC;统计用户复购行为SELECT user_id, COUNT(*) AS buy_cnt FROM ods_sales_orders GROUP BY user_id HAVING COUNT(*) 2;这几个SQL覆盖了总览、结构、趋势、用户四个维度后面可视化大屏展示的数据都是从这些分析结果里提取出来的。5. 分析维度与可视化大屏的设计思路大屏是给人看的第一印象也是答辩时最加分的部分。但大屏不能只是花架子每个图表都要对应前面分析出的业务结论。5.1 指标到底分析什么从业务问题出发而不是堆图表在设计大屏前先问自己如果我是小米的销售运营负责人拿到这个平台我想知道什么想清楚之后就会发现指标不需要多但每个都要能回答一个问题。总销售额和总订单量回答“整体好不好”月度趋势回答“什么时候好、什么时候差”品类结构回答“什么产品是主力”渠道对比回答“哪个渠道最赚钱”区域分布回答“哪里卖得多”复购率回答“用户粘性如何”。这六个维度就对应六种可视化图表分别是顶部数字卡片、折线图、饼图或环形图、柱状图、地图或横向柱状图、漏斗图。每一种图都有明确的业务含义答辩时被问到“为什么选这个图”就可以从业务解释角度回答而不是说“好看”。5.2 大屏布局与图表选型的实操经验大屏通常用深色背景深蓝或者深黑都行因为深色背景可以让图表的高亮颜色更有视觉冲击力也符合大屏展示场景的氛围。布局方面参考通用套路但不要照搬顶部是标题和日期范围左侧放渠道贡献柱状图中间核心区域放销售区域分布地图右侧放品类占比环形图和商品销量Top10底部放整年的月度销售趋势折线图。Echarts在接入时有几个小细节容易踩坑。容器div必须显式设置宽度和高度否则图表不渲染初始化图表的JS要在DOM加载完成之后执行页面自适应用window.addEventListener(resize, chart.resize)。数据交互上Echarts的tooltip可以显示详细数值图例legend支持点击筛选。这些功能默认就有基本不用额外写代码但要确认数据和图表类型匹配饼图的数据格式是[{name: 手机, value: 500000}, ...]折线图的数据是一维数组弄混了图表会空白。5.3 数据从Hive到前端一条省力又合理的链路大屏需要的数据来自Hive的分析结果。最直接的做法是把分析结果导入MySQL再由Spring Boot后端提供接口前端请求接口拿JSON渲染图表。虽然也可以把Hive的分析结果导出成静态JSON前端直接读取但为了论文里能写“前后端数据交互”这一节还是建议保留一个轻量后端。把Hive查询结果导入MySQL不需要引入Sqoop那么重的工具。直接在Hive命令行跑一条INSERT OVERWRITE DIRECTORY导出结果到HDFS再下载成CSV通过MySQL的LOAD DATA INFILE导入。或者数据量不大时直接把GROUP BY的结果复制出来写成INSERT语句也行。重点是论文里把这条链路画清楚说明白数据是怎么从数据仓库流动到应用数据库的。后端接口设计可以用一个统一返回结构{ code: 200, msg: success, data: [{ month: 2023-01, totalAmount: 2839120.50, orderCount: 45210 }] }前端拿到这个结构后通过Echarts的setOption把数据填进去。接口数量不需要多三个就够总览指标一个、趋势图一个、品类和渠道结构一个剩下的数据都可以合并到这三个接口里。6. 论文架构与答辩准备的经验分享平台做完了工作和代码都跑通了这时候还不到松气的时候。论文和答辩是最后一步也是最容易被忽视的一步。很多同学代码写得挺好却因为论文结构混乱或者答案准备不足被扣分非常可惜。6.1 论文的骨架标准六章结构的写作节奏大数据方向的毕设论文有比较固定的结构一般按下面这个骨架来写第一章绪论主要写研究背景、国内外研究现状、研究目标和内容。研究背景不用写太多宏观的大数据时代重点放在“企业需要高效处理销售数据”这个具体问题上200字就够。国内外现状要写Hadoop生态的发展以及数据处理技术的演变这部分引用几篇相关文献即可。第二章相关技术介绍写Hadoop架构、HDFS原理、MapReduce计算模型、Hive数据仓库、Echarts可视化技术。每项技术写清楚是什么、能解决什么问题、为什么本项目选用它。这一章是最容易凑字数的但不要只抄概念要写“在本项目中的作用”。第三章需求分析把第1.3节里的功能需求和非功能需求展开写配用例图和数据流图。第四章系统总体设计画系统架构图、功能结构图写出各模块之间的数据流转关系。第五章系统详细设计与实现这是论文核心章节按数据采集、数据预处理、数据仓库设计、数据分析、可视化展示五个模块逐个写清楚设计思路和关键代码。界面截图、SQL语句、核心类代码都要放进去。第六章系统测试与总结写测试环境、测试用例、测试结果和分析。总结部分简单概括项目成果指出不足和后续改进方向即可不需要写太多空话。6.2 必画的三张图论文里图比文字更重要尤其是这三张图画好了能直接撑起整个论文的质量。第一张是系统架构图。从下往上画四层数据源层模拟数据生成、数据存储层HDFS、数据处理与分析层Hive/MapReduce、应用展示层Spring Boot Echarts。每层之间用箭头标注数据流向。这张图画好总体设计一章就立起来了。第二张是功能结构图。按第1.3节的模块划分画树状图从平台往下分出五个一级模块每个一级模块再往下拆二级功能不需要拆到第三级不然图太密不好看。第三张是业务时序图。画从“用户上传数据”到“HDFS存储”到“Hive分析”再到“前端展示”的交互过程体现各个组件之间的调用顺序。这张图能帮助老师快速理解你的平台是怎么工作的比大段文字解释有效得多。画图工具用draw.io或者ProcessOn都行导出PNG格式论文里的图片分辨率不低于300dpi不然打印出来会模糊。6.3 答辩高频问题与应答思路答辩时老师的问题通常集中在这几个方向提前准备好现场就不会慌。HDFS的写入流程是必问题。简单回答框架客户端向NameNode发起写请求NameNode返回可用的DataNode列表客户端将数据分块后按流水线方式写入第一个DataNode再由第一个DataNode复制到第二个所有副本写入完成后返回确认信息。MapReduce中的Shuffle过程也是高频题。回答思路Map端输出结果先写入环形缓冲区达到阈值后溢写到本地磁盘并在溢写过程中进行分区、排序和合并Reduce端从各个Map任务拉取属于自己的分区数据再次排序后交给Reduce函数处理。“为什么用Hive而不用直接写MapReduce”这个问题回答方向是Hive将SQL转换为MapReduce任务执行降低了数据分析的门槛项目重点在数据处理和分析不是重复造轮子。“数据量多大”这个问题要提前算好。如果你生成的订单数据有30万条文件大小为几十MB就如实回答。老师看的是你能否解释清楚数据量和系统处理能力之间的关系而不是追求你有一个多大的集群。7. 全程踩过的坑给后来者的排错参考环境搭建和项目开发过程中踩坑是必然的。把常见问题的排查思路整理出来可以帮你节省大量走弯路的时间。7.1 HDFS端口连不上先分清版本再谈配置如果你访问http://localhost:50070打不开页面先确认自己装的是不是Hadoop 3.x。Hadoop 3.x的NameNode Web UI端口从50070改成了9870DataNode端口从50075改成了9864。端口连不上的另一大原因是防火墙没关或安全组没放行。虚拟机环境下还要检查网络模式是不是NAT宿主机访问虚拟机时要用虚拟机的IP而不是localhost。7.2 格式化NameNode之后DataNode起不来这是新手最容易遇到的一个问题。现象是jps里没有DataNode进程看日志会发现ClusterID不一致。原因很简单第一次格式化NameNode后DataNode会在当前数据目录生成一个ClusterID如果你在多次尝试中再次格式化NameNodeNameNode会生成新的ClusterID而DataNode还是旧的两者对不上DataNode就会拒绝启动。解决办法也直接停掉所有Hadoop进程把hdfs-site.xml里配置的dfs.namenode.name.dir和dfs.datanode.data.dir目录下的内容全部清空然后重新格式化NameNode再启动集群。格式化操作是有破坏性的执行前想清楚是否已经不需要原来的数据。7.3 Hive跑SQL卡住或者很慢排障步骤按照这个顺序来第一步看YARN页面8088端口上任务有没有提交成功如果任务没提交八成是Hive版本和Hadoop版本不兼容。第二步如果任务跑了很久没结束可以先看一下数据量如果只有几万条把hive.exec.mode.local.auto设为true让任务在本地执行速度会快很多。第三步如果Reduce阶段特别慢检查是不是数据倾斜某个Key的数据量远大于其他Key可以用两阶段聚合或者加随机前缀的方式打散热点Key。7.4 中文乱码从MySQL到Hive到大屏逐层排查中文乱码的坑很常见。Hive表字段注释在MySQL元数据库里乱码一般是初始化Hive元数据库时字符集不是UTF-8。解决方法是建库时指定字符集或者修改hive数据库的编码ALTER DATABASE hive CHARACTER SET utf8 COLLATE utf8_general_ci;数据文件本身的中文乱码检查Linux系统的locale设置确保是en_US.UTF-8或zh_CN.UTF-8然后重新导入。大屏显示的中文乱码基本是HTTP接口返回时编码不对后端统一在响应头里加Content-Type: application/json; charsetutf-8即可。7.5 YARN容器内存溢出报错信息通常是Container is running beyond physical memory limits。这是因为YARN默认分配的容器物理内存小于任务实际需要。解决方法是调整yarn-site.xml里的资源参数把单节点可用内存调大同时把任务的内存限制调高property nameyarn.nodemanager.resource.memory-mb/name value8192/value /property property nameyarn.scheduler.maximum-allocation-mb/name value4096/value /property如果在有限资源下仍然频繁触发还可以限制并发运行的容器数量。伪分布式环境本身就资源有限不建议同时跑多个重型任务。回头看整个项目我最深的体会有两点。第一毕设项目不是组件越多越好组件少而链路完整比组件多但每个都讲不明白要强得多。第二数据质量工作占了这个项目将近一半的精力但恰恰是这部分让项目经得起追问。你在清洗环节下的功夫最后都会在论文和答辩中体现出来。如果时间允许可以在跑通整个项目之后把数据量扩大十倍再跑一轮记录一下任务执行时间的变化加上这个数据论文和答辩的含金量还能再上一个台阶。
返回列表