初识Spark
什么是spark
- spark是用于大规模数据处理的计算引擎。
- 离线spark core 、spark sql;实时数据计算spark streaming
- 基于内存的计算引擎(速度会比MapReduce快几十倍)
spark 特点
spark对比Hadoop
- hadoop是一个平台。包含了 MapReduce(计算引擎)HDFS(存储)Yarn(资源管理)。所以从综合能力还说Hadoop更具有优势。
- 一般情况是对比Spark 和 MapReduce。同为计算引擎,基于内存的spark 要比 基于磁盘的MapReduce速度更快。
Spark工作原理
RDD
RDD是一个弹性分布式数据集,它是一个逻辑概念。通常是通过读取HDFS上文件进行创建,也可以通过程序中的集合来创建,还可以通过读取本地文件创建。
RDD特点
- 弹性:RDD默认是存放在内存中,但是内存不足时 也会溢写磁盘。
- 分布式:RDD在抽象上来说是一种元素数据集合,它是被分区的,每个分区分布在集群的不同节点上,从而实现数据的并行操作
- 容错性:RDD可以自动从节点失败中恢复。如果某个节点RDD partition 因为节点故障,导致数据丢失,RDD会自动通过自己的数据来源重新计算该partition的数据。
Transformation 和 Action
Transformation:常见算子map、flatMap、filter、groupByKey、reduceByKey、join、distinct
Action:常见算子reduce、collect、count、take(n)、saveAsTextFile、foreach
Transformation有Lazy特性,只有当Transformation算子后接着执行了Action算子,那么之前Transformation算子才会执行。
Action算子特性是会出发spark任务(job)
宽依赖和窄依赖
- 宽依赖:父RDD的每一个partition都可能会被子RDD的多个partition使用。即会产生shuffer操作
- 窄依赖:父RDD每个partition只被子RDD的一个partition使用。如map、filter。
Spark相关进程
- Driver:Spark程序在Driver上,由Driver进程执行。Driver所在的节点是Spark集群的某一个节点。可以是提交任务的节点也可以指定。
- Master:集群主节点启动的进程,负责集群资源分配和管理以及集群监控
- Worker:集群从节点启动进程,负责启动其他进程来执行具体的计算任务
- Executor:由Worker启动,负责执行数据处理和计算任务
- Task:一个线程,由Executor启动,真正的执行数据和计算任务
Spark任务执行过程(Standalone)
- 首先通过Spark-submit命令提交Spark任务,启动Driver进程
- Driver进程启动后 会进行初始化操作(sparkcontext),会找到集群master进程,进行注册
- master收到注册信息之后,会发送请求给worker,进行资源分配
- worker收到请求后,会移动Executor进行(会启动一个或多个 看具体配置)
- Executor启动后,会向Driver进行反注册,Driver就知道有多少Executor在服务了
- Driver会根据spark程序中我们对rdd的定义(DAGscheduler,TaskScheduler ),提交一堆task去Executor执行
- task里执行的就是具体的操作了
Driver初始化操作
Driver初始化的是sparkcontext,sparkcontext会构建DAGScheduler 和 TaskScheduler
- DAGscheduler:会根据action算子划分job,然后在每一个job中根据shuffer(宽依赖算子)划分出stage
- TaskScheduler :每一个stage都是一个taskset,taskScheduler会提交到相应的Executor中去执行
RDD持久化
对于RDD重复使用,每次重复使用都会重新计算一遍,浪费时间浪费资源。针对该问题可以将RDD执行持久化,每个节点都会将自己操作的RDD的partition数据持久化到内存中。在使用该RDD时直接使用内存中缓存数据即可。
cache() 和 persist()区别:cache()就是 persist()无参版本,即调用的是 persist(MEMORY_ONLY)
清除和缓存可使用 unpersist()
策略 | 介绍 |
---|---|
MEMORY_ONLY | 以非序列化的方式持久化在JVM内存中 |
MEMORY_AND_disK | 同上,但是当某些partition无法存储在内存中时,会持久化到磁盘中 |
MEMORY_ONLY_SER | 同MEMORY_ONLY,但是会序列化 |
MEMORY_AND_disK_SER | 同MEMORY_AND_DSK,但是会序列化 |
disK_ONLY | 以非序列化的方式完全存储到磁盘上 |
MEMORY_ONLY_2、MEMORY_AND_disK_2等 | 尾部加了2的持久化级别,表示会将持久化数据复制一份,保存到其他节点 |
多种持久化级别,主要是在cpu和内存消耗之间取舍。优先使用MEMORY_ONLY,纯内存速度最快。
spark shuffle
-
未优化的 Hash Based Shuffle
每一个ShuffleMap会为每一个ResultTask创建一分Bucket缓存,以及对应ShuffleBlockFile磁盘文件。这样会禅城大量的本地磁盘文件。需要进行频繁的磁盘io。
-
优化后的 Hash Based Shuffle
每一个Executor中产生ResultTask数量的本地文件。只会产生 cpu核数 * ResultTask 数量的文件。但是当这两个数值很大时 依旧会产生很多磁盘文件。
-
Sort-Based Shuffle
checkPoint
当我们在spark任务执行过程中有一个RDD计算步骤非常复杂,运行的时间也很长,虽然持久化到了内存,为了避免对这个RDD因为节点故障等原因导致数据结果丢失,导致还需要在重新计算,我们使用了checkpoint。实现容错高可用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。