微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

快速了解spark

初识Spark

什么是spark

  • spark是用于大规模数据处理的计算引擎。
  • 离线spark core 、spark sql;实时数据计算spark streaming
  • 基于内存的计算引擎(速度会比MapReduce快几十倍)

spark 特点

  • 速度快(基于内存、DAG scheduler)
  • 易用性(高阶函数支持多种编程语言)
  • 通用性
  • 到处运行

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)

  1. 首先通过Spark-submit命令提交Spark任务,启动Driver进程
  2. Driver进程启动后 会进行初始化操作(sparkcontext),会找到集群master进程,进行注册
  3. master收到注册信息之后,会发送请求给worker,进行资源分配
  4. worker收到请求后,会移动Executor进行(会启动一个或多个 看具体配置)
  5. Executor启动后,会向Driver进行反注册,Driver就知道有多少Executor在服务了
  6. Driver会根据spark程序中我们对rdd的定义(DAGscheduler,TaskScheduler ),提交一堆task去Executor执行
  7. 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

  1. 未优化的 Hash Based Shuffle

    一个ShuffleMap会为每一个ResultTask创建一分Bucket缓存,以及对应ShuffleBlockFile磁盘文件。这样会禅城大量的本地磁盘文件。需要进行频繁的磁盘io。

  2. 优化后的 Hash Based Shuffle

    一个Executor中产生ResultTask数量的本地文件。只会产生 cpu核数 * ResultTask 数量文件。但是当这两个数值很大时 依旧会产生很多磁盘文件

  3. Sort-Based Shuffle

    一个ShuffleMap都只创建一个文件,并对应会生成一个索引文件

checkPoint

当我们在spark任务执行过程中有一个RDD计算步骤非常复杂,运行的时间也很长,虽然持久化到了内存,为了避免对这个RDD因为节点故障等原因导致数据结果丢失,导致还需要在重新计算,我们使用了checkpoint。实现容错高可用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐