RDD,DataFrame,Dataset

https://blog.knoldus.com/spark-rdd-vs-dataframes/

https://blog.csdn.net/hellozhxy/article/details/82660610

https://www.cnblogs.com/lestatzhang/p/10611320.html#Spark_16

https://www.jianshu.com/p/77811ae29fdd

https://zhuanlan.zhihu.com/p/379578271

https://spark.apache.org/docs/3.2.0/sql-programming-guide.html#content

1 DataFrame 和 RDDs 应该如何选择?

DataFrame 和 RDDs 最主要的区别在于一个面向的是结构化数据,一个面向的是非结构化数据

  • 如果你的数据是结构化的 (如 RDBMS 中的数据) 或者半结构化的 (如日志),出于性能上的考虑,应优先使用 DataFrame。
  • 如果你的数据是非结构化的 (比如流媒体或者字符流),则使用 RDDs,

2 为什么出现Dataset?

1.相比DataFrame,Dataset提供了编译时类型检查,对于分布式程序来讲,提交一次作业太费劲了(要编译、打包、上传、运行),到提交到集群运行时才发现错误,实在是想骂人,这也是引入Dataset的一个重要原因。

2.RDD转换DataFrame后不可逆,但RDD转换Dataset是可逆的(这也是Dataset产生的原因)

注意:

The Dataset API is available in Scala and Java. Python does not have the support for the Dataset API. But due to Python’s dynamic nature, many of the benefits of the Dataset API are already available (i.e. you can access the field of a row by name naturally row.columnName).

数仓建模

关系建模和维度建模是两种数据仓库的建模技术。关系建模由Bill Inmon所倡导,维度建模由Ralph Kimball所倡导。目前主流为维度建模。

https://zhuanlan.zhihu.com/p/362991213

1.关系建模(范式建模)

1.1 范式

1 目的

降低数据的冗余性

2 目前业界范式

第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)、第五范式(5NF)。逐个遵循,一般要求遵循第一,第二,第三范式,也就是三范式。

https://blog.csdn.net/Dream_angel_Z/article/details/45175621

1.2 建模

1 建模

关系建模将复杂的数据抽象为两个概念——实体和关系(实体表,关系表),并使用规范化(三范式)的方式表示出来

2 特点

关系模型严格遵循第三范式(3NF),数据冗余程度低,数据的一致性容易得到保证。

由于数据分布于众多的表中,查询会相对复杂,在大数据的场景下,查询效率相对较低。

2.维度建模

https://www.jianshu.com/p/daab50a23c56

https://cloud.tencent.com/developer/article/1772027

2.1 事实表和维度表

1 事实表

存储业务事实,事实表中的每行数据代表一个业务事件(下单、支付、退款、评价等)。

事实表的特征:

​ 内容相对的窄:列数较少(主要是外键id和度量值)

​ 非常的大

​ 经常发生变化,每天会新增加很多。

分类:事务型事实表,周期型快照事实表,累积型快照事实表

2 维度表

维度表:一般是对事实的描述信息。每一张维表对应现实世界中的一个对象或者概念。 例如:用户、商品、日期、地区等。

维表的特征:

​ 维表的范围很宽(具有多个属性、列比较多)

​ 跟事实表相比,行数相对较小:通常< 10万条

​ 内容相对固定:编码表

2.2 维度模型分类

在维度建模的基础上又分为三种模型:星型模型、雪花模型、星座模型。

星座模型是多个星型模型交织

2.3 建模

1 建模

维度模型面向业务,将业务用事实表和维度表呈现出来。

步骤:

https://www.cnblogs.com/suheng01/p/13522677.html

选择业务过程→声明粒度→确认维度→确认事实

2 特点

维度模型以数据分析作为出发点,不遵循三范式,故数据存在一定的冗余。

表结构简单,故查询简单,查询效率较高。

RDD依赖关系

1 为什么要提出宽窄依赖

根据rdd的依赖关系构建dag,根据dag划分stage

2 如何区别宽窄依赖

蓝色框是rdd分区

父rdd -> 子rdd

区分宽窄依赖主要就是看父RDD数据流向,要是流向一个的话就是窄依赖,流向多个的话就是宽依赖。

3 划分stage

https://blog.csdn.net/weixin_40271036/article/details/79996516

整体思路是:从后往前推,遇到宽依赖就断开,划分为一个stage;遇到窄依赖就将这个RDD加入该stage中

4 参考

https://www.jianshu.com/p/5c2301dfa360

https://zhuanlan.zhihu.com/p/67068559

https://blog.csdn.net/m0_49834705/article/details/113111596

https://lmrzero.blog.csdn.net/article/details/106015264?spm=1001.2014.3001.5502

5 问题

为啥宽依赖有shuffle 窄依赖没有shuffle

shuffle

https://www.cnblogs.com/arachis/p/Spark_Shuffle.html

https://zhuanlan.zhihu.com/p/70331869

https://www.educba.com/spark-shuffle/

https://lmrzero.blog.csdn.net/article/details/106015264?spm=1001.2014.3001.5502

https://blog.csdn.net/zp17834994071/article/details/107887292

https://zhuanlan.zhihu.com/p/431015932

0 shuffle是什么,什么时候shuffle

what:多个partition的数据流向一个partition

when:宽依赖会有shuffle

shuffle分为两个阶段:shuffle read , shuffle write

map端-》shuffle read-》 shuffle write-》reduce端

1 mapreduce shuffle

2 spark shuffle

1 简介

2 分类

https://www.51cto.com/article/703950.html#

过去hash shuffle ,现在sort shuffle

1.Hash Shuffle

2.Sort Shuffle

1 普通机制的SortShuffleManager

2 bypass

此时task会为每个reduce端的task都创建一个临时磁盘文件,并将数据按key进行hash,然后根据key的hash值,将key写入对应的磁盘文件之中。当然,写入磁盘文件时也是先写入内存缓冲,缓冲写满之后再溢写到磁盘文件的。最后,同样会将所有临时磁盘文件都合并成一个磁盘文件,并创建一个单独的索引文件。
该过程的磁盘写机制其实跟未经优化的HashShuffleManager是一模一样的,因为都要创建数量惊人的磁盘文件,只是在最后会做一个磁盘文件的合并而已。因此少量的最终磁盘文件,也让该机制相对未经优化的HashShuffleManager来说,shuffle read的性能会更好。

3 总结

bypass与普通SortShuffleManager运行机制的不同在于:
第一,磁盘写机制不同;
第二,不会进行排序。也就是说,启用该机制的最大好处在于,shuffle write过程中,不需要进行数据的排序操作,也就节省掉了这部分的性能开销。

3 对比

https://www.zhihu.com/question/27643595

4 优化

因此在我们的开发过程中,能避免则尽可能避免使用会进行shuffle的算子,尽量使用非shuffle算子

1 shuffle算子:

https://blog.csdn.net/py_tamir/article/details/95457813

reduceByKey、join、distinct、repartition

2 非shuffle算子

map,flatMap

spark部署方式

https://blog.csdn.net/qq_37163925/article/details/106260434

https://spark.apache.org/docs/latest/cluster-overview.html

https://book.itheima.net/course/1269935677353533441/1270998166728089602/1270999667882074115

通过设置mater来选择部署方式。这是Spark程序需要连接的集群管理器所在的URL地址。如果这个属性在提交应用程序的时候没设置,程序将会通过System.getenv(“MASTER”)来获取MASTER环境变量;但是如果MASTER环境变量没有设定,那么程序将会把master的值设定为local[*]

local为单机

standalone是Spark自身实现资源调度

yarn为使用hadoop yarn来实现资源调度

1 local

本地模式就是以一个独立的进程,通过其内部的多个线程来模拟整个Spark运行时环境

local【N】:N为线程数量,通常N为cpu的core的数量

local【*】:cpu的core数量

跑local可以不依赖hadoop

https://blog.csdn.net/wangmuming/article/details/37695619

https://blog.csdn.net/bettesu/article/details/68512570

2 Standalone

https://sfzsjx.github.io/2019/08/26/spark-standalone-%E8%BF%90%E8%A1%8C%E5%8E%9F%E7%90%86

2.1 client

执行流程

  1. client 模式提交任务后,会在客户端启动Driver进程。
  2. Driver 会向Master申请启动Application启动资源。
  3. 资源申请成功后,Driver端会将task发送到worker端执行。
  4. worker端执行成功后将执行结果返回给Driver端

2.2 cluster

执行流程:

  1. 客户端使用命令spark-submit –deploy-mode cluster 后会启动spark-submit进程
  2. 此进程为Driver向Master 申请资源。
  3. Master会随机在一台Worker节点来启动Driver进程。
  4. Driver启动成功后,spark-submit关闭,然后Driver向Master申请资源。
  5. Master接收到请求后,会在资源充足的Worker节点上启动Executor进程。
  6. Driver分发Task到Executor中执行。

2.3 高可用HA

3 Mesos

a general cluster manager that can also run Hadoop MapReduce and service applications. (Deprecated)

4 YARN

为什么要YARN?

Spark On YARN是有两种运行模式的,一种是Cluster模式一种是Client模式.这两种模式的区别就是Driver运行的位置.

Cluster模式即:Driver运行在YARN容器内部, 和ApplicationMaster在同一个容器内

Client模式即:Driver运行在客户端进程中, 比如Driver运行在spark-submit程序的进程中

4.1 cluster

具体流程步骤如下:
1)、任务提交后会和ResourceManager通讯申请启动ApplicationMaster;
2)、随后ResourceManager分配Container,在合适的NodeManager上启动ApplicationMaster,此时的ApplicationMaster就是Driver;
3)、Driver启动后向ResourceManager申请Executor内存,ResourceManager接到ApplicationMaster的资源申请后会分配Container,然后在合适的NodeManager上启动Executor进程;
4)、Executor进程启动后会向Driver反向注册;
5)、Executor全部注册完成后Driver开始执行main函数,之后执行到Action算子时,触发一个job,并根据宽依赖开始划分stage,每个stage生成对应的taskSet,之后将task分发到各个Executor上执行;

4.2 client

具体流程步骤如下:
1)、Driver在任务提交的本地机器上运行,Driver启动后会和ResourceManager通讯申请启动ApplicationMaster;
2)、随后ResourceManager分配Container,在合适的NodeManager上启动ApplicationMaster,此时的ApplicationMaster的功能相当于一个ExecutorLaucher,只负责向ResourceManager申请Executor内存;
3)、ResourceManager接到ApplicationMaster的资源申请后会分配Container,然后ApplicationMaster在资源分配指定的NodeManager上启动Executor进程;
4)、Executor进程启动后会向Driver反向注册,Executor全部注册完成后Driver开始执行main函数;
5)、之后执行到Action算子时,触发一个Job,并根据宽依赖开始划分Stage,每个Stage生成对应的TaskSet,之后将Task分发到各个Executor上执行。

5 Kubernetes

an open-source system for automating deployment, scaling, and management of containerized applications.

数仓分层

https://blog.csdn.net/BeiisBei/article/details/105723188#_19

https://www.saoniuhuo.com/article/detail-72.html

https://www.dianjilingqu.com/20890.html

https://www.i4k.xyz/article/wjt199866/115184169#ODS__100

1.为什么要分层

1.清晰数据结构:每一个数据分层都有它的作用域,这样我们在使用表的时候能更方便地定位和理解。
2.数据血缘追踪:简单来讲可以这样理解,我们最终给业务呈现的是一张能直接使用的张业务表,但是它的来源有很多,如果有一张来 源表出问题了,我们希望能够快速准确地定位到问题,并清楚它的危害范围。
3.减少重复开发:规范数据分层,开发一些通用的中间层数据,能够减少极大的重复计算。
4.把复杂问题简单化:将一个复杂的任务分解成多个步骤来完成,每一层只处理单一的步骤,比较简单和容易理解。而且便于维护数据的准确性,当数据出现问题之后,可以不用修复所有的数据,只需要从有问题的步骤开始修复。
5.屏蔽原始数据的异常:屏蔽业务的影响,不必改一次业务就需要重新接入数据。

2.分层结构

2.1 ODS层

作用

https://blog.csdn.net/xuebo_911/article/details/8156016#

起到备份数据的作用

构建

1 直接加载原始日志、数据,保持原貌不做处理

2.2 DIM层

dim存放维度表,dwd存放事实表

作用

维度表可以看作是用户来分析数据的窗口,维度表中包含事实数据表中事实记录的特性,有些特性提供描述性信息,有些特性指定如何汇总事实数据表数据,以便为分析者提供有用的信息,维度表包含帮助汇总数据的特性的层次结构。

构建

https://help.aliyun.com/document_detail/137615.html

1 构建维度表,主要是对业务事实的描述信息,例如何人,何时,何地等

2.3 DWD层

作用

保存业务事实明细,一行信息代表一次业务行为,例如一次下单。

构建

1 对ODS层数据进行清洗(去除空值,脏数据,超过极限范围的数据、脱敏等)

2 构建事实表

https://help.aliyun.com/document_detail/114457.html

2.4 DWS

作用

避免重复计算

1)问题引出

两个需求,统计每个省份订单的个数、统计每个省份订单的总金额,都是将省份表和订单表进行join,group by省份,然后计算。同样数据被计算了两次,实际上类似的场景还会更多。

2) 那怎么设计能避免重复计算呢?

针对上述场景,可以设计一张地区宽表,其主键为地区ID,字段包含为:下单次数、下单金额、支付次数、支付金额等。上述所有指标都统一进行计算,并将结果保存在该宽表中,这样就能有效避免数据的重复计算。

构建

https://help.aliyun.com/document_detail/126913.html

0 分主题

1 构建宽表

2 以DWD为基础,按天进行轻度汇总。DWS层存放的所有主题对象当天的汇总行为,例如每个地区当天的下单次数,下单金额等

2.5 DWT

和DWS区别

DWS按天进行轻度汇总,DWT累积汇总

作用

避免重复计算

构建

0 分主题

1 构建宽表

2 以DWS为基础,对数据进行累积汇总。DWT层存放的是所有主题对象的累积行为,例如每个地区最近7天(15天、30天、60天)的下单次数、下单金额等

2.6 ADS层

作用

为各种统计报表提供数据

构建

1 由于这层的数据量不大,所有没有分区,列式存储,压缩

3.构建过程

借助hive,主要就是写SQL,核心步骤就是:

1.建表

2.分区规划

​ 按什么分区,比如说按天,按月

​ 注意数据同步策略,全量,增量等

3.数据装载

​ 注意首日,每日

联系业务和不同层的要求

4.全流程调度

Azkaban


:D 一言句子获取中...