大数据之Spark

举报
星辰大海眺望远方 发表于 2019/01/14 22:55:29 2019/01/14
【摘要】 Spark

Spark应用流程

1.Client启动一个应用,在Client模下,Client会在进程内启动Driver 

2.Driver向ResourceManager申请AM 

3.ResourceManager启动AM

4.AM向ResourceManager申请Container

5.Resource启动Container(Executor)

6.Executor向Driver注册

7.Driver向Executor分配Task并监控Task执行结果

Spark的核心概念——RDD

RDD(Resilient Distributed Datasets)即弹性分布数据集,指的是一个只读的,可分区的分布式数据集。这个数据集的全部或部分可以缓存在内存,在多次计算之间重用。

RDD的生成

  • 从Hadoop文件系统(或与Hadoop兼容的其它存储系统)输入创建(如HDFS)。  

  • 从父RDD转换得到新的RDD。


RDD的存储和分区

  • 用户可以选择不同的存储级别存储RDD以便重用(11种)。

  •  当前RDD默认存储于内存,但当内存不足时,RDD会溢出到磁盘中。  RDD在需要进行分区时会根据每条记录Key进行分区,以此保证两个数据集能高效进行Join操作

RDD的优点

  • RDD是只读的,可提供更高的容错能力。  

  • RDD的不可变性,可以实现Hadoop MapReduce的推测式执行。  

  • RDD的数据分区特性,可以通过数据的本地性来提高性能。  

  • RDD都是可序列化的,在内存不足时可自动降级为磁盘存储。

RDD的特点

  • 失败自动重建。  

  • 可以控制存储级别(内存,磁盘等)来进行重用。  

  • 是静态类型的。

RDD算子:Transformation和Action

  1. Transformation

    返回值还是一个RDD,如map、filter、join等。Transformation都是Lazy的,代码调用到Transformation的时候,并不会马上执行,需要等到有Action操作的时候才会启动真正的计算过程。

  2. Action

    countcollectsave等,Action操作是返回结果或者将结果写入存储的操作。ActionSpark应用真正执行的触发动作。


Spark的核心概念——宽依赖和窄依赖


  • 窄依赖(Narrow)指父RDD的每一个分区最多被一个子RDD的分区所用。


  • 宽依赖(Wide)指子RDD的分区依赖于父RDD的所有分区,是Stage划分的依据。


  • 窄依赖对优化很有利。逻辑上,每个RDD的算子都是一个fork/join(此join非join算子,而是指同步多个并行任务的barrier);把计算fork到每个分区,算完后join,然后下一个fork/join。如果直接转换到物理实现,是很不经济的:一是每一个RDD(即使是中间结果)都需要物化到内存或存储中,费时费空间;二是join作为全局的barrier,是很昂贵的,会被最慢的那个节点拖死。如果子RDD的分区到父RDD的分区是窄依赖,就可以把两个fork/join合为一个;如果连续的变换算子序列都是窄依赖,就可以把很多个fork/join并为一个,不但减少了大量的全局barrier,而且无需物化很多中间结果RDD,这将极大地提升性能。Spark把这个叫做pipeline优化。  


  • 窄依赖的优势:首先,narrow dependencies可以支持在同一个cluster node上以管道形式执行多条命令,例如在执行了map后,紧接着执行filter;其次,则是从失败恢复的角度考虑。narrow dependencies的失败恢复更有效,因为它只需要重新计算丢失的parent partition即可,而且可以并行地在不同节点进行重计算。  


  • Stage划分:stage的划分是Spark作业调度的关键一步,它基于DAG确定依赖关系,借此来划分stage,将依赖链断开,每个stage内部可以并行运行,整个作业按照stage顺序依次执行,最终完成整个Job。实际应用提交的Job中RDD依赖关系是十分复杂的,依据这些依赖关系来划分stage自然是十分困难的,Spark此时就利用了前文提到的依赖关系,调度器从DAG图末端出发,逆向遍历整个依赖关系链,遇到ShuffleDependency(宽依赖关系的一种叫法)就断开,遇到NarrowDependency就将其加入到当前stage。stage中task数目由stage末端的RDD分区个数来决定,RDD转换是基于分区的一种粗粒度计算,一个stage执行的结果就是这几个分区构成的RDD。



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。