SparkCore笔记

SparkCore笔记

Spark-core(核心)的基本介绍

SparkCore为Spark提供最基础最核心的功能

1.SparkContext 应用程序的入口 也就是Driver Application执行和输出都是通过SparkContext

2.存储体系 优先考虑使用各Worker的内存作为存储 实时计算流式计算等场景

3.计算引擎 由SparkContext的DAGScheduler、RDD、Exectuor等组件完成 👇Spark程序运行

4.部署模式 也就是运行模式 👇有说

例外Spark的几个子框架

1.Spark SQL

2.Spark Streaming 流式计算

3.GraphX 分布式图计算

4.MLlib 机器学习

第一天

Spark和MapReduce的对比

1.MR处理数据任务需要多个MR程序 并且要反复读取磁盘文件

Spark中处数据任务使用多个Job在内存中连续执行

2.Spark的中间结果保存在内存中 迭代效率更高

MR的中间结果需要多次落地磁盘保存 有磁盘IO操作 影响性能

3.Spark容错率高 通过弹性分布式数据集RDD实现高容错性 当出现数据丢失和计算错误 只需要在错误的地方开始

MR出现数据丢失或错误则需要重新计算

4.Spark框架更复杂 应用场景更丰富 更应用于实时(Streaming)

MR更简单 稳定性强 多引用于离线(Core/SQL)海量数据分析计算

MR的shuffle流程图

在这里插入图片描述

Spark运行模式

local本地模式 编译器完成

Standalone是Spark自带的资源调度框架,支持完全分布

Yarn Hadoop生态圈自带资源调度框架 Spark基于Yarn进行计算 Spark on yarn

Messos资源调度框架 第三方独立安装

Spark程序执行

Standalone模式 主从结构

1.Client 客户端 负责向Master提交作业

2.Master 负责接收Client提交的作业
管理Worker 并命令Worker启动Driver和Executor

3.Worker 负责节点的资源管理

​ 定期向Mater提交心跳汇报

​ 启动Driver(Executor向Driver反向注册)

​ 启动Executor

4.Driver 作业的主进程

​ 负责作业的解析 生成Stage 并调度Task到Executor上执行

​ 主要包含两个调度 DGAscheduler 和 Taskscheduler

5.Executor 真正作业执行的地方 一个集群包含多个Executor

​ 一个Executor可以执行一个到多个Task

Stage 划分作业的方式 可以推算出Task和进行shuffle流程的划分

Task Spark作业载体 通过执行多个Task对数据进行分析操作

DGAscheduler 将任务划分成一个个的Stage

Taskscheduler 用来实现Task到Executor上执行

执行流程图

在这里插入图片描述
执行流程

1.提交任务节点启动一个Driver进程

2.构建SparkContext SC分为 DGAscheduler 和Taskscheduler

3.DGAscheduler会将任务划分为一个个的stage 每个stage都会创建一个taskSet 将taskSet提交给Taskscheduler

4.Taskscheduler向Master提交Appliction注册请求

5.Master接收注册请求后 通过自身资源调度算法通知Worker创建Executor

6.Executor向Taskscheduler提交反向注册请求

7.Taskscheduler接收请求 将TaskSet中的Task提交到Executor上执行

第二天

RDD-弹性分布式数据集

RDD是不可变,可分区,里面元素可以并行计算的集合

特点 自动容错,位置感知调度,可伸缩性

RDD可以存储各种类型的数据 集合中提供各种算子对数据进行操作 返回一个全新的集合 Spark处理底层就是RDD

RDD官方说明

1.一组分片(partition): 数据集的基本组成单位

2.一个计算每个分区函数 :Spark的RDD的计算以分片为单位

3.RDD之间存在依赖关系:父RDD转换生成子RDD

4.一个partitioner 即分片函数 实现分片的两个函数

基于哈希算法 HashPartition

基于范围 RangePartition

只有KV的RDD才有partition

5.一个列表存储的都是以partition为最佳位置 概念是移动计算不移动数据

RDD的五大特征

1.RDD可以看作是一些列的partition所组成的

2.RDD之间存在依赖关系(宽依赖 部分依赖 Shuffle 窄依赖 完全依赖) 血缘关系

3.算子是作用在partition

4.partitioner(分区器)是作用在KV形式的RDD上 不是KV形式的RDD的partitioner为None

5.RDD提供一系列最佳的计算位置,Spark在集群中运行任务,会将task发送到需要读取存储数据的节点上,减少节点间数据网络传输时间,做到移动计算,不移动数据,实现了最佳计算位置

RDD弹性

1.存储的弹性:内存和磁盘

2.自动切换容错弹性:数据可以丢失

3.自动恢复计算弹性:计算出错重试机制

4.分片弹性:根据需要重新分片

创建RDD的两种方式

sc.makeRDD(1,2,3,4) sc.parallelize(1,2,3,4)

RDD编程API

RDD的两种算子 (常用的32个算子)

Transformation转换算子(lazy特性 懒加载执行) 如flatMap Mao filter

返回全新的集合

Action行动算子 如count collect foreach

返回计算的结果

转换算子懒加载特性 只是记住了需要使用的数据集 当触发行动算子 才真正的计算 可以让Spark更有效率的执行

第四天

Stage的划分

在一个job提交给Driver中的DAGscheduler分成一个或多个Stage

Stage:有两种

ShuffleMapStage 这个就是出现宽依赖shuffle划分的

ResultStage 一个job中必有着这种类型

Stage的划分关键在于 是否存在宽依赖(shuffle)

关于宽窄依赖
在这里插入图片描述
窄依赖(完全依赖)

一个父RDD的分区对应一个子RDD的分区

map,filter,union等算子

宽依赖(部分依赖)

一个父RDD的分区对应多个子RDD的分区

groupByKey,reduceByKey,sortByKey (图有两种情况 之后补充)

Job和stage和task之间的关系

Job就是提交给spark的任务 与MR中job不一样MR是Mapjob或reducejob 而Sparkjob 比如Action算子 collect 就算一个job

stage是每一个job处理过程要分为几个阶段

task是每一个job处理过程中要分为几次任务 task是任务运行的最小单位

task是在Executor中运行的

Job–>一个或多个stage–>一个或多个task

Task数量=stage数目*partition数目

Task被执行的并发度 = Executor数目 * 每个Executor核数

cache和checkpoint的区别

cache缓存将RDD计算的数据放到内存中 RDD的依赖关系存在(cache的底层实现方法persist(级别) 其内部可以调节缓存等级 cache有默认缓存等级,cache()一般在shuffle后使用 如 .reduceByKey( _ + _ ).cache() 它属于转换算子 所以触发需要Action算子)

checkpiont检查点将RDD计算的数据一般放在HDFS上 RDD依赖关系不存在(放在HDFS的原因:检查点机制是将RDD数据放在磁盘 会产生IO影响性能 RDD依赖关系不存在原因:HDFS存在副本机制,所以依赖就可以丢掉)

如果数据缓存都是手动的,则必须调用cache或checkpiont方法,而且必须使用action算子触发

cache会将依赖保存 还可以使用底层实现方法提升缓存等级

cache不会失去依赖关系建议使用,如果数据量过大则建议使用checkpiont

Spark自定义排序

Spark可以对简单数据类型进行直接排序 但复杂的则需要自定义排序

1.自定义类排序

自定义的类数据没有序列化 而从Driver到Exectuor的数据需要序列化 所以要给自定义的类实现Serializable 创建类对象取数据 sortBy(_)这是错误的 不能用下划线

2.样例类

case class 封装数据传递 还可以进行普通类的实现

case object 封装数据传递

不需要实现Serializable 不需要创建类对象取数据

所以sortBy()里面 的参数要创建类对象取数据

3.隐式转换

Ordered 对应接口comparable 需要重写compare(that:当前类类型)

Ordering对应接口comparator 需要重写compare (x:当前类类型,y:当前类类型)

this-that 当前对象-传入对象 升序 反之降序

x.object-y.object 当前对象-传入对象 升序 反之降序

如果数据类型为引用类型 则调用equals()方法比较 (题外知识点equals相同 hashcode一定相同)

Spark键值对 RDD数据分区

–未完ing

SparkWordCount 上传集群

${SPARK_HOME}/bin/spark-submit \
--class com.dj.SparkWordCount \
--master spark://master:7077 \
--executor-memory 512m \
--total-executor-cores 1 \
/home/hadoop/jar/original-Spark_1904-1.0-SNAPSHOT.jar \
/home/hadoop/file.txt /home/hadoop/output1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值