《大数据项目实战》课件(中)_第1页
《大数据项目实战》课件(中)_第2页
《大数据项目实战》课件(中)_第3页
《大数据项目实战》课件(中)_第4页
《大数据项目实战》课件(中)_第5页
已阅读5页,还剩146页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

云计算技术应用省级专业教学资源库分析数据结构与设计清洗规则(上)大数据项目实战认识原始数据结构与识别脏数据CONTENTS目录分析数据结构01用户行为日志结构分析02订单数据结构分析03常见脏数据类型识别04分析数据结构01明确字段含义知道每个字段代表什么业务信息02确定字段顺序避免程序读取字段时发生错位03识别数据问题发现缺失值、格式错误、异常数值等脏数据大数据项目实战04设计清洗规则将“数据有问题”转化为“程序可判断的条件”先分析数据,再编写代码;先设计规则,再执行清洗。用户行为日志结构分析大数据项目实战CSV示例user_id,item_id,category_id,behavior_type,timestamp10001,235088,4387,pv,2024-05-0108:12:3010002,128977,9821,cart,2024-05-0108:15:0910001,235088,4387,buy,2024-05-0108:20:41字段序号字段名字段含义清洗关注点0user_id用户编号是否为空,是否为数字1item_id商品编号是否为空,是否为数字2category_id商品类目编号是否为空,是否为数字3behavior_type行为类型是否属于pv、fav、cart、buy4timestamp行为时间时间格式是否合法订单数据结构分析大数据项目实战CSV示例字段序号

字段名

字段含义

清洗关注点0order_id

订单编号

是否为空,是否重复1user_id

用户编号

是否为空,是否为数字2item_id

商品编号

是否为空,是否为数字3amount

订单金额

是否为数字,是否为负数4pay_time

支付时间

时间格式是否合法order_id,user_id,item_id,amount,pay_timeO202405010001,10001,235088,99.90,2024-05-0108:25:10O202405010002,10003,556781,0.00,2024-05-0109:01:33O202405010003,10008,998245,-15.00,2024-05-0109:12:040元订单不一定是异常,负数金额通常需要过滤。用代码查看字段数量大数据项目实战ShellpublicclassDataPreview{publicstaticvoidmain(String[]args){Stringline="10001,235088,4387,pv,2024-05-0108:12:30";String[]fields=line.split(",");System.out.println("字段数量:"+fields.length);for(inti=0;i<fields.length;i++){System.out.println(i+"->"+fields[i]);}}}预期输出字段数量:50->100011->2350882->43873->pv4->2024-05-0108:12:30split(","):按英文逗号切分fields.length:获取字段数量fields[3]:第4个字段behavior_typefor循环:逐个输出字段下标和值常见脏数据类型识别大数据项目实战不要盲目重复执行命令,先按顺序定位问题。脏数据类型

示例

可能影响

处理建议字段缺失10001,235088,,pv,2024-05-01

类目分析错误

过滤或补默认值字段数量不足10001,235088,pv

程序数组越界

直接过滤格式错误amount=abc

金额计算失败

过滤或记录异常非法枚举值behavior_type=click

行为分析失真

过滤或映射为unknown异常数值amount=-15.00

客单价计算错误

过滤负数金额云计算技术应用省级专业教学资源库分析数据结构与设计清洗规则(下)大数据项目实战将数据问题转化为程序规则CONTENTS目录清洗规则设计思路01用户行为日志清洗规则02订单数据清洗规则03清洗后输出格式设计04清洗规则设计思路01明确输入字段一行数据有哪些字段,每个字段代表什么02判断字段完整性字段数量是否正确,关键字段是否为空03判断字段合法性数字、时间、枚举值是否符合规则大数据项目实战04统一输出格式字段顺序、分隔符、时间格式保持一致数据问题→判断条件→清洗动作→输出结果05记录异常情况便于统计数据质量和排查问题用户行为日志清洗规则大数据项目实战Java检查项判断条件清洗动作字段数量fields.length==5不满足则过滤用户编号user_id非空且为数字不满足则过滤商品编号item_id非空且为数字不满足则过滤类目编号category_id非空且为数字不满足则过滤行为类型属于pv、fav、cart、buy不满足则过滤if(fields.length!=5){return;}if(!isNumber(userId)||!isNumber(itemId)){return;}if(!isValidBehavior(behaviorType)){return;}if(!isValidTime(timestamp)){return;}订单数据清洗规则大数据项目实战Java检查项判断条件清洗动作字段数量fields.length==5不满足则过滤订单编号order_id非空不满足则过滤用户编号user_id非空且为数字不满足则过滤商品编号item_id非空且为数字不满足则过滤订单金额amount为数字且>=0负数或非数字过滤if(fields.length!=5){return;}if(orderId==null||orderId.trim().isEmpty()){return;}if(!isNumber(userId)||!isNumber(itemId)){return;}if(!isValidAmount(amount)){return;}清洗后输出格式设计大数据项目实战用户行为日志输出格式字段数量:50->100011->2350882->43873->pv4->2024-05-0108:12:30user_id,item_id,category_id,behavior_type,event_time10001,235088,4387,pv,2024-05-0108:12:30订单数据输出格式order_id,user_id,item_id,amount,pay_timeO202405010001,10001,235088,99.90,2024-05-0108:25:10设计原则保留后续分析所需字段

删除无用字段和明显异常记录时间统一为yyyy-MM-ddHH:mm:ss分隔符统一使用英文逗号或制表符输出字段顺序固定,便于Hive建表清洗规则清单大数据项目实战清洗规则汇总:1.字段数量不符合要求:过滤2.关键字段为空:过滤3.编号字段不是数字:过滤4.行为类型不在合法范围:过滤5.时间字段无法解析:过滤6.金额字段不是数字:过滤7.金额为负数:过滤8.输出字段顺序统一9.输出时间格式统一10.记录异常数据数量,便于质量评估云计算技术应用省级专业教学资源库创建Maven工程与配置开发环境(上)大数据项目实战工程创建目录结构开发准备CONTENTS目录为什么使用Maven工程01创建MapReduce清洗项目02规划项目包结构03准备输入输出目录04为什么使用Maven工程大数据项目实战工程搭建不只是为了能运行一次,更是为了让项目稳定、清楚、便于交接。MapReduce程序依赖Hadoop类库,手动导入Jar包既繁琐,也容易遗漏Maven可以统一管理依赖版本,让项目在不同电脑上更容易恢复运行规范的工程结构方便后续打包、调试和团队协作本项目不追求一次跑通,而是要形成可维护的清洗程序传统方式下载多个Jar包逐个导入工程换电脑后重新配置Maven方式在pom.xml中声明依赖自动下载并统一管理便于迁移和协作创建MapReduce清洗项目大数据项目实战打开IntelliJIDEA后新建Project选择Maven类型,并确认JDK使用1.8填写工程名称DataCleaning等待Maven初始化完成后再继续操作工程路径建议使用英文目录,避免中文路径带来编码问题工程名称DataCleaningJDK版本JDK1.8项目类型MavenJavaProject项目目录结构规划大数据项目实战DataCleaning├──src│├──main││├──java│││└──cn.itcast.dataclean│││├──DataFormatter.java│││├──JobMapper.java│││└──JobDriver.java││└──resources│└──test│└──java├──input├──output└──pom.xmlDataFormatter封装字段校验时间转换金额判断JobMapper逐行解析原始数据过滤异常记录输出清洗结果JobDriver配置清洗作业设置输入输出路径启动本地运行input与output保存样本数据查看本地运行结果方便反复调试创建包和基础类文件大数据项目实战字段数量:50->100011->2350882->43873->pv4->2024-05-0108:12:30订单数据输出格式创建步骤在src/main/java下创建包cn.itcast.dataclean

在该包中创建DataFormatter、JobMapper、JobDriver三个类类名采用大驼峰命名,方法名采用小驼峰命名先写最小可用代码,再随着任务推进逐步完善packagecn.itcast.dataclean;publicclassDataFormatter{publicstaticbooleanisEmpty(Stringvalue){returnvalue==null||value.trim().isEmpty();}}代码片段作用package表示当前类所属的包DataFormatter是工具类名称isEmpty方法用于判断字符串是否为空trim方法可以去掉字符串前后的空格准备本地调试数据目录大数据项目实战本地调试数据建议:本地模式调试不建议一开始就使用大文件先准备少量样本数据,观察清洗规则是否生效样本中既要有正常数据,也要有典型异常数据这样能在早期发现问题,减少后续排错成本input/user_behavior_sample.csvinput/order_sample.csv样本文件建议10001,235088,4387,pv,2024-05-0108:12:3010002,128977,9821,cart,2024-05-0108:15:0910003,,9821,buy,2024-05-0108:20:4110004,188001,3201,click,2024-05-0108:35:12云计算技术应用省级专业教学资源库创建Maven工程与配置开发环境(下)大数据项目实战Hadoop依赖配置环境验证配置策略思考CONTENTS目录pom.xml文件的作用01引入Hadoop相关依赖02验证依赖是否生效03验证依赖是否生效04pom.xml文件的作用大数据项目实战pom.xml是Maven工程的核心配置文件它记录项目名称、版本、打包方式和依赖信息它还可以控制Java编译版本,减少环境差异后续打包清洗程序时,也要依赖这个文件完成构建项目信息名称版本打包方式依赖管理编译控制源码版本目标版本编码格式项目打包生成Jar包提交运行迁移部署HadoopCommonHadoopHDFSMapReduceCore配置Hadoop依赖大数据项目实战<dependencies><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>3.3.0</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-hdfs</artifactId><version>3.3.0</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-mapreduce-client-core</artifactId><version>3.3.0</version></dependency></dependencies>hadoop-common提供Hadoop基础类库,是很多组件共同依赖的底层包hadoop-hdfs提供HDFS文件系统相关类,便于程序访问分布式存储hadoop-mapreduce-client-core提供Mapper、Reducer、Job等MapReduce核心类配置Java编译版本大数据项目实战<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin></plugins></build>source表示源码使用的Java版本target表示编译后字节码的目标版本encoding统一设置为UTF-8,可减少中文乱码显式配置比依赖默认值更可靠验证依赖是否生效大数据项目实战packagecn.itcast.dataclean;importorg.apache.hadoop.io.Text;importorg.apache.hadoop.mapreduce.Mapper;publicclassJobMapperextendsMapper<Object,Text,Object,Text>{}查看IDEA右侧Maven面板点击ReloadAllMavenProjects

等待依赖下载完成检查ExternalLibraries中是否出现Hadoop相关Jar包创建最小JobMapper类,确认import不再报红常见配置问题大数据项目实战问题现象

可能原因

解决思路依赖下载很慢

网络不稳定或仓库访问慢

配置国内Maven镜像仓库import报红

Maven未刷新或依赖写错

重新加载Maven工程并检查pom.xml版本冲突

多个依赖间版本不一致

统一Hadoop依赖版本中文乱码

编码未统一

设置UTF-8编码本地能编译但运行失败

本地环境和集群环境差异

对齐JDK和Hadoop版本云计算技术应用省级专业教学资源库编写Mapper类实现数据解析与过滤(下)大数据项目实战空值判断、合法性校验与清洗结果输出CONTENTS目录判断关键字段是否为空01校验编号字段和行为类型02输出清洗后的规范化数据03优化过滤逻辑04判断关键字段是否为空大数据项目实战关键字段为空会影响后续统计结果user_id为空时,UV统计没有依据item_id为空时,商品分析无法继续behavior_type为空时,行为占比会失真timestamp为空时,活跃时段分析会失败if(DataFormatter.isEmpty(userId)||DataFormatter.isEmpty(itemId)||DataFormatter.isEmpty(categoryId)||DataFormatter.isEmpty(behaviorType)||DataFormatter.isEmpty(eventTime)){return;}publicstaticbooleanisEmpty(Stringvalue){returnvalue==null||value.trim().isEmpty();}校验编号字段和行为类型大数据项目实战publicstaticbooleanisNumber(Stringvalue){if(isEmpty(value)){returnfalse;}returnvalue.matches("\\d+");}JavaMapperif(!DataFormatter.isNumber(userId)||!DataFormatter.isNumber(itemId)||!DataFormatter.isNumber(categoryId)){return;}用户编号、商品编号和类目编号应由数字组成matches方法用于判断字符串是否符合正则表达式。\\d+表示一个或多个数字。感叹号表示取反,条件不满足时当前行被过滤校验行为类型是否合法大数据项目实战取值含义pv浏览fav收藏cart加购buy购买publicstaticbooleanisValidBehavior(StringbehaviorType){return"pv".equals(behaviorType)||"fav".equals(behaviorType)||"cart".equals(behaviorType)||"buy".equals(behaviorType);}JavaMapperif(!DataFormatter.isValidBehavior(behaviorType)){return;}输出清洗后的数据大数据项目实战JavacleanLine保存清洗后的整行文本字段顺序保持固定,后续Hive建表才不容易错位NullWritable.get表示输出key为空newText(cleanLine)保存输出内容context.write把结果写入输出文件StringcleanLine=userId+","+itemId+","+categoryId+","+behaviorType+","+eventTime;context.write(NullWritable.get(),newText(cleanLine));完整Mapper核心代码大数据项目实战@Overrideprotectedvoidmap(LongWritablekey,Textvalue,Contextcontext)throwsIOException,InterruptedException{Stringline=value.toString();String[]fields=line.split(",");if(fields.length!=5){return;}StringuserId=fields[0];StringitemId=fields[1];StringcategoryId=fields[2];StringbehaviorType=fields[3];StringeventTime=fields[4];if(DataFormatter.isEmpty(userId)||DataFormatter.isEmpty(itemId)||DataFormatter.isEmpty(categoryId)||DataFormatter.isEmpty(behaviorType)||DataFormatter.isEmpty(eventTime)){return;}if(!DataFormatter.isNumber(userId)||!DataFormatter.isNumber(itemId)||!DataFormatter.isNumber(categoryId)){return;}if(!DataFormatter.isValidBehavior(behaviorType)){return;}StringcleanLine=userId+","+itemId+","+categoryId+","+behaviorType+","+eventTime;context.write(NullWritable.get(),newText(cleanLine));}过滤逻辑的优化思路大数据项目实战1.将判断方法放入工具类

Mapper代码更简洁2.增加异常数据计数后续可以统计过滤了多少条数据3.增加日志输出调试时更容易定位问题4.按数据类型拆分Mapper

用户行为数据和订单数据可使用不同Mapper5.保留少量异常样本便于分析数据质量问题课堂讨论如果新数据中出现view行为,应该直接加入合法值,还是先确认业务口径。云计算技术应用省级专业教学资源库编写Driver类与本地模式调试程序(上)大数据项目实战Job配置输入输出路径作业启动CONTENTS目录Driver类在MapReduce中的作用01创建JobDriver基本结构02配置Mapper和输出类型03设置输入输出路径并启动作业04Driver类在MapReduce中的作用大数据项目实战1.创建Configuration对象用来保存作业运行所需的配置信息2.创建Job对象表示一个完整的MapReduce作业3.指定Mapper类告诉程序使用JobMapper处理输入数据4.设置输出类型让程序知道Mapper会输出什么类型的数据5.设置输入和输出路径指定原始数据从哪里读,清洗结果写到哪里6.提交作业并等待运行结束查看程序是否正常完成易错提醒Mapper写的是处理逻辑,Driver写的是运行安排。创建JobDriver基本结构大数据项目实战packagecn.itcast.dataclean;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.mapreduce.Job;publicclassJobDriver{publicstaticvoidmain(String[]args)throwsException{Configurationconf=newConfiguration();Jobjob=Job.getInstance(conf);}}Javamain方法是本地运行时的程序入口Configuration保存运行配置Job表示一个完整的MapReduce作业后续所有配置都会围绕job对象展开设置作业名称和主类大数据项目实战Configurationconf=newConfiguration();Jobjob=Job.getInstance(conf);job.setJobName("DataCleaningJob");job.setJarByClass(JobDriver.class);JavasetJobName用于设置作业名称作业名称会出现在运行日志或YARN页面中setJarByClass用于指定当前作业所属主类后续打包提交到集群时,这个配置很重要配置Mapper类和输出类型大数据项目实战job.setMapperClass(JobMapper.class);job.setMapOutputKeyClass(NullWritable.class);job.setMapOutputValueClass(Text.class);job.setOutputKeyClass(NullWritable.class);job.setOutputValueClass(Text.class);Java配置项作用setMapperClass指定清洗逻辑所在的Mapper类。setMapOutputKeyClass设置Mapper输出key类型。setMapOutputValueClass设置Mapper输出value类型。setOutputKeyClass和setOutputValueClass设置最终输出类型。设置输入输出路径大数据项目实战FileInputFormat.setInputPaths(job,newPath("input"));FileOutputFormat.setOutputPath(job,newPath("output"));Javainput目录中放入本地样本文件output目录由程序运行后自动生成运行前如果output已经存在,需要先删除MapReduce默认不允许输出目录提前存在云计算技术应用省级专业教学资源库编写Driver类与本地模式调试程序(下)大数据项目实战本地运行结果查看常见问题处理CONTENTS目录补全作业启动代码01准备本地输入样本02运行程序并查看输出结果03常见问题与调试习惯04补全作业启动代码大数据项目实战booleanresult=job.waitForCompletion(true);System.exit(result?0:1);waitForCompletion提交作业,并等待它跑完参数true控制台会打印运行过程信息,result为true说明作业正常完成System.exit根据结果返回状态码完整JobDriver代码大数据项目实战packagecn.itcast.dataclean;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.Path;importorg.apache.hadoop.io.NullWritable;importorg.apache.hadoop.io.Text;importorg.apache.hadoop.mapreduce.Job;importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;publicclassJobDriver{publicstaticvoidmain(String[]args)throwsException{Configurationconf=newConfiguration();Jobjob=Job.getInstance(conf);job.setJobName("DataCleaningJob");job.setJarByClass(JobDriver.class);

job.setMapperClass(JobMapper.class);job.setMapOutputKeyClass(NullWritable.class);job.setMapOutputValueClass(Text.class);job.setOutputKeyClass(NullWritable.class);job.setOutputValueClass(Text.class);FileInputFormat.setInputPaths(job,newPath("input"));FileOutputFormat.setOutputPath(job,newPath("output"));booleanresult=job.waitForCompletion(true);System.exit(result?0:1);}}准备本地输入样本大数据项目实战在项目根目录下创建input文件夹把user_behavior_sample.csv放入input目录样本中既要有正常数据,也要有异常数据10001,235088,4387,pv,2024-05-0108.12.3010002,128977,9821,cart,2024-05-0108.15.0910003,,9821,buy,2024-05-0108.20.4110004,188001,3201,click,2024-05-0108.35.1210005,188002,3201,buy,2024-05-0109.10.06运行程序并观察控制台大数据项目实战INFOmapreduce.JobJobjob_localrunninginubermodeINFOmapreduce.Jobmap100percentreduce0percentINFOmapreduce.JobJobjob_localcompletedsuccessfully观察要点:是否出现completedsuccessfully。是否生成output目录。控制台是否出现异常信息。如果程序失败,先看第一条红色报错。查看清洗输出结果大数据项目实战10001,235088,4387,pv,2024-05-0108.12.3010002,128977,9821,cart,2024-05-0108.15.0910005,188002,3201,buy,2024-05-0109.10.06结果分析:第三行被过滤,因为商品编号缺失。第四行被过滤,因为行为类型click不在合法范围内。其余三行符合规则,保留在输出结果中。课堂思考把输入和输出放在一起对照,数据是否一致?10001,235088,4387,pv,2024-05-0108.12.3010002,128977,9821,cart,2024-05-0108.15.0910003,,9821,buy,2024-05-0108.20.4110004,188001,3201,click,2024-05-0108.35.1210005,188002,3201,buy,2024-05-0109.10.06输出数据输入数据常见问题与处理办法大数据项目实战问题现象可能原因处理办法output目录已存在上一次运行结果未删除删除output后重新运行找不到input路径input目录位置不对确认目录在项目根路径下ClassNotFoundException类名或包名配置不一致检查JobMapper和JobDriver包名类型不匹配Mapper输出类型与Driver配置不同对照NullWritable和Text设置输出文件为空过滤条件过严或输入数据不符合规则回看样本数据和Mapper判断条件云计算技术应用省级专业教学资源库IDEA断点调试与MapReduce数据流追踪(上)大数据项目实战断点设置、单步执行与Mapper数据追踪CONTENTS目录为什么需要断点调试01认识IDEA调试界面02在Mapper中设置断点03单步执行与变量观察04为什么需要断点调试大数据项目实战精准定位报错位置01实时查看中间数据02观察代码执行流程,理清逻辑走向03排查变量值异常04分步执行,简化复杂逻辑排查05节省大量排错时间,提升开发效率06补全作业启动代码大数据项目实战packagecn.itcast.dataclean;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.Path;importorg.apache.hadoop.io.NullWritable;importorg.apache.hadoop.io.Text;importorg.apache.hadoop.mapreduce.Job;importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;publicclassJobDriver{publicstaticvoidmain(String[]args)throwsException{Configurationconf=newConfiguration();Jobjob=Job.getInstance(conf);job.setJobName("DataCleaningJob");job.setJarByClass(JobDriver.class);

job.setMapperClass(JobMapper.class);job.setMapOutputKeyClass(NullWritable.class);job.setMapOutputValueClass(Text.class);job.setOutputKeyClass(NullWritable.class);job.setOutputValueClass(Text.class);FileInputFormat.setInputPaths(job,newPath("input"));FileOutputFormat.setOutputPath(job,newPath("output"));booleanresult=job.waitForCompletion(true);System.exit(result?0:1);}}在Mapper中设置断点大数据项目实战单步执行与变量观察大数据项目实战F8执行当前行跳到下一行,不钻进方法内部F7如果有方法调用,会跟着进到方法内部F9一直跑直到遇到下一个断点云计算技术应用省级专业教学资源库IDEA断点调试与MapReduce数据流追踪(下)大数据项目实战Driver调试启动与数据流追踪CONTENTS目录从Driver启动调试模式01数据流完整追踪02条件断点与效率提升03从Driver启动调试模式大数据项目实战01从Driver启动右键代码编辑区选择Debug,程序开始运行02配置读取先读取配置,创建作业对象,绑定Mapper类03数据读取程序读取输入数据,一行一行送给Mapper处理04自动暂停执行到Mapper断点时自动暂停,IDEA高亮当前行MapReduce数据流完整追踪大数据项目实战条件断点与效率提升大数据项目实战01右键断点选择More选项,在Condition框里填写表达式02条件表达式比如parts.length<5,字段缺失才触发暂停03特定追踪或者userId.equals("10003"),只追踪特定用户04效率提升程序跳过大部分数据,只在满足条件时停下//在map方法第一行设置条件断点//条件:parts.length<5Stringline=value.toString();String[]parts=line.split(",");//只有字段缺失的数据才会在这里暂停if(parts.length!=5){return;}常见调试问题排查大数据项目实战程序没停在断点先检查是不是点了Run而不是Debug,再看断点是不是实心红点变量看不懂展开层次太多不知道看哪个,关注当前代码行用到的变量就行没输出文件可能是output目录已存在,程序报错退出了过滤太严所有数据都被过滤,输出文件是空的,检查业务逻辑云计算技术应用省级专业教学资源库将MR程序提交至Docker集群运行(上)大数据项目实战Maven打包原理与集群环境准备CONTENTS目录本地模式与集群模式01Maven打包原理02jar包结构解析03Docker集群状态确认04本地模式与集群模式大数据项目实战本地模式在IDEA里用的是本地模式。JVM直接在本机运行MapReduce程序。输入输出路径指向本地磁盘。这种方式方便调试,但处理不了大规模数据。集群模式集群模式下,程序提交到YARN资源调度器。YARN把Map任务分配到各个DataNode上执行。输入数据从HDFS读取,输出结果写回HDFS。多台机器并行处理,效率成倍提升。#clean清理旧的编译结果。#package重新编译并打包。

mvncleanpackageMaven打包原理大数据项目实战Java代码不能直接运行在集群上。需要先编译成字节码文件,也就是.class文件。再把所有class文件和依赖库打包成jar包。jar包本质上是一个压缩文件,JVM可以直接加载执行。Maven的clean命令会删除target目录。这个目录存放上一次编译生成的所有文件。如果不清理,旧文件可能和新文件混在一起。打包出来的jar包就会包含过期的class文件。package命令会执行完整的构建生命周期。先编译源代码,再运行单元测试。测试通过后,把所有class文件和资源文件打包。最终生成一个可执行的jar文件。为什么要clean旧文件残留是常见问题来源。养成clean后再package的习惯,每次打包都是从零开始,确保jar包内容完全最新。jar包结构解析大数据项目实战META-INF目录存放清单文件MANIFEST.MF。里面记录了jar包的版本、创建者等元数据。cn目录下是我们自己的代码。按照包名层次存放编译后的class文件。如果打包时包名配置错了,这里的路径也会错。lib目录存放第三方依赖。如果用了MavenShade插件,依赖会被合并进来。这样集群上运行时就不需要额外配置classpath。jar包内部结构META-INF/MANIFEST.MFcn/itcast/lib/第三方依赖jarDocker集群状态确认大数据项目实战NameNode、DataNode、ResourceManager都应该显示Up。如果有容器退出了,集群就无法正常工作。容器服务如果能列出根目录内容,说明NameNode和DataNode通信正常。如果报错连接拒绝,可能是容器没启动。存储服务打开浏览器访问ResourceManager的Web管理界面。能看到页面说明YARN调度服务已经就绪,可以接收作业提交了。调度服务#查看容器状态

dockerps#确认HDFS可访问

hdfsdfs-ls

/#确认YARN界面可访问

#浏览器打开云计算技术应用省级专业教学资源库将MR程序提交至Docker集群运行(下)大数据项目实战作业提交原理与运行监控CONTENTS目录程序文件与数据文件的存放位置01HDFS数据准备02hadoopjar命令解析03YARN监控与结果验证04程序文件与数据文件的存放位置大数据项目实战程序文件→容器本地jar包是程序文件,包含编译后的class字节码。它应该放在容器本地的文件系统里。我们用dockercp命令把jar包复制到NameNode容器中。为什么不需要放到HDFS上。因为Hadoop的分布式缓存机制会自动处理程序分发。YARN接收到作业后,会把jar包分发到各个运行Map任务的节点上。数据文件→HDFS数据文件是输入的原始数据。比如user_behavior.csv这种待处理的日志文件。它必须放在HDFS上,因为MapReduce从HDFS读取输入数据。这是分布式计算的设计要求。数据分散存储在多个DataNode上,Map任务就近读取。#程序文件上传到容器本地

dockercptarget/dataclean-1.0-SNAPSHOT.jarnamenode:/root/

#进入容器确认

dockerexec-itnamenodebashls/root/HDFS数据准备大数据项目实战-p参数表示如果父目录不存在,自动创建。这样可以避免目录不存在导致的报错。1.创建输入目录put命令把本地文件复制到HDFS指定路径。上传完成后,数据会被切分成多个块,分散存储在各个DataNode上。2.上传数据文件确认文件已经存在,再看一下文件大小是否和本地一致。大小不对就要重新上传,不能用残缺的数据文件跑作业。3.验证上传结果#创建HDFS输入目录

hdfsdfs-mkdir-p/input#上传数据文件

hdfsdfs-putuser_behavior.csv/input/#查看上传结果

hdfsdfs-ls/input/hadoopjar命令解析01jar包路径必须是容器内能访问到的绝对路径,比如/root/dataclean-1.0-SNAPSHOT.jar02主类全限定名要带包名,比如cn.itcast.dataclean.JobDriver。Hadoop通过反射找到main方法作为程序入口。03HDFS输入路径比如/input。MapReduce会读取这个目录下的所有文件作为输入。大数据项目实战04设计清洗规则比如/output。这个目录在提交作业时必须不存在。MapReduce不允许覆盖已有目录,防止误删历史结果。#提交MapReduce作业

hadoopjar/root/dataclean-1.0-SNAPSHOT.jarcn.itcast.dataclean.JobDriver/input/outputYARN监控与结果验证大数据项目实战程序文件→容器本地打开浏览器访问http://localhost:8088。页面上列出所有作业,找到自己提交的那个。点击作业名称进入详情页。能看到作业ID、运行状态、启动时间、Map任务进度。如果状态变成FAILED,详情页会显示错误原因。点击Logs链接可以查看Container日志。数据文件→HDFS作业成功后,输出目录里会有两个关键文件。_SUCCESS是标志文件,表示作业正常完成。part-m-00000是实际的结果数据文件。用命令查看输出内容。hdfsdfs-cat/output/part-m-00000把输出结果和输入数据对比,确认结果正确。#查看输出目录

hdfsdfs-ls/output/#查看结果文件内容

hdfsdfs-cat/output/part-m-00000云计算技术应用省级专业教学资源库查看YARN任务日志与排查运行错误(上)大数据项目实战YARN日志存储结构与查看方法CONTENTS目录为什么需要查看日志01YARN日志存储结构02命令行查看日志03Web界面查看日志04为什么需要查看日志01调试界面缺失YARN界面只显示作业成功还是失败,具体原因藏在日志里。02完整运行记录日志记录了从作业启动、任务分配到异常抛出的每一步。03特定数据触发有些错误只在特定数据上出现,本地小数据没触发,大数据就触发了。大数据项目实战04准确定位问题日志里能看到是哪一行数据导致的问题,以及具体的异常堆栈。YARN日志存储结构大数据项目实战YARN的日志分两层存储。第一层是NodeManager本地日志。每个容器运行的时候,标准输出和标准错误都写到NodeManager所在节点的本地磁盘上。路径一般在yarn.nodemanager.log-dirs配置指定的目录里。作业运行期间可以在这里看,但容器结束后日志可能被清理。第二层是日志聚合到HDFS。作业完成后,YARN会把分散在各个节点上的日志收集起来。统一上传到HDFS的一个特定目录里。默认路径是/tmp/logs/用户名/logs/应用ID。这样即使容器销毁了,日志仍然保留。#查看整个应用的日志yarnlogs-applicationIdapplication_1634567890000_0001#过滤异常信息yarnlogs-applicationIdapplication_1634567890000_0001|grepException#查看特定容器日志yarnlogs-applicationIdapplication_1634567890000_0001-containerIdcontainer_1634567890000_0001_01_000001命令行查看日志大数据项目实战命令行是最直接的查看方式,适合快速定位问题。查看应用级别的日志,用这个命令。yarnlogs-applicationIdapplication_xxxx_xxxx这个命令会返回整个应用的所有Container日志。包括Mapper、Reducer和ApplicationMaster的输出。如果日志很长,可以加grep过滤关键词。比如grepException只看异常信息。如果想看某个特定容器的日志,加上-containerId参数。yarnlogs-applicationIdxxx-containerIdcontainer_xxxWeb界面查看日志大数据项目实战除了命令行,YARN的Web界面也提供了日志查看入口。打开http://localhost:8088,找到你提交的作业。点击作业ID,进入作业详情页。页面上有Logs链接,点击后能看到各个任务的日志列表。每个任务对应一个Container,点击ContainerID就能看具体日志。日志内容通常分为stdout和stderr两部分。stdout是标准输出,程序里System.out.println的内容在这里。stderr是标准错误,异常信息和错误堆栈在这里。看错误的时候重点盯stderr。堆栈信息从下往上读,最下面一行是根本原因。页面上的日志可能显示不完整,内容太多会被截断。这时候回到命令行用yarnlogs查看全文。stdout标准输出,System.out.println的内容在这里。正常日志和调试信息都会输出到这个文件。stderr标准错误,异常信息和错误堆栈在这里。排查问题时重点查看这个文件。云计算技术应用省级专业教学资源库查看YARN任务日志与排查运行错误(下)大数据项目实战常见错误排查与日志分析实战CONTENTS目录常见错误类型与日志特征01内存不足问题的排查02类找不到问题的排查03数据格式错误的排查04常见错误类型与日志特征01配置和依赖问题日志里会出现找不到某个类的明确提示。02资源问题日志里会有内存溢出或者容器被终止的记录。03数据问题日志里会显示是哪一行数据触发了异常,以及具体的字段内容。大数据项目实战04权限和网络问题这类错误通常在作业启动阶段就出现,日志位置比较靠前。ClassNotFoundExceptionNoClassDefFoundErrorOutOfMemoryErrorContainerkilledbyYARNNumberFormatExceptionArrayIndexOutOfBoundsExceptionPermissiondeniedConnectionrefused#告诉YARN容器需要1024MB内存conf.set("mapreduce.map.memory.mb","1024");#告诉JVM堆内存上限800MB。留出余量,避免JVM实际使用超过YARN限制而被强制杀掉。conf.set("mapreduce.map.java.opts","-Xmx800m");内存不足问题的排查大数据项目实战01确认内存溢出日志里看到OutOfMemoryError或ContainerkilledbyYARNforexceedingmemorylimits02容器内存配置mapreduce.map.memory.mb告诉YARN这个Map任务需要多少内存01JVM堆内存配置mapreduce.map.java.opts设置JVM参数,堆内存上限要小于容器内存02留出余量JVM实际使用不能超过YARN限制,否则会被强制杀掉类找不到问题的排查大数据项目实战ClassNotFoundException是集群上常见的错误。明明本地跑得通,提交到集群就报错找不到类。日志里会有这样的信息。java.lang.ClassNotFoundException:cn.itcast.dataclean.JobMapper原因通常是jar包有问题。要么jar包没上传,要么上传了但路径写错了。要么jar包里确实缺少这个类,Maven打包时出了问题。还要检查Driver里setJarByClass的配置。job.setJarByClass(JobDriver.class);这个配置告诉Hadoop从哪个jar包加载类。如果写错了,Hadoop找不到依赖。数据格式错误的排查大数据项目实战01定位问题数据日志会显示出问题的那行数据内容,复制出来在本地单独测试02分析特殊之处看看这行数据有什么特殊,字段数量不对还是类型转换失败01完善校验逻辑在Mapper里增加字段长度检查、类型转换的try-catch,过滤异常数据02防御性编程数据质量问题在大数据场景中很常见,写代码时不能假设数据都是完美的java.lang.NumberFormatExceptionjava.lang.ArrayIndexOutOfBoundsException云计算技术应用省级专业教学资源库YARN常见异常专题排查实训(上)大数据项目实战资源类与配置类异常排查CONTENTS目录实训目标与排错思维01场景一Container内存超限02场景二JVM堆内存溢出03场景三Mapper输出类型不匹配04实训目标与排错思维大数据项目实战#YARN容器申请的内存总额conf.set("mapreduce.map.memory.mb","2048");#JVM堆内存上限。两个值要配合,JVM堆内存不能大于容器内存,留出空间给Native内存和overhead。conf.set("mapreduce.map.java.opts","-Xmx1600m");场景一Container内存超限大数据项目实战01识别日志特征日志里看到ContainerkilledbyYARNforexceedingmemorylimits,跟着Currentusage和limit对比02容器内存配置mapreduce.map.memory.mb向YARN申请容器内存额度,默认1024MB处理大文件时不够用01JVM堆内存配置mapreduce.map.java.opts设置JVM堆内存上限,要小于容器内存留出Native空间02配置不协调的后果JVM堆太小会OutOfMemory,太大加上Native内存超限额会被YARN杀掉场景二JVM堆内存溢出大数据项目实战01区分日志特征OutOfMemoryError是JVM报错,ContainerkilledbyYARN是YARN主动终止02数据量过大Mapper一次性加载太多记录,或者每条记录很大,解析后占用内存远超预期01代码内存泄漏创建太多对象又没及时释放,垃圾回收器来不及回收,堆内存被占满02排查与解决先看日志确认是堆溢出,再检查数据量和代码,调整参数缓解但根本要解决代码问题排查思路调整参数先看日志确认是堆溢出。然后检查数据量是否合理。再检查代码里有没有创建大量临时对象。conf.set("mapreduce.map.java.opts","-Xmx1600m");但根本解决还是要优化代码,或者减少单次处理的数据量。场景三Mapper输出类型不匹配大数据项目实战01类型严格一致Mapper输出的key-value类型必须和Driver里配置的类型完全一致02本地模式不严格本地调试时对类型检查没那么严格,集群上数据要序列化传输,类型不一致就会报错03常见错误Mapper输出NullWritable和Text,Driver配成了Text和Text,序列化时就会抛类型转换异常04解决办法检查setMapOutputKeyClass等四个配置项,确保和Mapper里context.write的类型一致检查四个配置项job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(IntWritable.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(Text.class);云计算技术应用省级专业教学资源库YARN常见异常专题排查实训(下)大数据项目实战路径数据类异常与系统化排错CONTENTS目录场景四jar包路径错误01场景五输入输出路径问题02场景六数据格式异常03系统化排错04场景四jar包路径错误大数据项目实战01存放位置jar包应该在容器本地文件系统里,不是HDFS也不是本地Windows磁盘02上传问题jar包没上传、上传位置错误、命令路径和实际路径不一致、文件名拼写大小写不对03版本一致性本地修改了代码但忘了重新打包,或者上传的是旧版本,都会导致奇怪错误排查步骤dockerexec进入容器ls查看目标目录dockercp重新上传确认修改时间是最新版场景五输入输出路径问题大数据项目实战01输出保护机制输出目录已存在时作业直接失败,防止新结果覆盖旧数据造成数据丢失02常见错误信息Outputdirectoryalreadyexists或Inputpathdoesnotexist03排查方法hdfsdfs-ls查看HDFS实际路径,确认输入目录存在且输出目录不存在04重新运行先删除旧输出目录再提交,hdfsdfs-rm-r很危险,生产环境要慎用关键约束输出目录已存在→作业失败输入目录不存在→作业失败重新运行前需删除旧输出hdfsdfs-ls/inputhdfsdfs-rm-r/output生产环境慎用rm-r场景六数据格式异常大数据项目实战01字段数量不符假设数据有5个字段,但原始数据里有一行只有4个,split后数组长度不够02类型转换失败某个字段应该是数字,但原始数据里写成了字母或空值,parseInt时就会报错03不可预测性几十万行数据里只有几行有问题,本地测试的小样本没触发,全量数据才暴露04防御性编程split之后先判断数组长度,类型转换用try-catch包裹,过滤异常数据而不是让程序崩溃NumberFormatException。或者ArrayIndexOutOfBoundsException。系统化排错大数据项目实战系统化排错五步法第一步观察现象看YARN界面状态和控制台报错,先收集信息。第二步归类异常判断属于资源、配置、数据还是环境问题。第三步定位日志用grep过滤关键词,从下往上读堆栈。第四步分析原因找到根因,不是表面现象。第五步验证修复修改后重新提交,不行就回到第一步。云计算技术应用省级专业教学资源库验证清洗结果与数据质量评估(上)大数据项目实战清洗结果查看与抽样验证CONTENTS目录任务回顾与验证目标01查看HDFS输出目录02抽样检查与对比分析03常见验证问题04任务回顾与验证目标大数据项目实战01提交程序将MapReduce清洗作业打包提交到Docker集群运行02查看日志通过YARNWeb界面和日志排查运行中的错误03异常排查掌握资源类、配置类、数据类异常的排查思路04结果验证清洗程序运行成功后,必须验证输出结果是否符合预期查看HDFS输出目录大数据项目实战hdfsdfs-cat/ecommerce/cleaned/part-r-00000|head-n20hdfsdfs-ls/ecommerce/cleaned/打开终端连接master容器,执行以上命令查看输出目录内容。如果看到类似part-r-00000这样的文件,说明Reduce阶段已经成功输出。文件名里的part-r表示这是Reduce任务的输出,后面的数字代表分区编号。再用cat命令查看文件前几行。屏幕上会显示清洗后的数据记录。这时候要留意每一行的字段数量是否一致

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论