第一章
1.spark是什么
定义:Apache Spark是用于大规模数据(large-scala data)处理的统一(unifled)分析引擎
特点:对任意数据类型的数据进行自定义计算
Spark可以计算:结构化、半结构化、非结构化等各种类型的数据结构,同时也支持使用Python、Java、Scala、R以及sql语法区开发应用程序计算数据
2.spark和Hadoop的对比
hadoop spark
类型 基础平台,包含计算,存储,调度 纯计算工具
场景 海量数据处理(磁盘迭代计算) 海量数据处理(磁盘迭代计算、交互式计算),海量数据流计算
价格 对机器需求低,便宜 堆内存有要求,较贵
编程范式 map+reduce,api较为底层,算法适应性差 RDD组成DAG邮箱无环图,api较为顶层,方便使用
数据存储结构 mapreduce中间计算结果在hdfs磁盘上,延迟大 RDD中间运算结果在内存中,延迟小
运行方式 task以进程方式维护,任务启动慢 task以线程方式维护,任务启动快,可批量创建提高并行能力
尽管spark相对于hadoop而言具有较大优势,但是spark不能完全代替Hadoop
- 在计算层面,spark相比较MR右巨大优势,但至今仍有许多计算工具基于MR构架
- spark仅作计算,而Hadoop生态圈不仅右计算(MR)还有存储(hdfs)和资源管理调度(YRAN),hdfs和yarn仍是许多大数据体系的核心架构
3.sparkde四大特点
- 速度快:比hadoop的mapreduce快100倍;spark处理数据时,可以将中间处理结果存储到内存中;spark提供了非常丰富分算子,可以做到复杂任务在一个spark程序中完成
- 易于使用
- 通用性强:spark提供了spark sql、spark streaming、mlib及graphx在内的多个工具库
- 运行方式:spark支持多种运行方式,包括Hadoop和mesos上同时也支持standalone的独立运行模式,同时也可以运行在云kubernetes上;spark支持从hdfs、hbase、cassandra、kafka等多种途径获取数据
4.spark框架模块
- spark core:spark的核心
- sparksql:结构化数据的处理
- spark streaming:流式计算功能
- mllib:机器学习
- graphx:图计算
5.spark运行模式
- 本地模式(单机):开发和测试;以一个独立的进程,通过其内部的多个线程来模拟整个spark运行时环境
- standlone模式(集群):spark中的各个角色以独立进程的形式存在,并组成spark集群环境
- Hadoop yarn模式(集群):spark中的各个角色运行在yarn的容器内部,并组成spark集群环境
- -kubernetes模式(容器集群):spark中的各个角色运行在kubernetes的容器内部,并组成spark集群环境
- -云服务器模式
6.spark的架构角色
yarn角色回顾
资源管理层面:
1.集群资源管理者(master):ResourceManager
2.单机资源管理者(worker):NodeManager
任务计算层面:
单任务管理者(master):ApplicationMaster
单任务执行者(worker):Task(容器内计算款家的角色)
spark运行角色
资源层面:
1.master角色:集群资源管理
2.worker角色:单机资源管理
任务运行层面:
1.driver:单个任务的管理
2.excutor:单个任务的计算(干活的)
特殊场景下(local模式)driver可以及管理又干活
第二章
1.local模式基本原理
- 本质:启动一个JVM Process进程(一个进程里面有多个线程),执行任务task
- local模式可以限制模拟spark集群环境的线程数量,即local[N]或local[*]
- 其中N代表可以使用N个线程,如果不指定N,默认是1个线程
- 如果是local[*], 则代表Run Spark laocally with as many worker threads as logical cores on your machine.按照cpu最多的cores设置线程数
- local下的角色分布
- 资源管理
- master:local进程本身
- worker:local进程本身
- 任务执行
- driver:local进程本身
- executor:不存在,没有独立的executor角色,由local进程内的线程提供计算能力
- local模式只能运行一个spark程序,如果执行多个spark程序,那就是多个相互独立的local进程在进行
- 资源管理
2.bin/pyspark是一个交互式的解释器执行环境,环境启动后就得到了一个local spark环境,可以运行python代码去进行spark计算,类似python自带解释器
3.spark的4040端口:spark的任务在运行后,会在driver所在机器绑定到4040端口,提供当前任务的监控页面供查看
第三章
1.standalone是一个完整的分布式集群环境;standalone集群在进程上主要有三类进程:主节点master及昵称、从节点的worker进程、历史服务器哦historyserver(可选)
2.4040:是一个运行的application在运行的过程中临时绑定的端口,用以查看当前任务的状态。4040被占用会顺延到4041、4042等。4040是一个临时端口,当程序运行完成后,4040就会被注销
3.8080:默认是standalone下,master角色的web端口,u哦那个一查看当前master的状态
4.18080:默认是历史服务器的端口,由于每个程序运行完成后,4040端口就被注销了,以后想回看某个程序的运行状态就可以通过历史服务器查看,历史服务器长期稳定运行,可供随时查看被记录的程序的运行过程
5.standalone的运行原理:master和worker角色以独立的及昵称形式存在,并组成spark运行时环境
6.spark角色在standalone中的应用
- master角色:master进程
- worker角色:worker进程
- driver角色:以线程运行在master中
- executor角色:以线程运行在worker中
7.standalone如何提交spark应用
- bin/spark-submit --master spark://server:7077
8.一个spark程序会呗分成多个子任务运行,每个job会分成多个state来运行,每一个state内会分出多个task来执行具体任务
第四章
1.standalone HA的运行原理: 为解决单点故障问题,spark由两种方案:基于文件系统的单点恢复(只能用于开发或测试环境)、基于zookeeper的standby master(可以用于生产环境);基于zookeeper做状态的维护,开启多个master进程,一个作为活跃,其他的作为备份,当活跃进程宕机,备份master进行接管
第五章
1.spark on yarn的本质
master角色由yarn的resouorcemanager担任
worker角色由yarn的nodemanager担任
driver角色运行在yarn容器内或提交任务的客户端进程
真正干活的executor运行在yarn提供的容器内
2.spark on yarn需要啥
yarn 集群环境
spark客户端工具:spark-submit
被提交的代码程序
3.spark on yarn的目的
- 提高资源利用率,在已有yarn的场景下让spark受到yarn的调度可以更好地挂空资源提高利用率并方便管理
第六章
1.框架 vs 类库
类库:一堆别人写好的代码,你可以导入进使用。pandas就是python的类库
框架:可以独立运行,并提供变成结构的一种软件产品 。spark就是一个独立的框架
pandas:用于小规模数据集的处理
spark:用于大规模数据集的处理
2.pyspark:spark官方提供的一个python类库,内置了完全的spark api,可以通过pyspark应用程序,并将其提交到saprk集群中运行
3.bin/pyspark是一个交互式程序,可以提供交互式编程并执行spark计算
第七章
1.python语言开发spark程序的步骤
- 主要是获取spark context对象,就isparkcontext对象作为执行环境入口
2.如何提交spark应用
将程序代码上传到服务器上通过spark客户端工具进行提交
注意:
1.在代码中不要设置master,如果设置一代码为准spark-submit工具的设置就无效了
2.提交程序到集群中的时候读取的文件一定是各个机器都能访问到的地址,比如hdfs
第八章
1.分布式代码执行的重要特征
代码在集群上运行,是分布式运行的
在spark中,非任务处理部分由driver执行(非rdd代码)
任务处理部分由executor执行(rdd代码)
executor的数量可以很多,所以人物的计算是分布式在运行的
2.pyspark的架构体系
python on spark driver 端由jvm执行,executor端由jvm命令转发,底层由python解释器进行工作
Spark core
第一章
1.RDD定义:弹性分布式数据集,是spark中最基本的数据抽象,代表一个不可变、可分区、里面的元素可并行计算的集合
2.RDD五大特性
- A list of partitions:RDD是有分区的
- A function for computing each split:计算方法会做用到每一个分片(分区)之上
- A list of dependencies on other RDDs:RDD之间是有相互依赖关系的
- Optionally,a pqrtitioner for key-value RDDs(e.g. to say that the RDD is hash-partitioned):kv型RDD可以有分区器
- Optionally ,a list of preferred location to compute each split on (e.g. block location for an HDFS file ):RDD分区数据的读取会尽量靠近数据所在地
3.A list of partitions:RDD是有分区的
rdd的分区时rdd数据存储的最小单位
一份rdd数据,本质上时分隔成了多个分区
4.A function for computing each split:计算方法会做用到每一个分片(分区)之上
5.Optionally,a pqrtitioner for key-value RDDs(e.g. to say that the RDD is hash-partitioned):kv型RDD可以有分区器
默认分区器:hash分区规则,可以手动设置一个分区器
key-value rdd:rdd中国存储的时二元元组,这就是key-value型rdd
二元元组:只有两个元素的元组
6.如何正确理解rdd
弹性分布式数据集,分布式计算的实现载体
第二章
1.RDD的创建
通过并行化集合创建(本地对象 转 分布式RDD)
读取外部数据源(读取文件): textfile api(可以读取本地数据)
2.算子是什么
算子:分布式集合对象上的api
方法/函数:本地对象的api
3.算子的分类
- Transformation:转换算子(返回值是rdd)
特性:这类算子时lazy、懒加载的,如果没有action算子,他是不工作的
Action:动作(行动)算子(返回值不是rdd的算子)
4.常用的transformation算子
- map算子:将rdd的数据一条条处理(处理的逻辑 基于map算子中接受的处理函数),返回新的rdd
- flatmap算子:对rdd限制性map操作,然后进行解除嵌套操作
- reducebykey算子:针对kv型rdd,自动按照可以分组,然后根据提供的聚合逻辑,完成组内数据的聚合操作
- mapvalues算子:针对二元元组rdd,对其内部的二元元组的value执行map操作
- group by算子:将rdd的数据进行分组(hash分组)
- filter算子:过滤想要的数据进行保留
- distinct算子:对rdd数据进行去重,返回新rdd
- union算子:2个rdd合并成一个rdd;不会去重;类型不同也是可以合并的
- join算子:对两个rdd执行join操作(可实现sql的内、外连接);按照二元元组的key来进行关联
- intersection算子:求2个rdd的交集,返回一个新rdd
- glom算子:将rdd的数据,加上嵌套,这个嵌套按照分区来进行
- groupbykey算子:针对kv型rdd,自动按照key分组
- sortby算子:对rdd数据进行排序,基于自定义的排序依据
- sortbykey算子:针对kv型rdd,按照key进行排序
5.常用Action算子
- countbykey算子:统计key出现的次数(一般适用于kv型rdd)
- collect算子:将rdd各个分区内的数据统一收集到driver中形成一个list对象
- reduce算子:对rdd数据集按照自定义传入的逻辑进行聚合
- fold算子:接受传入逻辑进行聚合,聚合使带有初始值的,这个初始值聚合,会作用在分区内聚合和分区间聚合
- first算子:取出rdd的第一个元素
- take算子:取rdd的前N个元素,组成list返回给你
- top算子:对rdd的数据集进行江西排序,取前n个
- takesample算子:随机抽样rdd的数据
- takeordered算子:对rdd进行排序取前n个
- foreach算子:对rdd的每一个元素,执行自定义提供的逻辑的操作,但是这个的方法没有返回值
- savetextfile算子:将rdd数据写入文本文件中,支持本地写出,hdfs等文件系统
6.分区操作算子
- mapPartitions算子:mappartitions一次被传递的是一整个分区的数据,作为一个迭代器(一次性list)对象传入过来
- foreachpartitions算子:和普通foreach一致,一次处理的是一整个分区的数据
- partitionby算子:对rdd进行自定义分区操作
- repartition算子:对rdd的分区执行重新分区(仅数量)
面试题:groupbykey和reducebykey的区别
- 功能上区别:
- groupbykey仅有分组功能而已
- reducebykey除了有bykey的分组之外,还有reduce聚合的功能,所以是一个分组+聚合一体化的算子
- reducebykey的性能是远大于groupbykey+聚合逻辑的
- reducebykey由于自带聚合逻辑,所以可以完成:现在分区内做顶聚合;然后再走分组流程;分组后在做最终聚合
7.rdd的创建方法
- 通过并行化集合的方式(本地集合转分布式集合)
- 读取数据的方式创建
8.rdd分区数查看方法
- 通过个体怒骂partitions api查看,返回值int
9.transformation和action的区别
- 转换算子的返回值100%是rdd,而action算子的返回值100%不是rdd
- 转换算子是懒加载的,只有遇到action才会执行,action就是转换算子处理链条的开关
10.fofreach和saveastextfile直接由executor执行后输出,不会将结果发送到driver上去
11.reducebykey和groupbykey的区别
- reducebykey自带聚合逻辑,groupbykey不带
- 如果做数据聚合reducebykey的效果更好,因为可以现居何后shuffle再最终聚合,传输的IO小
12.mappartition和foreach partition的区别
- mappartition带有返回值
- foreachpartition不带
13.对于分区操作尽量不要增加分区,可能破坏内训迭代的计算管道
第三章
1.rdd的数据是过程数据
rdd之间进行相互迭代计算,当执行开启后,新rdd的产生,代表老rdd的消失
rdd的数据是过程数据,只在处理的过程中存在,一旦处理完成,就不见了
这样可以最大化的利用资源
2.rdd的缓存
sparkt提供了缓存api,可以让我们通过调用api,将指定的rdd数据保留在内存或者硬盘上
缓存特点:
- 缓存技术可以将过程rdd数据,持久化保存到内存或者硬盘上,但是,这个保存再设定上认为是不安全的
- 其保留rdd之间的血缘关系
- 缓存时分散存储的
3.rdd的checkpoint
checkpoint存储rdd数据,是集中收集再各个分区数据进行存储,而缓存是分散存储
4.checkpoint和缓存的对比
- checkpoint不管分区数量多少,风险是一样的,缓存分区越多,风险越高
- checkpoint支持写入hdfs,缓存不行,hdfs是高可靠存储,checkpoint被认为是安全的
- checkpoint不支持内存,缓存可以,缓存如果写内存性能比checkpoint要好一些
- checkpoint在设计上认为是安全的,所以不保留血缘关系,而缓存因为设计上认为不安全,所以保留
第四章
1.jieba库可以对中文进行分词
2.由于yarn是集群运行,executor可以在所有服务器上执行,所以每个服务器都需要有哦jieba库提供支撑
3.如何尽量提高任务计算的资源
计算cpu核心和内存量,通过–executor-memory指定executor内存,通过–executor-cores指定executor的核心
通过—num-executors指定executor数量
第五章
1.广播变量解决了什么问题
分布式集合rdd和本地集合进行关联使用的时候,降低内存占用以及减少网络IO传输,提高性能
2.累加器解决了什么问题
分布式代码执行中,执行全局累
第六章
1.DAG:有向无环图
有向:有方向
无环:没有闭环
DAG:有方向没有形成闭环的一个执行流程图
action:执行链条的开关,返回值不是rdd算子
一个action会产生一个job(一个应用程序内的子任务),每个job会产生一个DAG图
一个action = 一个DAG = 一个JOB
一个application中,每一个job内含一个DAG,同时每一个job又是由一个action产生的
2.宽窄依赖和阶段划分
窄依赖:父rdd的一个分区,全部将数据发给子rdd的一个分区
宽依赖(shuffle):父rdd的一个分区,将数据发给子rdd的多个分区
划分依据:从后向前,遇到宽依赖就划分出一个阶段,称之为stage,在stage内部一定都是窄依赖
3.内存迭代计算
- 面试题1:saprk是怎么做内存计算的?DAG的作用?stage阶段的划分的作用
- spark会产生DAG图
- DAg图会基于分区和宽窄依赖关系划分阶段
- 一个阶段的内部都是窄依赖,窄依赖内,如果前后形成1:1的分区对应关系,就可以产生许多内存迭代计算的管道
- 这些内存迭代计算的管道,就是一个具体的执行task
- 一个task是一个具体的线程,任务泡在一个线程内,就走内存计算了
- saprk为什么比mapreduce快
- saprk的算子丰富,mapreduce算子匮乏,mapreeduce很难再一套mr中处理复杂的任务,很多的复杂任务,是需要写多个mr进行串联,多个mr串联通过磁盘交互数据
- spark可以执行内存迭代,算子之间形成DAG基于以来划分阶段后,在阶段内形成内存迭代管道,但是mr和mr之间的交互依旧是通过硬盘来交互的
4.spark并行度
推荐全局并行度;集群中的 并行度设置为cpu总核心的2~10倍;规划并行度,只看集群总cpu核数
5.spark的任务调度
sparkde任务,由driver进行调度,这个工作包含:逻辑DAG产生、分区DAg产生、task划分、将task分配给executor并监控其工作
DAG调度器:讲逻辑的dAG图进行处理,最终得到逻辑上的task划分
task调度器:基于DAG Scheduler的产出,来规划这些逻辑的task,应该放在那些无力的executor上运行,以及监控管理他们的运行
6.层次关系梳理
- 一个spark环境可以运行多个application
- 一个代码运行起来,会成为一个application
- application内部可以有多个job
- 每个job由一个action产生,并且每个job有自己的DAg执行图
- 一个job的dag图会基于宽窄依赖划分成不同的阶段
- 不同阶段内基于分区数量,形成多个并行的内存迭代管道
- 每一个内存迭代管道形成一个task
SparkSQL
第一章
1.sparksql基础入门
- sparksql:spark的一个模块,用于处理海量结构化数据
- 特点:融合性、统一数据访问、hive兼容、标准化连接、使用简单、api统一、标准化jdbc和odbc连接
2.spark和hive都是分布式sql计算引擎
3.rdd阶段,程序的执行入口对象:sparkcontext
第二章
1.datafram的组成
在结构层面:
- structtype对象描述整个datafrme的表结构
- structfield对象描述一个列的信息
在数据层面:
- row对象记录一行数据
- column对象记录一列数据并包含列的信息
2.dataframe的代码构建–基于rdd方式
- dataframe对象可以从rdd转换而来,都是分布式数据集,其实就是转换一下内部存储结构,转换为二维表的结构
- 通过structtype对象来定义dataframe的“表结构”转换rdd
- 使用rdd的todf方法转换rdd
3.dataframe的代码构建–基于pandas的dataframe
将pandas的dataframe对象,转变为分布式的sparksql dataframe对象
4.dataframe的代码构建–读取外部数据
- 通过sparksql的统一api及逆行数据读取构建dataframe
- 使用format(“json”)读取json数据
- 使用format(“csv”)读取csv数据
- 使用format(“parquet”)读取parquet数据
5.dataframe支持两种风格进行编程
- dsl风格
- dsl:领域特定语言
- 以吊椅、哦那个api的方式来处理data
- sql风格
- 使用sql语句来处理dataframe的数据
6.常用api用法
- agg:groupdata对象的api,作用是在里面可以写多个聚合
- alias:column对象的api,可以针对一个列进行改名
- withcolumnrenamed:dataframe的api,可以对df中的列进行改名,一次改一个列 ,改多个列,可以链式调用
7.sparksql数据清洗api
- 去重方法:drop duplication,其功能为:对df数据进行处理,如果重复数据多条,去第一条
8.总结
- dataframe在结构层面上由structfield组成列描述,由struvttype构造表描述。在数据层面上,column对象记录列数据,row对象记录含数据
- dataframe可以从rdd转换、pandas df转换、读取文件、读取jdbc等方法构建
- spark.read.format()和df.write.format()是dataframe读取和写出的统一化标准api
- sparksql默认在shuffle阶段200个分区,可以修改参数获得更好的性能
- drop duplication可以去冲、dropna可以删除缺失值、fillna可以填充缺失值
- sparksql支持jdbc读写,可用标准api对数据库进行读写操作
第三章
1.sparksql支持udf和duaf定义,但在python中,在那时只能定义udf
2.udf定义支持两种方式,使用sparksession对象构建;使用functions包中提供的udf api构建,要注意,方式1可用dsl和sql风格,方式二进可用dsl风格
3.sparksql支持窗口函数使用,常用sql中的窗口函数均支持,如聚合窗口、排序窗口、ntile分组窗口等
第四章
1.spark的自动优化,rdd不可以
- rdd:内涵数据类型不限格式和结构
- dataframe:100%是二维表结构,可以被针对
- sparksql的自动优化,依赖于:catalyst优化器
2.catalyst优化点
- 谓词下推、断言下推:讲逻辑判断提前到前面,以减少shuffle阶段的数据量
- 列值裁剪:将加载的列进行裁剪,尽量减少被处理数据的密度
3.sparksql的执行流程
- 提交sparksql代码
- catalyst优化
- drive执行环境入口搭建
- DAG调度器规划逻辑任务
- task调度去分配洛级人物到具体executor上工作并监控管理任务
- worker干活
4.dataframe代码在被优化,最终被转换成rdd取执行
5.spark on hive因为spark自身没有元数据管理的功能,所以使用hive的metastore服务作为元数据管理服务。计算由spark执行,执行引擎是sparksql。
spark新特性
第一章
1.sparkshuffle
map和reduce
在shuffle过程中,提供数据的称之为ma段,几首数据的称之为reduce端
在spark的两个阶段中,总是前一个阶段产生一批map提供数据,下一阶段喊声一批reduce接收数据
2.spark提供2中shuffle管理器
- hashshufflemanager
- sortshufflemanager
3.hashshufflemanager,优化前后的不同点
- 在一个executor内,不同task是共享buffer缓冲区
- 这样减少了缓冲区乃以写入磁盘的数量提高性能
4.sort shuffle manager的运行机制
- 普通运行机制
- bypass运行机制
第二章
1.自适应查询(adaptive query executio)(sparksql)(AQE)
- 动态合并shuffle partitions
- 动态调整join策略
- 动态优化倾斜join(skew joins)
2.动态分区裁剪(dynamic partition pruning)(sparksql)
3.增i强的python api:pyspark 和koalas
4.动态分区裁剪可以更好的优化运行时分区内的数据的量级,通过动态的谓词下推来获取传统的静态谓词下推无法获得的更高过滤属性,减少操作的分区数一提高性能