一.2023.3.21阅读
论文MapReduce ——3.实现
《大数据之路》 28/339
二.欢聚面经
1.介绍DataX
1)概述
DataX 是阿里巴巴开源的一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。
2)设计理念
为了解决异构数据源同步问题,DataX将复杂的网状的同步链路变成了星型数据链路,DataX作为中间传输载体负责连接各种数据源。当需要接入一个新的数据源的时候,只需要将此数据源对接到DataX,便能跟已有的数据源做到无缝数据同步。
3)框架设计
DataX本身作为离线数据同步框架,采用Framework + plugin架构构建。将数据源读取和写入抽象成为Reader/Writer插件,纳入到整个同步框架中。
![](https://i-blog.csdnimg.cn/blog_migrate/0d7e1430ad822d0c97f8dc7570f80f1e.png)
4)运行流程
![](https://i-blog.csdnimg.cn/blog_migrate/5dea794f0962830f4db15c37e73db1f4.png)
Job(单个数据同步的作业)——Split(切分)根据不同数据的切分策略——切成多个Task(是DataX最小工作单元)——Scheduler调度模块对task进行分组——TaskGroup(负责以一定的并发度运行分配Task,单个TaskGroup的并发度为5)
每个Task启动后,都会固定启动Reader——Channel——Writer的线程来完成同步作业
5)调度决策
比如用户提交一个DataX作业,配置总并发度为20。对100张分表的mysql数据源进行同步。
调度思路:
a)DataX Job根据分库分表切分策略,将同步工作分成100个Task。
b)根据配置的总的并发度20,以及每个Task Group的并发度5,DataX计算共需要分配4个TaskGroup。
c)4个TaskGroup平分100个Task,每一个TaskGroup负责运行25个Task。
6)DataX与Sqoop对比
*功能* | *DataX* | *Sqoop* |
运行模式 | 单进程多线程 | MR |
分布式 | 不支持,可以通过调度系统规避 | 支持 |
流控 | 有流控功能 | 需要定制 |
统计信息 | 已有一些统计,上报需定制 | 没有,分布式的数据收集不方便 |
数据校验 | 在core部分有校验功能 | 没有,分布式的数据收集不方便 |
监控 | 需要定制 | 需要定制 |
2.介绍HDFS
1)概述
HDFS是用于数据存储的分布式文件系统,通过目录树来定位文件,具有高可靠性、高吞吐量。
分布式体现:由众多服务器联合起来实现,集群中的服务器有各自的角色。
2)使用场景
适合一次写入,多次读出的场景。一个文件经过创建、写入和关闭之后就不需要改变
3)组成架构
主要由四个部分组成:Client、NameNode、DataNode和SecondaryNameNode
①Client
客户端
a)管理访问HDFS:(比如启动或者关闭HDFS)
b)文件切分:文件上传HDFS的时候,Client将文件切分成一个一个Block进行存储
c)与NameNode交互:获取文件的位置信息
d)与DataNode交互:读取或写入数据
②NameNode
Master。整个Hadoop的主管、管理者
a)处理客户端读写请求
b)管理HDFS的目录树和相关文件元数据信息(以“ fsimage”(HDFS 元数据镜像文件)和“ editlog”(HDFS 文件改动日志)两个文件形式存放在本地磁盘)
c)监控各个DataNode的健康状态,发现某个DataNode宕掉,则将其移出并重新备份其上面数据
d)配置副本策略
③DataNode
Slave。NameNode下达命令,DataNode执行实际操作
a)存储实际的数据存储
b)执行数据库的读/写操作
④Secondary NameNode
并非NameNode的热备。当NameNode挂掉的时候,并不能马上替换NameNode并提供服务
a)辅助NameNode,分担其工作量
b)定期合并Fsimage和Edits,并推送给NameNode
c)在紧急情况下,可辅助回复NameNode
3.Hadoop、hive、hdfs、spark关系
引用快手一面:讲一讲 Hadoop、Hive、Spark 之间的关系? (qq.com)
Hadoop是一个集群计算框架,用于处理大型数据集。它包括多个组件,其中包括分布式文件系统HDFS和数据处理框架MapReduce。
Hive是一个在Hadoop上运行的数据仓库软件,它允许使用类SQL的查询语言进行数据分析。它可以将结构化数据映射到HDFS上,并将查询编译为MapReduce任务来处理。
HDFS是Hadoop的分布式文件系统,它可以将大型数据集存储在多个计算机集群上,并提供高可靠性和容错性。
Spark是一个快速的、分布式的计算引擎,可以在Hadoop上运行。它包括一个用于数据处理的分布式计算框架,可以在内存中进行计算,比MapReduce更快。
因此,四个技术在处理大型数据集时有着紧密的关联和互相补充的作用。Hadoop提供了一个大型数据集的处理框架和基础设施,Hive提供了一个易于理解和使用的查询语言,HDFS提供了数据的可靠性和容错性,而Spark提供了更快速和机器学习等高级数据分析工具。
4.数仓分层
1)为什么分层
为了实现维度建模,进而支撑决策分析目标。
数据分层从关系型在线交易系统到面向主题的数据仓库系统,从范式建模到维度建模的并经之路。
2)分层作用
分层的核心思想就是解耦,再解耦,把复杂的问题简单化。
隔离原始数据:不论是数据的异常还是数据敏感度,使真实数据与统计数据解耦开。
数据结构化更清晰:每一个数据分层都有它的作用域和职责,在使用表的时候能更方便地定位和理解。
数据血缘追踪:提供给外界使用的是一张业务表,但是这张业务表可能来源很多张表。如果有一张来源表出问题了,我们可以快速准确的定位到问题,并清楚每张表的作用范围。
增强数据复用能力:减少重复开发,通过数据分层规范化,开发一些通用的中间层数据,能够减少重复计算,提高单张业务表的使用率,提升系统的执行效率。
简化复杂的问题:把一个复杂的业务分成多个步骤实现,每一层只处理单一的生骤,比较简单和容易理解。而且便于维护数据的准确性,当数据出现问题之后,可以不用修复所有的数据,只需要从有问题的步骤开始修复。
减少业务的影响:业务可能会经常委化,这样做就不必改一次业务就需要重新接入数据。
减少重复开发:规范数据分层,开发一些通用的中间层数据,能够减少极大的重复计算。
统一数据口径:通过数据分层,提供统一的数据出口,统一对外输出的数据口径。
3)分层
五层分层如下:
第一层:
ODS一一原始数据层:存放原始数据
第二层:
DWD一一数据明细层:对oDs层数据进行清洗、维度退化、脱敏等。
第三层:
DWS一一数据汇总层:对DWD层数据进行一个轻度的汇总。
第四层:
ADS一一数据应用层:为各种统计报表提供数据
该层是基于DW层的数据,整合汇总成主题域的服务数据,用于提供后续的业务查询等。
第五层:
DIM一一维表层:基于维度建模理念思想,建立整个企业的一致性维度。
维表层主要包含两部分数据:
高基数维度数据:一般是用户资料表、商品资料表类似的资料表。数据量可能是千万级或者上亿级别。
低基数维度数据:一般是配置表,比如枚举值对应的中文含义,或者日期维表。数据量可能是个位数或者几千几万。
5.维度模型
维度建模按数据组织类型可划分为 星型模型、雪花模型、星座模型。
1)星型模型
星型模型主要是维表和事实表,以事实表为中心,所有维度直接关联在事实表上,呈星型分布。
2)雪花模型
雪花模型,在星型模型的基础上,维度表上又关联了其他维度表。这种模型维护成本高,性能方面也较差,所以一般不建议使用。尤其是基于hadoop体系构建数仓,减少join就是减少shuffe, 性能差距会很大。
星型模型可以理解为,一个事实表关联多个维度表,雪花模型可以理解为一个事实表关联多个维度表,维度表再关联维度表。
3) 星座模型
数据仓库由多个主题构成,包含多个事实表,而维表是公共的,可以共享(例如两张事实表共用一些维
度表时,就叫做星型模型),这种模式可以看做星型模式的汇集,因而称作星系模式或者事实星座模式。
![](https://i-blog.csdnimg.cn/blog_migrate/05c142c092ec65bf9ba766a08af8b13f.png)
6.SQL常用函数
1)日期时间函数
date_format()、timestampdiff(interval,time1,time2)、datediff(end_time,start_time)、timediff(end_time,start_time)、last_day(date)、date_add()、date_sub()
2)文本处理函数
upper()、lower()、concat()、substring_index()
3)数值处理函数
round(,x)、floor()、ceiling()
4)控制函数
case
when ... then ...
end
5)窗口函数
MySQL8以上才支持
窗口函数() over(partition by ..order by.. 排序的字段.. dec/asc)
排序函数:row_number() over (partition by 分区的字段 order by 排序的字段 desc/asc……)
赋予唯一的连续位次
**rank()**over (partition by 分区的字段 order by 排序的字段 desc/asc……)
排序相同名次会重复,但会保留名次空缺,排序总数不变:1 1 3 4..可能会跳过
**dense_rank()**over (partition by 分区的字段 order by 排序的字段 desc/asc……)
若相同位次,不会跳过之后的位次。排序相同会重复,总数会减少。
前后函数:Lead(字段,N) over (partition by 分区的字段 order by 排序的字段 desc/asc)
当前行之后第N行对应的字段的值
Lag(字段,N) over (partition by 分区的字段 order by 排序的字段 desc/asc)
当前行之前第 N 行对应的字段的值
头尾函数: first_value(字段)over (partition by 分区的字段 order by 排序的字段 desc/asc)
指定字段在不同分区里的第一个字段的值
**last_value(字段)**over (partition by 分区的字段 order by 排序的字段 desc/asc)
指定字段在不同分区里的最后一个字段的值
聚类窗口函数:用法和group by函数类似
min()over() :不改变表结构的前提下,计算出最小值
max()over():不改变表结构的前提下,计算出最大值
count()over():不改变表结构的前提下,计数
sum()over():不改变表结构的前提下,求和
avg()over():不改变表结构的前提下,求平均值
7.SQL优化常用手段
避免使用select *
用union all 代替union
小表驱动大表
批量操作
多用limit
in中值太多
增量查询
高效的分页
用链接查询代替子查询
join数量不宜过多
join时需要注意
控制索引的数量
选择合理的字段类型
提升group by的效率
索引优化
引用 (28条消息) sql优化常用的几种方法_sql调优的几种方式_Java超神之路的博客-CSDN博客
8.数据倾斜问题
1)什么是数据倾斜
数据倾斜主要表现在,map/reduce程序执行时,reduce节点大部分执行完毕,但是有一个或者几个
reduce节点运行很慢,导致整个程序的处理时间很长,这是因为某—个key的条数比其他key多很多(有时是百倍或者千倍之多),这条Key所在的reduce节点所处理的数据量比其他节点就大很多,从而导致某几个节点迟迟运行不完。
2)数据倾斜的原因
一些操作:
关键词 | 情形 | 后果 |
Join | 其中一个表较小,但是key集中 | 分发到某一个或几个Reduce上的数据远高于平均值 |
大表与大表,但是分桶的判断字段0值或空值过多 | 这些空值都由一个reduce处理,非常慢 | |
group by | group by维度过小,某值的数量过多 | 处理某值的reduce非常耗时 |
Count Distinct | 某特殊值过多 | 处理此特殊值的reduce耗时 |
原因:
key分布不均匀
业务数据本身的特性
建表时考虑不周
某些SQL语句本身就有数据倾斜
3)解决方案
a)参数调节
hive.map.aggr = true
map端部分聚合,相当于Combiner
hive.groupby.skewindata=true
有数据倾斜的时候进行负载均衡,当选项设定为true, 生成的查询计划会有两个MR Job。第一个MR Job
中,Map 的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的Group By Key 有可能被分发到不同的Reduce中,从而达到负载均衡的目的;第二个MR Job再根据预处理的数据结果按照Group By Key分发到Reduce中(这个过程可以保证相同的Group By Key被分发到同一个Reduce中),最终的聚合操作。
b)SQL语句调节
如何join:
关于驱动表的选取,选用join key分布最均匀的表作为驱动表,做好列裁剪和flter操作,以达到两表做
join的时候,数据量相对变小的效果。
大小表Join:
使用map join上小的维度表(1000条以下的记录条数)先进内存。在map端完成reduce。
大表Join大表:
把空值的key变成一个字符串加上随机数,把倾斜的数据分到不同的reduce上,由于null值关联不上,处理后井不影响最终结果。
count distind大量相同特殊值:
count distnc时,特值为空的情況单独处理,如果是计算count distinct,可以不用处理,直按过滤,在最后结果中加1。如果还有其他计算,需要进行group by,可以先将值为空的记录单独处理,再和其他计算结果进行union。
group by维度过小:
采用sum0 group by的方式来替换count(distinct)完成计算。
特殊情况特殊处理:
在业务逻辑优化效果的不大情况下,有些时候是可以将倾斜的数据单独拿出来处理。最后union回去。