2023.3.21记录:文献阅读&欢聚集团数开面经

本文介绍了阿里巴巴的开源数据同步工具DataX,其设计原理和运行流程,以及与Sqoop的对比。同时,详细阐述了HDFS的架构和使用场景,以及在Hadoop、Hive、Spark之间的关系。文章还讨论了数据仓库的分层设计和维度建模,包括星型、雪花和星座模型。此外,提到了SQL的常用函数和优化技巧,并探讨了数据倾斜问题及其解决方案。
摘要由CSDN通过智能技术生成

一.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插件,纳入到整个同步框架中。

4)运行流程

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、DataNodeSecondaryNameNode

①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) 星座模型

数据仓库由多个主题构成,包含多个事实表,而维表是公共的,可以共享(例如两张事实表共用一些维

度表时,就叫做星型模型),这种模式可以看做星型模式的汇集,因而称作星系模式或者事实星座模式。

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优化常用手段

  1. 避免使用select *

  1. 用union all 代替union

  1. 小表驱动大表

  1. 批量操作

  1. 多用limit

  1. in中值太多

  1. 增量查询

  1. 高效的分页

  1. 用链接查询代替子查询

  1. join数量不宜过多

  1. join时需要注意

  1. 控制索引的数量

  1. 选择合理的字段类型

  1. 提升group by的效率

  1. 索引优化

引用 (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回去。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值