省复赛(大数据)
本人系第九届华为ICT大赛实践赛云赛道选手,曾包揽省赛、中国总决赛及全球总决赛三项一等奖,并持有HCIE-Cloud Service认证。现通过本平台分享备赛经验与参赛心得,供各位同学参考。文中所述内容若有疏漏之处,恳请各位不吝指正,在此先行致谢!(建议首先阅读专栏首篇文章——【备赛指南】华为ICT大赛 实践赛 云赛道01,之后再逐步阅读后续内容)
一、大模型离线处理场景化解决方案
离线处理方案
(1) 离线批处理的概念
离线批处理:对海量历史数据进行处理和分析,生成结果数据,供下一步数据应用使用的过程
离线批处理对数据处理的时延要求不高,但是处理的数据量较大,占用的计算存储资源较多,通过MR作业、Spark作业、HQL作业实现
(2) 离线批处理的流程图
(3) 离线批处理的常用组件
①HDFS:分布式文件系统,为各种批处理引提供数据存储,可以存储各种文件格式数据
②YARN:资源调度引擎,为各种批处理引擎提供资源调度能力
③MapReduce:大数据批处理引擎,用于处理海量数据,但是处理速度较慢
④Hive:大数据SQL批处理引擎,用于处理SQL类批处理作业,但是处理速度较慢
⑤Spark:基于内存的数据处理引擎,适合海量数据,处理速度高效
· Spark SQL:Spark处理结构化数据的一个模块
离线处理技术框架介绍
(1) 数据存储HDFS
1. HDFS的概述
①HDFS的特性
(1)高容错性:认为硬件总是不可靠的
(2)高吞吐量:为大量数据访问的应用提供高吞吐量支持
(3)大文件存储:支持存储TB-PB级别的数据
②HDFS适合的应用场景
(1)大文件存储与访问
(2)流式数据访问
③HDFS不适合的应用场景
(1)大量小文件存储
(2)随机写入
(3)低延迟读取
2. HDFS的常用shell命令
hdfs dfs -cat:显示文件内容
hdfs dfs -ls:显示目录列表
hdfs dfs -rm:删除文件
hdfs dfs -put:上传目录/文件到HDFS
hdfs dfs -get:从HDFS下载目录/文件到本地
hdfs dfs -mkdir:创建目录
hdfs dfs -chmod/-chown:改变文件属组
hdfs dfsadmin -safemode:安全模式操作
hdfs dfsadmin -safemode:安全模式操作
hdfs dfsadmin -report:报告服务状态
3. HDFS的回收站机制
在HDFS里,删除文件时不会真正的删除,其实是放入回收站,回收站里的文件可以用来快速恢复误删文件
可以设置一个时间阀值(单位:分钟),当回收站里文件的存放时间超过这个阀值或是回收站被清空时,文件才会被彻底删除,并且释放占用的数据块
Hadoop回收站trash,默认是关闭的,若开启需要修改配置文件core-site.xml
(2) 数据仓库Hive
1. Hive的概述
Hive是基于Hadoop的数据仓库软件,可以查询和管理PB级别的分布式数据
Hive的特性:
①灵活方便的ETL(Extract/Transform/Load)
②支持MapReduce、Tez、Spark计算引擎
③可直接访问HDFS文件以及HBase
④易用易编程
2. Hive的内部表和外部表区别
①内部表
(1)CREATE/LOAD:数据移到仓库目录
(2)DROP:元数据和数据会被一起删除
修改外部表tableName为内部表: alter table tableName set tblproperties('EXTERNAL'='FALSE');
②外部表
(1)CREATE/LOAD:数据位置不移动
(2)DROP:只删除元数据
修改内部表tableName为外部表: alter table tableName set tblproperties('EXTERNAL'='TRUE');
③查询表的类型:desc formatted tableName
3. Hive的内置函数
①查看系统函数的用法:hive > show functions;
②显示函数的用法:hive > desc function upper;
③详细显示函数的用法:hive > desc function extended upper;
④常用函数
(1)数学函数,如round()、abs()、rand( )
(2)日期函数,如to_date()、current date()
(3)字符串函数,如trim()、length()、substr()
4. Hive的自定义UDF
当Hive提供的内置函数无法满足业务处理需要时,此时就可以考虑使用用户自定义函数,编写处理代码并在查询中使用
①UDF:用于接收单个数据行,并产生一个数据行作为输出
②UDAF:用于接收多个数据行,并产生一个数据行作为输出
③UDTF:用于接收单个数据行,并产生多个数据行作为输出
UDF开发步骤:
(1)继承"org.apache.hadoop.hive.ql.exec.UDF"
(2)实现一个evaluate()方法,编写要实现的逻辑
(3)打包并上传到HDFS里
(4)Hive创建临时函数
(5)调用该函数
5. Hive的调优
①数据倾斜
数据倾斜:指计算数据的时候,数据的分散度不够,导致大量的数据集中到了一台或者几台机器上计算,这些数据的计算速度远远低于平均计算速度,导致整个计算过程过慢
日常使用过程中,容易造成数据倾斜的原因:
(1)group by
(2)distinct count(distinct xx)
(3)join
②调优参数
set hive.map.aggr=true;:在map中会做部分聚集操作,效率更高但需要更多的内存
set hive.groupby.skewindata=true;:此时生成的查询计划会有两个MRJob,可实现数据倾斜时负载均衡
③map side join
set hive.auto.convert.join=true;:当连接一个较小和较大表的时候,把较小的表直接放到内存中去,然后再对较大的表进行map操作
④并行化执行
每个查询会被Hive转化为多个阶段,当有些阶段关联性不大时,可以并行化执行,减少整个任务的执行时间
开启任务并行执行:set hive.exec.parallel=true;
设置同一个sql允许并行任务的最大线程数(例如设置为8个): set hive.exec.parallel.thread.number=8;
6. 数据集市和数据仓库的区别
· 数据集市
①数据集市(Data Mart),也叫数据市场,数据集市就是满足特定的部门或者用户的需求按照多维的方式进行存储,包括定义维度、需要计算的指标、维度的层次等,生成面向决策分析需求的数据立方体
· 数据仓库
①为满足各类零散分析的需求,通过数据分层和数据模型的方式,并以基于业务和应用的角度将数据进行模块化的存储
②Hive数据仓库
(1)ODS层:原始数据层
(2)DWD层:结构和粒度与原始表保持一致,简单清洗
(3)DWS层:以DWD为基础,进行轻度汇总
(4)ADS层:为各种统计报表提供数据
分层的优点:
· 复杂问题简单化:将任务分解成多个步骤完成,每一层只处理单一的步骤,比较简单,并且方便定位问题
· 减少重复开发:规范数据分层,通过中间层数据,减少最大的重复计算,增加一次计算结果的复用性
· 隔离原始数据:避免数据异常或者数据敏感,使真实数据与统计数据解耦
(3) 离线分析SparkSQL
1. Spark的简介
Spark是基于内存的分布式批处理系统,它把任务拆分,然后分配到多个的CPU上进行处理,处理数据时产生的中间产物(计算结果)存放在内存中,减少了对磁盘的I/O操作,大大的提升了数据的处理速度,在数据处理和数据挖掘方面比较占优势
2. Spark的应用场景
①数据处理(Data Processing):可以用来快速处理数据,兼具容错性和可扩展性
②迭代计算(lterative Computation):支持迭代计算,有效应对复杂的数据处理逻辑
③数据挖掘(Data Mining):在海量数据基础上进行复杂的挖掘分析,可支持多种数据挖掘和机器学习算法
④流式处理(Streaming Processing):支持秒级延迟的流处理,可支持多种外部数据源
⑤查询分析(Query Analysis):支持SQL的查询分析,同时提供领域特定语言(DSL)以方便操作结构化数据,并支持多种外部数据源
3. Spark与MapReduce的对比
①性能上提升了100倍
②Spark的中间数据放在内存中,对于迭代运算的效率更高;进行批处理时更高效,同时有着更低的延迟
③Spark提供更多的数据集操作类型,编程模型比MapReduce更灵活,开发效率更高
④更高的容错能力(血统机制)
4. Spark的RDD
①RDD是分布式弹性数据集,可以理解一个存储数据的数据结构。Spark会把所要操作的数据,加载到RDD上,即RDD所有操作都是基于RDD来进行的。RDD是只读和可分区。要想对RDD进行操作,只能重新生成一个新的RDD
(1)从HDFS输入创建,或从与Hadoop兼容的其他存储系统中输入创建
(2)从父的RDD转换的到新的RDD
(3)从数据集合转换而来,通过编码实现
②RDD的存储
用户可以选择不同的存储级别缓存RDD以便重用
当前RDD默认是存储于内存,但当内存不足时,RDD会溢出到磁盘中
③窄依赖:指父RDD的每个分区只被子RDD的一个分区所使用。表现为一个父RDD的每一个分区对应于一个子RDD分区
④宽依赖:指父RDD的每个分区都可能被多个子RDD分区所使用。表现为父RDD的每个分区都被多个子RDD分区使用
5. Spark的Shuffle
Shuffle是划分DAG中stage的标识,同时影响 Spark执行速度的关键步骤
· RDD的Transformation函数中,分为窄依赖(narrow dependency)和宽依赖(wide dependency)的操作
· 窄依赖跟宽依赖的区别是是否发生Shuffle(洗牌)
6. Spark的算子
· Transformation
①Transformation是RDD的算子类型,它的返回值还是一个RDD
②Transformation操作属于懒操作(算子),不会真正触发RDD的处理计算
③变换方法的共同点:
(1)不会马上触发计算
(2)每当调用一次变换方法,都会产生一个新的RDD
④例如:map(func),flatMap(func)
· Action
①Action是RDD的算子,它的返回值不是一个RDD。Action操作是返回结果或者将结果写入存储的操作。Action是Spark应用启动执行的触发动作,得到RDD的相关计算结果或将RDD保存到文件系统中
②Collection -> Transformation -> RDD -> Action -> Result
7. Spark的对象
①SparkConf
(1)SparkConf用来对Spark进行任务参数配置的对象
(2)是通过键值对的形式,设置Spark任务执行时所需要的参数
(3)Spark读取任务参数的优先级是:代码配置>动态参数>配置文件
②SparkContext
(1)SparkContext是Spark的入口,相当于应用程序的main函数
(2)SparkContext表示与Spark集群的连接,可用于在该集群上创建RDD,记录计算结果和环境配置等信息
③SparkSession
(1)Spark 2.0中引入了SparkSession的概念,为用户提供一个统一的切入点来使用Spark的各项功能
(2)封装了SparkConf和SparkContext对象,方便用户使用Spark的各种API
8. SparkSQL
①SparkSQL的简介
SparkSQL是Spark用来处理结构化数据的模块,可以在Spark应用中直接使用SQL语句对数据进行操作
SQL语句通过SparkSQL模块解析为RDD执行计划,交给SparkCore执行
②SparkSQL的使用方式
通过SparkSession提交SQL语句。任务像普通Spark应用一样,提交到集群中分布式运行
JDBC:
应用加载JDBC驱动,然后统一提交到集群的JDBC Server执行
JDBC Server是单点服务,会成为任务执行的瓶颈,不能处理海量数据和高并发任务
③SparkSQL的关键概念DataSet
DataSet是一个由特定域的对象组成的强类型集合,可通过功能或关系操作并行转换其中的对象
DataSet以catalyst逻辑执行计划表示,并且数据以编码的二进制形式存储,不需要反序列化就可以执行sort、filter、shuffle等操作
Dataset是“懒惰”的,只在执行action操作时触发计算。当执行action操作时,Spark用查询优化程序来优化逻辑计划,并生成一个高效的并行分布式的物理计
④SparkSQL的使用场景
· 适合场景
(1)结构化数据处理
(2)对数据处理的实时性要求不高的场景
(3)需要处理PB级的大容量数据
· 不适合场景
(1)实时数据查询
⑤SparkSQL的简单查询
(1)查询:df.select("id","name").show()
(2)带条件的查询:df.select($"id",$"name").where($"name" === "bbb").show()
(3)排序查询
· df.select($"id",$"name").orderBy($"name".desc).show
· df.select($"id",$"name").sort($"name".desc).show
(4) 数据采集工具
由于大数据的数据源各种各样,由此对数据采集的挑战变的尤为突出。这里介绍几款常用数据采集工具
1. Sqoop
①Sqoop的简介
Sqoop是开源的工具,主要用于在Hadoop(Hive)与传统的数据库(MySQL、PostgreSQL)间进行数据的传递,可以将一个关系型数据库(例如:MySQL,Oracle,PostgreSQL等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中
②Sqoop的应用
③Sqoop的原理
· Sqoop Import原理
(1)Sqoop在import时,需要指定split-by参数。Sqoop根据不同的split-by参数值来进行切分然后将切分出来的区域分配到不同map中
(2)每个map中再处理数据库中获取的一行一行的值,写入到HDFS中
(3)同时split-by根据不同的参数类型有不同的切分方法,如比较简单的int型,Sqoop会取最大和最小split-by字段值,然后根据传入的num-mappers来确定划分几个区域
· Sqoop export原理
(1)获取导出表的schema、meta信息、和Hadoop中的字段match
(2)并行导入数据:将Hadoop上文件划分成若干个分片,每个分片由一个Map Task进行数据导入
2. Loader
①Loader的简介
Loader是实现 Fusionnsight与关系型数据库、文件系统之间交换数据和文件的数据加载工具
(1)提供可视化向导式的作业配置管理界面
(2)提供定时调度任务,周期性执行Loader作业
(3)在界面中可指定多种不同的数据源、配置数据的清洗和转换步骤、配置集群存储系统等
②Loader的应用场景
③Loader的特点
(1)图形化:提供图形化配置、管理界面,操作简便
(2)高性能:利用MapReduce并行处理数据
(3)高可靠:Loader Server采用主备双机。作业通过MapReduce执行,支持失败重试。作业失败后,不会残留数据
(4)安全:Kerberos认证作业权限管理。
离线批处理实战
(1) 场景说明
某公司拥有一个购物网站,用户在登录网站、点击商品、收藏商品、购买商品时都会产生行为日志,该公司希望结合业务数据库中的数据和日志数据,进行大数据分析,得到分析结果作为公司决策依据
(2) 客户需求
网站产生的日志包含如下特点:
(1)数据量大
(2)价值密度低
(3)数据的业务种类多
客户希望通过数据分层,让底层数据和指标数据分层,最终得到相关业务指标的数据
(3) 数据源
数据来自于网站,网站通过在网页内代码埋点,用户每一次操作,都会将相关信息传到日志服务器,日志采集工具采集日志服务器上的数据,然后会对数据进行简单的处理过滤,最后将数据按照日期存到HDFS上
(4) 设计分析
数据源:网站产生的日志
存储数据:HDFS上的不同目录下的数据
构建数据仓库:根据业务数据分层
分析数据:相关指标,GMV,活跃度等
结果的展示:网页版报表显示
(5) 方案架构-组件选取
数据导入导出:Loader
数据存储:HDFS、MySQL
数据计算:Hive
(6) 方案架构-方案流程