(全国职业技能比赛:高职)GZ033大数据应用开发赛题第04套.docx
- 文档编号:30850347
- 上传时间:2024-02-15
- 格式:DOCX
- 页数:21
- 大小:47.07KB
(全国职业技能比赛:高职)GZ033大数据应用开发赛题第04套.docx
《(全国职业技能比赛:高职)GZ033大数据应用开发赛题第04套.docx》由会员分享,可在线阅读,更多相关《(全国职业技能比赛:高职)GZ033大数据应用开发赛题第04套.docx(21页珍藏版)》请在冰豆网上搜索。
2023年全国职业院校技能大赛
赛题第04套
赛项名称:
大数据应用开发
英文名称:
BigDataApplicationDevelopment
赛项组别:
高等职业教育组
赛项编号:
GZ033
背景描述
工业互联网是工业全要素、全产业链、全价值链的全面连接,是人、机、物、工厂互联互通的新型工业生产制造服务体系,是互联网从消费领域向生产领域、从虚拟经济向实体经济拓展的核心载体,是建设现代化经济体系、实现高质量发展和塑造全球产业竞争力的关键支撑,工业大数据则是工业互联网实现工业要素互联之后的核心价值创造者。随着大数据行业的发展,工业数据收集呈现时间维度不断延长、数据范围不断扩大、数据粒度不断细化的趋势。以上三个维度的变化使得企业所积累的数据量以加速度的方式在增加,最终构成了工业大数据的集合。
为完成工业大数据分析工作,你所在的小组将应用大数据技术,以Scala作为整个项目的基础开发语言,基于大数据平台综合利用
Hudi、Spark、Flink、Vue.js等技术,对数据进行处理、分析及可视化呈现,你们作为该小组的技术人员,请按照下面任务完成本次工作。
任务A:
大数据平台搭建(容器环境)(15分)
环境说明:
服务端登录地址详见各任务服务端说明。
补充说明:
宿主机及各容器节点可通过Asbru工具或SSH客户端进行SSH访问。
子任务一:
Hadoop完全分布式安装配置
本任务需要使用root用户完成相关配置,安装Hadoop需要配置前置环境。
命令中要求使用绝对路径,具体要求如下:
1、从宿主机/opt目录下将文件hadoop-3.1.3.tar.gz、jdk-8u212-linux-x64.tar.gz复制到容器Master中的/opt/software路径中(若路径不存在,则需新建),将Master节点JDK安装包解压到/opt/module路径中(若路径不存在,则需新建),将JDK解压命令复制并粘贴至客户端桌面【Release\任务A提交结果.docx】中对应的任务序号下;
2、修改容器中/etc/profile文件,设置JDK环境变量并使其生效,配置完毕后在Master节点分别执行“java-version”和“javac”命令,将命令行执行结果分别截图并粘贴至客户端桌面【Release\任务A提交结果.docx】中对应的任务序号下;
3、请完成host相关配置,将三个节点分别命名为master、slave1、slave2,并做免密登录,用scp命令并使用绝对路径从Master复制JDK解压后的安装文件到slave1、slave2节点(若路径不存在,则需新建),并配置slave1、slave2相关环境变量,将全部scp复制JDK的命令复制并粘贴至客户端桌面【Release\任务A提交结果.docx】中对应的任务序号下;
4、在Master将Hadoop解压到/opt/module(若路径不存在,则需新建)目录下,并将解压包分发至slave1、slave2中,其中master、slave1、slave2节点均作为datanode,配置好相关环境,初始化Hadoop环境namenode,将初始化命令及初始化结果截图(截取初始化结果日志最后20行即可)粘贴至客户端桌面【Release\任务A提交结果.docx】中对应的任务序号下;
5、启动Hadoop集群(包括hdfs和yarn),使用jps命令查看Master节点与slave1节点的Java进程,将jps命令与结果截图粘贴至客户端桌面【Release\任务A提交结果.docx】中对应的任务序号下。
子任务二:
SparkonYarn安装配置
本任务需要使用root用户完成相关配置,已安装Hadoop及需要配置前置环境,具体要求如下:
1、从宿主机/opt目录下将文件spark-3.1.1-bin-hadoop3.2.tgz复制到容器Master中的/opt/software(若路径不存在,则需新建)中,将Spark包解压到/opt/module路径中(若路径不存在,则需新建),将完整解压命令复制粘贴至客户端桌面【Release\任务A提交结果.docx】中对应的任务序号下;
2、修改容器中/etc/profile文件,设置Spark环境变量并使环境变量生效,在/opt目录下运行命令spark-submit--version,将命令与结果截图粘贴至客户端桌面【Release\任务A提交结果.docx】中对应的任务序号下;
3、完成onyarn相关配置,使用sparkonyarn的模式提交$SPARK_HOME/examples/jars/spark-examples_2.12-3.1.1.jar运行的主类为org.apache.spark.examples.SparkPi,将运行结果截图粘贴至客户端桌面【Release\任务A提交结果.docx】中对应的任务序号下(截取Pi结果的前后各5行)。
(运行命令为:
spark-submit--masteryarn--classorg.apache.spark.examples.SparkPi$SPARK_HOME/examples/jars/spark-examples_2.12-3.1.1.jar)
子任务三:
Hudi安装配置
本任务需要使用root用户完成相关配置,具体要求如下:
1、从宿主机/opt目录下将maven相关安装包复制到容器Master中的/opt/software(若路径不存在,则需新建)中,将maven相关安装包解压到/opt/module/目录下(若路径不存在,则需新建)并配置maven本地库为/opt/software/RepMaven/,远程仓库使用阿里云镜像,配置maven的环境变量,并在/opt/下执行mvn-v,将运行结果截图粘贴至客户端桌面【Release\任务A提交结果.docx】中对应的任务序号下;
2、从宿主机/opt目录下将Hudi相关安装包复制到容器Master中的/opt/software(若路径不存在,则需新建)中,将Hudi相关安装包解压到/opt/module/目录下(若路径不存在,则需新建),将命令复制并粘贴至客户端桌面【Release\任务A提交结果.docx】中对应的任务序号下;
3、完成解压安装及配置后使用maven对Hudi进行构建(spark3.1,scala-2.12),编译完成后与Spark集成,集成后使用spark-shell操作Hudi,将spark-shell启动使用spark-shell运行下面给到的案例,并将最终查询结果截图粘贴至客户端桌面【Release\任务A提交结果.docx】中对应的任务序号下。
(提示:
编译需要替换以下内容:
1.将父模块pom.xml替换;
2.hudi-common/src/main/java/org/apache/hudi/common/table/log/block/HoodieParquetDataBlock.java替换;
2.将packaging/hudi-spark-bundle/pom.xml替换;
3.将packaging/hudi-utilities-bundle/pom.xml替换)
importorg.apache.hudi.QuickstartUtils._
importscala.collection.JavaConversions._
importorg.apache.spark.sql.SaveMode._
importorg.apache.hudi.DataSourceReadOptions._
importorg.apache.hudi.DataSourceWriteOptions._
importorg.apache.hudi.config.HoodieWriteConfig._
importmon.model.HoodieRecord
valtableName="hudi_trips_cow"
valbasePath="file:
///tmp/hudi_trips_cow"
valdataGen=newDataGenerator
valinserts=convertToStringList(dataGen.generateInserts(10))
valdf=spark.read.json(spark.sparkContext.parallelize(inserts,2))
df.write.format("hudi").
options(getQuickstartWriteConfigs).
option(PRECOMBINE_FIELD_OPT_KEY,"ts").
option(RECORDKEY_FIELD_OPT_KEY,"uuid").
option(PARTITIONPATH_FIELD_OPT_KEY,"partitionpath").
option(TABLE_NAME,tableName).
mode(Overwrite).
save(basePath)
valtripsSnapshotDF=spark.read.format("hudi").load(basePath+"/*/*/*/*")
tripsSnapshotDF.createOrReplaceTempView("hudi_trips_snapshot")
spark.sql("selectfare,begin_lon,begin_lat,tsfromhudi_trips_snapshotwherefare>20.0").show()
任务B:
离线数据处理(25分)
环境说明:
服务端登录地址详见各任务服务端说明。
补充说明:
各节点可通过Asbru工具或SSH客户端进行SSH访问;
主节点MySQL数据库用户名/密码:
root/123456(已配置远程连接);
Spark任务在Yarn上用Client运行,方便观察日志。
子任务一:
数据抽取
编写Scala代码,使用Spark将MySQL库中表ChangeRecord,BaseMachine,MachineData,ProduceRecord全量抽取到Hudi的hudi_gy_ods库(路径为/user/hive/warehouse/hudi_gy_ods.db)中对应表changerecord,basemachine,machinedata,producerecord中。
1、抽取MySQL的shtd_industry库中ChangeRecord表的全量数据进入Hudi的hudi_gy_ods库中表changerecord,字段排序、类型不变,分区字段为etldate,类型为String,且值为当前比赛日的前一天日期(分区字段格式为yyyyMMdd)。
PRECOMBINE_FIELD使用ChangeEndTime,ChangeID和ChangeMachineID作为联合主键。
使用spark-sql的cli执行selectcount(*)fromhudi_gy_ods.changerecord命令,将spark-sql的cli执行结果分别截图粘贴至客户端桌面【Release\任务B提交结果.docx】中对应的任务序号下;
2、抽取MySQL的shtd_industry库中BaseMachine表的全量数据进入Hudi的hudi_gy_ods库中表basemachine,字段排序、类型不变,分区字段为etldate,类型为String,且值为当前比赛日的前一天日期(分区字段格式为yyyyMMdd)。
PRECOMBINE_FIELD使用MachineAddDate,BaseMachineID为主键。
使用spark-sql的cli执行showpartitionshudi_gy_ods.basemachine命令,将cli的执行结果分别截图粘贴至客户端桌面【Release\任务B提交结果.docx】中对应的任务序号下;
3、抽取MySQL的shtd_industry库中ProduceRecord表的全量数据进入Hudi的hudi_gy_ods库中表producerecord,剔除ProducePrgCode字段,其余字段排序、类型不变,分区字段为etldate,类型为String,且值为当前比赛日的前一天日期(分区字段格式为yyyyMMdd)。
PRECOMBINE_FIELD使用ProduceCodeEndTime,ProduceRecordID和ProduceMachineID为联合主键。
使用spark-sql的cli执行showpartitionshudi_gy_ods.producerecord命令,将spark-sql的cli的执行结果分别截图粘贴至客户端桌面【Release\任务B提交结果.docx】中对应的任务序号下;
4、抽取MySQL的shtd_industry库中MachineData表的全量数据进入Hudi的hudi_gy_ods库中表machinedata,字段排序、类型不变,分区字段为etldate,类型为String,且值为当前比赛日的前一天日期(分区字段格式为yyyyMMdd)。
PRECOMBINE_FIELD使用MachineRecordDate,MachineRecordID为主键。
使用spark-sql的cli执行showpartitionshudi_gy_ods.machinedata命令,将cli的执行结果分别截图粘贴至客户端桌面【Release\任务B提交结果.docx】中对应的任务序号下。
子任务二:
数据清洗
编写Scala代码,使用Spark将hudi_gy_ods库中相应表数据全量抽取到Hudi的hudi_gy_dwd库(路径为/user/hive/warehouse/hudi_gy_dwd.db)中对应表中。
表中有涉及到timestamp类型的,均要求按照yyyy-MM-ddHH:
mm:
ss,不记录毫秒数,若原数据中只有年月日,则在时分秒的位置添加00:
00:
00,添加之后使其符合yyyy-MM-ddHH:
mm:
ss。
1、抽取hudi_gy_ods库中changerecord的全量数据进入Hudi的hudi_gy_dwd库中表fact_change_record,分区字段为etldate且值与hudi_gy_ods库的相对应表该值相等,并添加dwd_insert_user、dwd_insert_time、dwd_modify_user、dwd_modify_time四列,其中dwd_insert_user、dwd_modify_user均填写“user1”,dwd_insert_time、dwd_modify_time均填写当前操作时间,并进行数据类型转换。
dwd_modify_time作为preCombineField,change_id和change_machine_id作为联合primaryKey。
使用spark-sql的cli按照change_machine_id、change_id均为降序排序,查询前1条数据,将结果截图粘贴至客户端桌面【Release\任务B提交结果.docx】中对应的任务序号下;
2、抽取hudi_gy_ods库中basemachine的全量数据进入Hudi的hudi_gy_dwd库中表dim_machine。
分区字段为etldate且值与hudi_gy_ods库的相对应表该值相等,并添加dwd_insert_user、dwd_insert_time、dwd_modify_user、dwd_modify_time四列,其中dwd_insert_user、dwd_modify_user均填写“user1”,dwd_insert_time、dwd_modify_time均填写当前操作时间,并进行数据类型转换。
dwd_modify_time作为preCombineField,Base_machine_id作为primaryKey。
使用spark-sql的cli按照Base_machine_id升序排序,查询dim_machine前2条数据,将结果截图粘贴至客户端桌面【Release\任务B提交结果.docx】中对应的任务序号下;
3、抽取hudi_gy_ods库中producerecord的全量数据进入Hudi的hudi_gy_dwd库中表fact_produce_record,分区字段为etldate且值与hudi_gy_ods库的相对应表该值相等,并添加dwd_insert_user、dwd_insert_time、dwd_modify_user、dwd_modify_time四列,其中dwd_insert_user、dwd_modify_user均填写“user1”,dwd_insert_time、dwd_modify_time均填写当前操作时间,并进行数据类型转换。
dwd_modify_time作为preCombineField,produce_record_id和produce_machine_id作为联合primaryKey。
使用spark-sql的cli按照produce_machine_id、produce_record_id均为升序排序,查询fact_produce_record前1条数据,将结果截图粘贴至客户端桌面【Release\任务B提交结果.docx】中对应的任务序号下;
4、抽取hudi_gy_ods库中machinedata的全量数据进入Hudi的hudi_gy_dwd库中表fact_machine_data。
分区字段为etldate且值与hudi_gy_ods库的相对应表该值相等,并添加dwd_insert_user、dwd_insert_time、dwd_modify_user、dwd_modify_time四列,其中dwd_insert_user、dwd_modify_user均填写“user1”,dwd_insert_time、dwd_modify_time均填写当前操作时间,并进行数据类型转换。
dwd_modify_time作为preCombineField,machine_record_id作为primaryKey。
使用spark-sql的cli按照machine_id、machine_record_id均为降序排序,查询前1条数据,将结果截图粘贴至客户端桌面【Release\任务B提交结果.docx】中对应的任务序号下。
子任务三:
指标计算
1、本任务基于以下2、3、4小题完成,使用DolphinScheduler完成第2、3、4题任务代码的调度。
工作流要求,使用shell输出“开始”作为工作流的第一个job(job1),2、3、4题任务为并行任务且它们依赖job1的完成(命名为job2、job3、job4),job2、job3、job4完成之后使用shell输出“结束”作为工作流的最后一个job(endjob),endjob依赖job2、job3、job4,并将最终任务调度完成后的工作流截图,将截图粘贴至客户端桌面【Release\任务B提交结果.docx】中对应的任务序号下;
2、编写Scala代码,使用Spark根据hudi_gy_dwd层的fact_change_record表统计每个月(change_start_time的月份)、每个设备、每种状态的时长,若某状态当前未结束(即change_end_time值为空)则该状态不参与计算。
计算结果存入ClickHouse数据库shtd_industry的machine_state_time表中(表结构如下),然后在Linux的ClickHouse命令行中根据设备id、状态持续时长均为降序排序,查询出前10条,将SQL语句复制粘贴至客户端桌面【Release\任务B提交结果.docx】中对应的任务序号下,将执行结果截图粘贴至客户端桌面【Release\任务B提交结果.docx】中对应的任务序号下;
字段
类型
中文含义
备注
machine_id
int
设备id
change_record_state
varchar
状态
duration_time
varchar
持续时长(秒)
当月该状态的时长和
year
int
年
状态产生的年
month
int
月
状态产生的月
3、编写Scala代码,使用Spark根据hudi_gy_dwd层的fact_change_record表关联dim_machine表统计每个车间中所有设备运行时长(即设备状态为“运行”)的中位数在哪个设备(为偶数时,两条数据原样保留输出),若某个设备运行状态当前未结束(即change_end_time值为空)则该状态不参与计算,计算结果存入ClickHouse数据库shtd_industry的machine_running_median表中(表结构如下),然后在Linux的ClickHouse命令行中根据所属车间、设备id均为降序排序,查询出前5条数据,将SQL语句复制粘贴至客户端桌面【Release\任务B提交结果.docx】中对应的任务序号下,将执行结果截图粘贴至客户端桌面【Release\任务B提交结果.docx】中对应的任务序号下;
字段
类型
中文含义
备注
machine_id
int
设备id
machine_factory
int
所属车间
total_running_time
int
运行总时长
结果以秒为单位
4、编写Scala代码,使用Spark根据hudi_gy_dwd层的fact_produce_record表,基于全量历史数据计算各设备生产一个产品的平均耗时,produce_code_end_time值为1900-01-0100:
00:
00的数据为脏数据,需要剔除(注:
fact_produce_record表中,一条数据代表加工一个产品,produce_code_start_time字段为开始加工时间,produce_code_end_time字段为完成加工时间),将设备每个产品的耗时与该设备平均耗时作比较,保留耗时高于平均值的产品数据,将得到的数据写入ClickHouse数据库shtd_industry的machine_produce_per_avgtime表中(表结构如下),然后在Linux的ClickHouse命令行中根据设备id降序排序查询前3条数据,将SQL语句复制粘贴至客户端桌面【Release\任务B提交结果.docx】中对应的任务序号下,将执行结果截图粘贴至客户端桌面【Release\任务B提交结果.docx】中对应的任务序号下;
machine_produ
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 全国 职业技能 比赛 高职 GZ033 数据 应用 开发 赛题第 04
![提示](https://static.bdocx.com/images/bang_tan.gif)